我用flex / bison创建了一个自定义编译器,我有一个TokenTypes.h文件,我在其中定义了所有的令牌类型代码。我通过程序广泛使用这些代码,所以我认为最好自己定义它们并保持对它们的控制,而不是让野牛去做。 TokenTypes.h看起来像这样:
#define TokenType_INT 1
#define TokenType_PLUS 2
//...
我的问题是我还没弄明白如何告诉野牛使用这些数字代码。我在文档中读到我可以用字面指定它们:
%token INTEGER 1
但是我不想在这里再次对数字进行硬编码(在这个例子中为1),因为它是在TokenTypes.h中定义的,我希望我不必在2个地方重复和维护所有定义。
我尝试在我的%令牌声明中使用#define'd键TokenType_INT而不是其值(1),但这使得bison失败了:
In file included from ../data/syntax.y:11:0,
from ../src/Compiler.c:15:
../src/parser/../lexer/TokenTypes.h:3:31: error: expected identifier before numeric constant
#define TokenType_INT 1
^
../src/parser/autoGenerated.Syntax.h:73:5: note: in expansion of macro ‘TokenType_INT’
TokenType_INT = 259,
^~~~~~~~~~~~~~~~
In file included from ../data/lex.l:12:0:
../src/lexer/TokenTypes.h:3:31: error: expected identifier before numeric constant
#define TokenType_INT 1
编辑:对于任何可能遇到与我相同问题的人: 正如我的帖子上的评论已经提出的那样,这在Bison中是不可能的,也是不可取的,所以我会放弃这个想法,让野牛定义价值观。