3.5 Скрытие информации

Предыдущая  Содержание  Следующая V*D*V

Применяя то, что мы узнали ранее, не раскрываем структуру узла вообще. Вместо этого помещаем некоторые декларации в заголовочный файл 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).

 

Предыдущая  Содержание  Следующая