我是野牛的新手,如果你可以帮助我,我有一些基本的问题:
以下是哪一个:
%left ’*’ ’/’
或
%left '*' '/'
这意味着我没有获取令牌,而是使用它在解析器文件中定义它
我可以定义这样的规则:
EXP -> EXP "and" EXP
而不是
EXP -> EXP AND EXP //AND here is a token
如果我有LEX和BISON文件用于构建解析器,其中一个应该包含另一个和if 我使用了一个公共头文件,其中一个应该定义文件?
如果BISON算法根据其中一个规则找到匹配,首先它会发生减少,然后它会为匹配的规则定义动作,或者首先执行动作,然后减少到堆栈
答案 0 :(得分:2)
由于你的格式很难说出你在问什么,但认为答案是否定的。 %left
只定义一个令牌(与%token
完全相同),另外设置该令牌的优先级。您仍然必须通过在词法分析器中识别它并返回相应的标记值来“获取”该标记。
虽然您可以使用"and"
,但您不希望因为它几乎不可能正确使用。使用AND
或and
(没有引号)要好得多。不同之处在于使用引号会在#define
文件中创建一个不作为.tab.h
输出的标记,因此在词法分析器中生成该标记并不容易。
有很多方法可以做到这一点。最简单的方法是既不包含另一个,又让lex文件包含由bison的-d
标志生成的标题 - 这就是大多数示例所做的。也可以直接在lex.yy.c
文件的第3部分中包含.y
文件,或在.tab.c
文件的顶部包含.l
(但不能同时包含$$
文件!)在这种情况下,你只会编译一个文件。
它首先执行规则的操作(因此在执行操作时RHS上的项的值可用),然后执行堆栈缩减,将RHS项替换为操作放置的值int {{1}}。
答案 1 :(得分:1)
我在第2点对Chris有点不同意。最好使用"and"
,因为在错误消息中,解析器将报告有关"and"
的内容,而不是TOK_AND
或{{1这肯定对用户没有意义。
如果你插入了
,那就没那么难了t_AND
在某处,您可以在语法文件中使用%token TOK_AND "and"
或"and"
。但是,恕我直言,前者更清楚。