С для профессиональных программистов



         

Синтаксический анализатор выражений


Полный простой синтаксический анализатор рекурсивного спуска для целых числовых выражений включает в себя ряд функций. Вы должны взять тексты этих функций и сохранить их в своем файле (когда тексты анализатора и интерпретатора объединятся получится довольно большой файл, поэтому рекомендуется откомпилировать файлы отдельно). Смысл использования глобальных переменных будет кратко описан, в процессе обсуждения интерпретатора.

Исходный текст простейшего синтаксического анализатора рекурсивного спуска для целочисленных выражений приведен ниже.

/* Синтаксический анализатор рекурсивного спуска

для целочисленных выражений, который содержит

ряд включаемых переменных

*/

#include         "setjmp.h"

#include         "math.h"

#include         "ctype.h"

#include         "stdlib.h"

#define           DELIMITER 1

#define           VARIABLE  2

#define           NUMBER    3

#define           COMMAND   4

#define           STRING    5

#define           QUOTE     6

#define           EOL       9

#define           FINISHED  10

extern char *prog;  /* буфер анализируемого выражения */

extern jmp_buf e_buf; /* буфер среды функции longjmp() */

extern int variables[26]; /* переменные */

extern struct commands

char command[20];

char tok;

 table[];

extern char token[80]; /* внешнее представление лексемы */

extern char token_type; /* тип лексемы */

extern char tok; /* внутреннее представление лексемы */

void get_exp(),level2(),level3(),level4(),level5();

void level6(),primitive(),arith(),unary();

void serror(), putback();

/* Точка входа в анализатор. */

void get_exp(result)

int *result;

get_token();

if(!*token)

serror(2);

return;

level2(result);

putback(); /* возвращает последнюю считаную

лексему обратно во входной поток */

/* Сложение или вычитание двух термов */

void level2(result)

int *result;

register char op;

int hold;

level3(result);

while((op=*token) == '+' || op == '-')

get_token();




Содержание  Назад  Вперед