1

我是野牛新手,如果您能帮助我,我有一些基本问题:

  1. 以下哪一项是正确的:

    %left ’*’ ’/’
    

    或者

    %left '*' '/'
    

    这意味着我没有获取令牌,而是使用它在解析器文件中定义它

  2. 我可以定义这样的规则:

    EXP -> EXP "and" EXP 
    

    代替

    EXP -> EXP AND EXP //AND here is a token
    
  3. 如果我有用于构建解析器的 LEX 和 BISON 文件,哪个应该包含另一个,如果我使用了一个公共头文件,应该在其中一个文件中定义文件?

  4. 如果 BISON 算法根据其中一条规则找到匹配项,首先会发生什么,它会进行 reduce,然后执行为匹配的规则定义的操作,或者首先执行操作,然后将 reduce 放入堆栈?

4

2 回答 2

2
  1. 由于您的格式,很难说出您在问什么,但认为答案是否定的。 %left只定义一个令牌(完全一样%token),另外设置该令牌的优先级。您仍然必须通过在词法分析器中识别它并返回适当的令牌值来“获取”令牌。

  2. 虽然您可以使用"and",但您不想这样做,因为它几乎不可能正确。AND使用或and(无引号)要好得多。#define不同之处在于,使用引号会创建一个不会在文件中输出为 a 的标记.tab.h,因此没有简单的方法可以在您的词法分析器中生成该标记。

  3. 有很多方法可以做到这一点。最简单的方法是不包含另一个并且让 lex 文件包含由野牛-d标志生成的标头 - 这是大多数示例所做的。也可以直接将文件包含在lex.yy.c文件的第三部分.y或包含.tab.c在文件的顶部.l(但不能同时包含两者!)在这种情况下,您只会编译一个文件。

  4. 它首先执行规则的操作(因此在执行操作时 RHS 上的项目的值可用),然后进行堆栈缩减,用操作 put int 的值替换 RHS 项目$$

于 2012-12-09T20:05:47.900 回答
1

我在第 2 点上有点不同意 Chris。最好使用它,"and"因为在错误消息中解析器将报告关于"and"而不是关于TOK_ANDt_AND肯定对用户没有意义的事情。

把它做好并不难:只要你插入

%token TOK_AND "and"

在某处,您可以使用其中一个"and"TOK_AND在语法文件中使用。但是,恕我直言,前者更清楚。

于 2012-12-10T08:02:37.140 回答