共同的令牌为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值 - 将符号名称获取到调试器的符号表中(一个非常好的主意!)。

链接地址: http://www.djcxy.com/p/41735.html

上一篇: Common tokens for flex and bison

下一篇: Advantages of Antlr (versus say, lex/yacc/bison)