3.5 Скрытие информации |
Предыдущая Содержание Следующая |
Применяя то, что мы узнали ранее, не раскрываем структуру узла вообще. Вместо этого помещаем некоторые декларации в заголовочный файл value.h:
const void * Add; ...
void * new (const void * type, ...); void process (const void * tree); void delete (void * tree);
Теперь можем написать код sum() следующим образом:
#include "value.h"
static void * sum (void) { void * result = product(); const void * type;
for (;;) { switch (token) { case ’+’: type = Add; break; case ’-’: type = Sub; break; default: return result; } scan(0); result = new(type, result, product()); } }
product() имеет ту же архитектуру, что и sum() и вызывает функцию factor() для распознавания чисел, знаков и сумм, заключённых в скобки:
static void * sum (void);
static void * factor (void) { void * result;
switch (token) { case ’+’: scan(0); return factor(); case ’-’: scan(0); return new(Minus, factor()); default: error("bad factor: ’%c’ 0x%x", token, token); case NUMBER: result = new(Value, number); break; case ’(’: scan(0); result = sum(); if (token != ’)’) error("expecting )"); } scan(0); return result; }
Чтобы поддерживать правильную работу сканера, надо быть очень осторожными, особенно в factor(): token всегда должен содержать следующий входной символ. Как только token обработан, надо вызывать scan(0).
|
Предыдущая Содержание Следующая |