BISON中用于解析的基本问题

时间:2012-12-09 19:25:46

标签: parsing bison

我是野牛的新手,如果你可以帮助我,我有一些基本的问题:

  1. 以下是哪一个:

    %left ’*’ ’/’
    

    %left '*' '/'
    

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

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

    EXP -> EXP "and" EXP 
    

    而不是

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

  4. 如果BISON算法根据其中一个规则找到匹配,首先它会发生减少,然后它会为匹配的规则定义动作,或者首先执行动作,然后减少到堆栈

2 个答案:

答案 0 :(得分:2)

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

  2. 虽然您可以使用"and",但您不希望因为它几乎不可能正确使用。使用ANDand(没有引号)要好得多。不同之处在于使用引号会在#define文件中创建一个不作为.tab.h输出的标记,因此在词法分析器中生成该标记并不容易。

  3. 有很多方法可以做到这一点。最简单的方法是既不包含另一个,又让lex文件包含由bison的-d标志生成的标题 - 这就是大多数示例所做的。也可以直接在lex.yy.c文件的第3部分中包含.y文件,或在.tab.c文件的顶部包含.l(但不能同时包含$$文件!)在这种情况下,你只会编译一个文件。

  4. 它首先执行规则的操作(因此在执行操作时RHS上的项的值可用),然后执行堆栈缩减,将RHS项替换为操作放置的值int {{1}}。

答案 1 :(得分:1)

我在第2点对Chris有点不同意。最好使用"and",因为在错误消息中,解析器将报告有关"and"的内容,而不是TOK_AND或{{1这肯定对用户没有意义。

如果你插入了

,那就没那么难了
t_AND

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