问题标签 [shift-reduce-conflict]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
parsing - 移位/减少具有 n 元和/积的算术表达式语法中的冲突
解析二进制和/产品很容易,但我在定义解析的语法时遇到了麻烦
作为
我最初的(天真的)尝试产生了 61 次换档/减少冲突。
我正在使用 java cup(但我想任何其他解析器生成器的解决方案都可以轻松翻译)。
grammar - 如何解决班次/减少冲突?
我正在使用 CUP 创建我的论文所需的解析器。我的语法有移位/减少冲突。我有这个生产规则:
我有这个警告:
现在,我实际上希望它改变,所以我很好,但我的教授告诉我要找到解决冲突的方法。我瞎了。我一直在阅读有关 if/else 冲突的信息,但对我而言,情况似乎并非如此。你能帮助我吗?
PS:IDENTIFIER、LPAREN "(" 和 RPAREN ")" 是终端,parlist 和 command 不是。
shift-reduce-conflict - 移位/减少与 SableCC 的冲突
我第一次体验 SableCC 和语法定义。我有以下语法(其中一部分):
我有以下错误:
我通过将 l_par 和 r_par 添加到所有替代方案来解决它们,顺便说一下,这应该增加可读性,但是有没有办法以优雅的方式做到这一点?
谢谢。
parsing - 简单语法的 Bison Shift/Reduce 冲突
我正在为我设计的一种语言构建一个解析器,其中类型名称以大写字母开头,变量名称以小写字母开头,这样词法分析器就可以区分并提供不同的标记。此外,词法分析器(它是一种 OOP 语言)可以识别字符串“this”并作为单独的标记传递。最后,数据成员只能在 'this' 对象上访问,所以我这样构建了语法:
Expression 的第一条规则允许用户将“this”作为值传递(例如,从方法返回它或传递给方法调用)。第二个是用于访问“this”上的数据。第三条规则用于调用方法,但是我删除了括号和参数,因为它们与问题无关。最初的语法显然比这大得多,但是这是产生相同错误的最小部分(1 Shift/Reduce 冲突) - 我将其隔离到自己的解析器文件中并验证了这一点,因此错误与任何错误无关其他符号。
据我所知,这里给出的语法是明确的,因此不应该产生任何错误。如果您删除三个规则中的任何一个或将第二个规则更改为
没有冲突。无论如何,我可能需要有人明确说明为什么会发生这种冲突以及如何解决它。
compiler-construction - 如何解决移位减少我的语法冲突?
我正在编写一个从(简化的)Pascal 到 ARM asm 的编译器。我正处于该过程的第二步 - 在编写词法分析器之后,现在我正在使用java cup进行语法分析。
我写了我的语法,但有 5 个 S/R 冲突,它们都非常相似。例子:
我本节的语法:
我怎样才能消除这种冲突?
谢谢。
compiler-construction - 解决语法歧义
我将发布有问题的语法规则以开始。
请注意,在 main_interface 之后,如果编译器看到标记 T_BEGIN,它将不知道要转到哪个绑定规则。它可能意味着开始 bind_buttons 或者它可能意味着您想要跳过 bind_buttons 并且 T_BEGIN 是启动 bind_functions。
如何更改此语法以不出现此问题?
要求:我不允许添加/删除终端。我不能告诉用户他们必须改变他们编写代码的方式,我必须改变规则来处理它。
我被难住了,有什么想法吗?
更新: interface_sections : main_interface bind_buttons bind_functions bind_panel_items ;/* gui 程序的组成部分 */
通过野牛运行它时,这给了我相同的移位/减少错误。
但是,我认为它在正确的轨道上,我认为我需要将 T_BUTTONS 和 T_FUNCTIONS 和 T_PANEL 放在规则的前面
附加信息:
parsing - Packrat 解析器冲突
假设我尝试使用 Packrat 解析器解析字符串abc :
这里我使用了 Packrat 解析器支持的左递归,但我不明白为什么它会失败。根据 Parser 文档 P | 如果 P 成功,Q 等于 P,所以在这种情况下ab
应该用“ab”而不是“a”替换,就像我替换ab
为:
yacc - Happy/YACC 在应该换档时降低
我正在研究解析器,我真的很沮丧。在语言中,我们可以有这样的表达式:
或者
除了最后的空数组外,大部分都正确解析。在我的解析器中,我有:
然后一个 NewExpression 是:
然后 EmptyArrays 是一个或多个空大括号 - 如果 EmptyArrays 派生出空字符串,它会添加 20 个移位/减少冲突:
但是,当我在.info
文件中查找解析器时,我得到了这个:
我希望如果我们处于状态 214 并且我们看到一个左大括号,我们应该将它移到堆栈上并继续解析 EmptyArrays。
我不完全确定发生了什么,因为当我通过以 开头的解析去除所有多余的行李(例如)时NewExpression
,额外的括号会正确解析。表达式、语句或语法中的任何非终结符都不可能以左大括号开头。特别是因为我对 if/else 语句有类似的规则,它会产生移位/减少冲突,但如果下一个标记是 else 则选择移位(这个问题有据可查)。
你能帮我弄清楚出了什么问题吗?我真的很感谢你的帮助,我真的很喜欢风车试图找出问题所在。
parsing - 创建 shift-reduce / reduce-reduce 免费语法
我正在尝试在 sablecc 中实现一个类似 Java 的简单语言解析器,尽管在实现,和语句时我经常遇到shift-reduce
/问题。reduce-reduce
if
while
block
例如,我考虑了以下内容:
stmts
= stmt*
;
stmt
= if_stmt
| block_stmt
| while_stmt
;
block_stmt
= { stmts }
| ;
;
while_stmt
= while
(
predicate
)
{
stmts
}
|while
(
predicate
)
;
例如,这种语法会导致这样的问题,即当你有某种形式的东西时
解析器将无法知道是只减少;
(from block_stmt
) 还是完全减少while (true);
(from while_stmt
)。
我一直在到处阅读shift-reduce
/reduce-reduce
问题的原因,我想我理解它们。但是一件事是要知道是什么导致了它们,而另一件事完全不同的是知道如何构造语法以使我避免它们。我尝试过以非常不同的方式实现语法,但最终还是遇到了问题。
我想,与其只是试图从一个特定的ss
/rr
问题中运行,还必须有一种范式来遵循这样的范式来避免这类问题?我相信我解决问题的方式一定是完全错误的:(
关于如何从头开始构建语法而不陷入所有这些陷阱的任何资源?关于这个问题的资源往往非常简单(说明明显的if then else
问题)或完全标记的语法,这有点难以理解。
scheme - 如何避免 LALR 语法中用于解析嵌套列表的移位减少冲突?
我想创建一个 LALR 语法来解析嵌套列表,但我总是遇到移位/减少冲突。
我有 list1,它是 type1 项目和 list2 的列表:
我有一个 list2 ,它是 type2 项目的列表:
此语法产生移位/减少错误。我怎样才能避免它?
这是具体的Bigloo来源:
终端是:comment、new-line、text-chunk 和 white-space。非终结符是:输入、节点列表、节点和文本。
Bigloo 抱怨文本到文本块的缩减规则:
但我不认为这是一个 Bigloo 问题。它看起来像一个语法问题。