共同的令牌为flex和野牛
我有一个文件声明了我的标记declarations.h:
#define ID 257
#define NUM 258
...
在我的flex代码中,我返回了其中一个值或符号(例如'+',' - ','*')。 一切正常。
野牛档案中的问题。 如果我写这样的话:exp:ID'+'ID我会得到错误,因为野牛不知道关于ID的任何信息。 添加行%token ID将无济于事,因为在这种情况下,我将出现编译错误(预处理器将ID更改为257,我将得到257 = 257)
你得到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; }
[ tn] { /* 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
$
MacOS X 10.7.2上的Bison 2.4.3将令牌编号作为enum
生成,而不是一系列#define
值 - 将符号名称获取到调试器的符号表中(一个非常好的主意!)。