gpt4 book ai didi

c++ - 如果两个规则匹配,如何让 Bison 使用规则?

转载 作者:太空宇宙 更新时间:2023-11-04 06:28:09 24 4
gpt4 key购买 nike

有两条规则可以匹配一个字符串,但是如果两条规则都可以解析这个字符串,我需要使用第一条!

具体来说,我正在为类似 C++ 的语言编写 bison 解析器,问题是当我使用像这样的指针声明时

ClassName* a;

bison 将其解析为乘法运算符,而不是减速!我需要将声明节点的优先级设置为高于乘法(表达式)。

最佳答案

在 yacc 样式的 LALR(1) 中处理此问题的通常方法是让词法分析器通过在当前符号表中查找标识符并返回类型名称的不同标记来确定标识符何时是类型名称。所以你最终得到这样的规则:

declaration: decl_specs declarator_list ;
decl_specs: TYPE_NAME | ....
declarator: ID | TYPE_NAME | '*' declarator ...
expression: ID | expression '*' expression | ...

由于您不能将已声明为类型名称的名称用作表达式中的值,因此这对于解析 C 来说非常有效。

当尝试解析 C++ 时,这并不能很好地工作,因为您有明确的命名空间操作(使用 ::)并且因为您可以有看起来像函数调用的声明。通常,在 C++ 中,您将需要 1 个以上的先行标记来解决其中的一些问题,因此 LALR(1) 解析器不能很好地工作。

对于 bison,您可以使用 %glr-parser 选项生成 GLR 解析器而不是 LALR 解析器。 GLR 解析器本质上是无限前瞻的(在存在冲突时尝试所有可能性),这会导致多次解析。您需要在规则上放置 %dprec 修饰符来解决有利于一个解析器或另一个的歧义,或者 %merge 指令来保留两个解析器。

关于c++ - 如果两个规则匹配,如何让 Bison 使用规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23529298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com