gpt4 book ai didi

java - 转移/减少 Java Cup 中的冲突

转载 作者:行者123 更新时间:2023-11-30 02:44:47 26 4
gpt4 key购买 nike

我收到以下错误:

Warning : *** Shift/Reduce conflict found in state #2
between ExitLoopStatement ::= EXITLOOP (*)
and VarAccess ::= (*) DOLLAR IDENTIFIER
under symbol DOLLAR

这是我使用的语法。目前我有赋值和中断(每个中断语句可以指定要退出的循环级别数)。

start with StatementList;

StatementList
::= Statement
|
StatementList Statement
;

Statement
::= AssignmentStatement
|
ExitLoopStatement
;

AssignmentStatement
::= VarAccess EQ_OP VarAccess
;

VarAccess
::= DOLLAR IDENTIFIER
;

ExitLoopStatement
::= EXITLOOP
|
EXITLOOP VarAccess
;

据我了解,问题是在遇到 EXITLOOP 后,下一个标记可以是赋值的开始或退出的级别数。

有什么办法可以解决这个问题吗?

谢谢!

最佳答案

实际上,如果您的语言允许一个语句有选择地以可能开始另一个语句的内容结尾,并且该语言不需要在语句之间使用显式标点符号,那么您将无法使用有限的先行解析器来解析它。

在这个极其简单的情况下,您可以使用 LR(3) 解析器解析您的语言,这意味着 LR(1) 语法存在(尽管它的可读性不是很好)。然而,当您向该语言添加更多语法时,您可能会发现所需的前瞻开始增加,甚至变得无限制。 (例如,如果您实现数组并允许下标为任意表达式,就会发生这种情况。)

只要语言实际上没有歧义,您仍然可以使用 GLR 解析器来解析它。不幸的是,CUP 不提供这个选项,我也不确定 bison 的 Java 框架是否允许。

总的来说,最简单的解决方案是坚持使用语句分隔符/终止符(如 Java 中的 ;)或删除可能与语句开头混淆的可选尾随语法。例如,如果您将 exit $x 更改为 exit ($x) 并且不允许语句以 ( 开头,那么您将不会存在解析冲突。

关于java - 转移/减少 Java Cup 中的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40508081/

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