Общие жетоны для флекса и бизона - PullRequest
4 голосов
/ 04 декабря 2011

У меня есть один файл с объявлениями моих токенов объявлений. Ч:

#define ID 257
#define NUM 258
...

В моем гибком коде я возвращаю одно из этих значений или символов (например, '+', '-', '*'). И все работает.

Проблема в файле зубров. Если я напишу что-то подобное: exp: ID '+' ID я получу ошибку, потому что бизон ничего не знает об ID. Добавление идентификатора токена строки% не поможет, потому что в этом случае у меня будет ошибка компиляции (препроцессор изменит идентификатор на 257, и я получу 257 = 257)

1 Ответ

7 голосов
/ 04 декабря 2011

Вы получаете Bison для создания списка токенов; Ваш лексер использует список, сгенерированный Bison.

bison -d grammar.y
# Generates grammar.tab.c and grammar.tab.h

Ваш лексер тогда использует grammar.tab.h:

$ cat grammar.y
%token ID
%%
program:    /* Nothing */
    |       program ID
    ;
%%
$ cat lexer.l
%{
#include "grammar.tab.h"
%}
%%
[a-zA-Z][A-Za-z_0-9]+   { return ID; }
[ \t\n]                 { /* Nothing */ }
.                       { return *yytext; }
%%
$ bison -d grammar.y
$ flex lexer.l
$ gcc -o testgrammar grammar.tab.c lex.yy.c -ly -lfl
$ ./testgrammar
id est
quod erat demonstrandum
$ 

Bison 2.4.3 на MacOS X 10.7.2 генерирует номера токенов как enum, а не как последовательность значений #define - чтобы получить имена токенов в таблицу символов для отладчиков (очень хорошая идея! ).

...