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

5.2 Использование переменных

5.2 Использование переменных

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

Переменная принимает участие в двух операциях: её значение используется в качестве операнда в выражении, или ей  присваивается значение выражения. Первая операция представляет собой простое расширение компонента factor() распознавателя, показанного в разделе 3.5.

 

static void * factor (void) {

    void * result;

    ...

    switch (token) {

    case VAR:

        result = symbol;

        break;

    ...

 

VAR представляет собой уникальное значение, которое screen() помещает в token, когда найден подходящий идентификатор. Дополнительная информация о идентификаторе помещается в глобальную переменную symbol. В этом случае символ содержит узел для представления переменной, подобно листу в дереве выражений. screen() либо находит переменную в таблице символов, либо использует для его создания описание Var.

Распознавание присвоения несколько сложнее. Наш калькулятор будет удобен в использовании, если мы допустим два вида операторов со следующим синтаксисом:

 

asgn : sum

     | VAR = asgn

 

К сожалению, VAR может также появиться в левой части суммы, то есть не сразу понятно, как нашей техникой рекурсивного спуска распознать встроенный в C стиль присваивания. (* Существует трюк: просто выполнять проверку для суммы. Если при возвращении следующий входной символ это =, сумма должна быть листовым узлом для переменной и можно построить присвоение.) Поскольку вообще-то мы хотим узнать, как иметь дело с ключевыми словами, то соглашаемся со следующей грамматикой:

 

stmt : sum

     | LET VAR = sum

 

Это переводится в следующую функцию:

 

static void * stmt (void) {

    void * result;

 

    switch (token) {

    case LET:

        if (scan(0) != VAR)

            error("bad assignment");

        result = symbol;

        if (scan(0) != ’=’)

            error("expecting =");

        scan(0);

        return new(Assign, result, sum());

    default:

        return sum();

    }

}

 

В основной программе вместо sum() вызываем stmt() и наша распознаватель готов обрабатывать переменные. Assign — это новое описание типа для узла, который вычисляет значение суммы и присваивает его переменной.

 

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