2011-12-04 66 views
4

通用令牌我有一个文件,我的令牌声明declarations.h:Flex和野牛

#define ID 257 
#define NUM 258 
... 

在我的Flex代码我返回该值或标志之一(如“+”,“ - ','*')。一切正常。

在野牛文件中的问题。 如果我写这样的东西: exp:ID'+'ID 我会得到错误,因为野牛不知道任何关于ID。 添加一行%令牌ID也无济于事,因为在这种情况下,我必须编译错误(预处理将257更改ID,我会得到257 = 257)

回答

7

你得到野牛创建凭证清单;你的词法分析器使用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 
$ 

野牛2.4.3在MacOS X 10.7.2生成令牌数为enum,而不是一系列#define值 - 获得令牌。名字到调试器的符号表中(一个非常好的主意!)。

+1

谢谢这帮了我 – kobra