Часть полного текста документа: Системное программное обеспечение ЭВМ          Разработка интерпретатора          1. Общее описание.          Данный интерпретатор реализует основных арифметических действия в виде инфиксных операций над числами с плавающей точкой. Например входной поток имеет вид:          r=2.5     area=pi*r*r          (здесь pi имеет предопределенное значение). Тогда программа калькулятора выдаст:          2.5     19.635          Результат вычислений для первой входной строки равен 2.5, а результат для второй строки - это 19.635. Программа интерпретатора состоит из четырех основных частей: анализатора, функции ввода, таблицы имен и драйвера.      Анализатор проводит синтаксический анализ, функция ввода обрабатывает входные данные и проводит лексический анализ, таблица имен хранит постоянную информацию, нужную для работы, а драйвер выполняет инициализацию, вывод результатов и обработку ошибок.          2. Анализатор.          Грамматика языка калькулятора определяется следующими правилами:          программа:     END // END - это конец ввода     список-выражений END          список-выражений:     выражение PRINT // PRINT - это '\n' или ';'     выражение PRINT список-выражений          выражение:     выражение + терм     выражение - терм     терм          терм:     терм / первичное     терм * первичное     первичное          первичное:     NUMBER // число с плавающей запятой в С++     NAME // имя в языке С++ за исключением '_'     NAME = выражение     - первичное     ( выражение )          Иными словами, программа есть последовательность строк, а каждая строка содержит одно или несколько выражений, разделенных точкой с запятой. Основные элементы выражения - это числа, имена и операции *, /, +, - (унарный и бинарный минус) и =. Имена необязательно описывать до использования.     Для синтаксического анализа используется метод, обычно называемый рекурсивным спуском. Это распространенный и достаточно очевидный метод. В таких языках как С++, то есть в которых операция вызова не сопряжена с большими накладными расходами, это метод эффективен. Для каждого правила грамматики имеется своя функция, которая вызывает другие функции. Терминальные символы (например, END, NUMBER, + и -) распознаются лексическим анализатором get_token(). Нетерминальные символы распознаются функциями синтаксического анализатора expr(), term() и prim(). Как только оба операнда выражения или подвыражения стали известны, оно вычисляется. В настоящем трансляторе в этот момент создаются команды, вычисляющие выражение.     Анализатор использует для ввода функцию get_token(). Значение последнего вызова get_token() хранится в глобальной переменной curr_tok. Переменная curr_tok принимает значения элементов перечисления token_value:          enum token_value {     NAME, NUMBER, END,     PLUS='+', MINUS='-', MUL='*', DIV='/',     PRINT=';', ASSIGN='=', LP='(', RP=')'     };     token_value curr_tok;          Для всех функций анализатора предполагается, что get_token() уже была вызвана, и поэтому в curr_tok хранится следующая лексема, подлежащая анализу.  ............   |