The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

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

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).

 

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