【问题标题】:basic questions in BISON for parsingBISON中用于解析的基本问题
【发布时间】:2012-12-09 19:25:45
【问题描述】:

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

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

    %left ’*’ ’/’
    

    %left '*' '/'
    

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

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

    EXP -> EXP "and" EXP 
    

    而不是

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

  4. 如果 BISON 算法根据其中一条规则找到了匹配项?

【问题讨论】:

    标签: parsing bison


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

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

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

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

    【讨论】:

    • 现在我已经尝试过格式化问题,但我认为第一季度的问题是使用 ASCII 单引号 U+0027 APOSTROPHE (') vs Unicode (UTF-8) U+2019 右单引号 () — 或 U_2018 左单引号 ()。我相信,答案是 Lex/Flex 和 Bison 都希望使用撇号而不是单引号。
    • 感谢您的帮助,但如果我使用另外 2 个文件 .c 和 .h 来为 .y 文件中的操作定义外部函数,在 .h函数的声明和实现在 .c
    【解决方案2】:

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

    而且要做到正确并不难:只要你插入了

    %token TOK_AND "and"
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多