问题标签 [lr1]
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.
java - 这个解析器生成器说这个语法不是 LR(1) 但我有疑问
我用 Java 编写了一个解析器生成器,经过几次颠簸(例如,早期版本并不特别喜欢左递归),我设法使它与一些简单的语法一起工作(所以我可以手动验证产生是正确的) 我尝试给它提供一个更复杂的语法,结果是它不是 LR(1) 语法(源于解析器试图在解析表的同一个单元格上写两次的事实)
有问题的语法是
S->aAb|SA
A->aA|e|S
我很确定这个语法是 LR(1),无论如何,这是我的程序 http://pastebin.com/hJNC9uuN的输出
任何建议都将是最宝贵的谢谢(如果有人有一个解析器生成器来输出自动机和解析表,这样我就可以面对他们,那就更好了)
parsing - 给定一个文法,生成 LR(1) 项
我正在研究 LR(1) 项目,我有点怀疑,希望有人能为我澄清。给定以下语法,我必须生成 LR(1) 项。我生成了第一项,但不确定它是否正确,所以在继续之前,我想确保我的第一项正确。如果有人可以帮助我/为我澄清,我将非常感激。谢谢你。这是我所拥有的:
parsing - LR(1) 自动机:项目之间的差异
我对LR(1)自动机构造有疑问:
内核[A->b., x] (state_1)的状态是否等同于内核[A->b.,x/y] (state_2)的状态?
就像,如果我处于状态[A->.b, x]和 shift_b 状态,如果我已经有 state_2,是否需要创建 state_1?
希望很清楚。
bnf - LR(1) items 和 LALR(1) 解析表怎么做呢?
从下面给出的语法创建 LR(1) 项并合并具有给出 LALR(1) 项集的项集。我不知道如何从这个语法构造
B -> 身份证 | 编号 ( B ) | 乙。编号 | 乙[乙]| 乙。身份证(乙)
到目前为止的答案:i0- B' -> .B, $ | .id, $ | .id ( B )
compiler-construction - 野牛:即使 %left %right 指令也有移位减少冲突
我知道大多数移位/减少冲突可以通过使用 %left 或 %right 指令来解决。但即便如此,我也遇到了冲突。以下是我的语法块:
我有如下的优先级和关联性指令:
它仍然给出了 11 个换班错误。这是给出这些错误的状态 84。
我无法弄清楚为什么这些指令不起作用。
如果需要,这是解析器文件:parser.y
编辑:文件parser.y
已被删除。
parsing - LR(1) 使用 epsilon 产生式解析表
我无法使用包含 epsilon 产生式的语法为 LR(1) 解析器构建项目集的集合。例如,给定以下语法(其中 eps 代表 epsilon)
State0 将是
从 State0 用 'a' 移动会得到以下状态,我们称之为 State2
为了预测 State2 的第二项,我需要计算 FIRST(U$)。我知道 FIRST(U) = {'b', eps}。我的第一个问题是:State2 的第二项的前瞻是 $ 和 'b'?由于 U 可以是 eps,我的大脑告诉我,我也可以将 $ 作为前瞻,而不仅仅是“b”。如果 FIRST(U) 只是 {'b'},它就只是 'b'。那是对的吗?
第二个问题:在某些时候,我将有如下状态
我在这里做什么?我是否需要与 eps 一起移动并与该项目一起设置U -> eps., $
?如果我有另一个终端作为前瞻,即X -> .eps, a/$
?如果我搬家,最终有一套表格X -> eps., $
,我会减少吗?
还有更多:我需要在解析表中插入 eps 作为符号吗?
谢谢
rust - LR(1) 移位/减少歧义
给定带有重复BLOCK
s 的输入,其中每个块都有重复BEGIN EVENT
和END EVENT
条目(END EVENT
总是跟在 a之后BEGIN EVENT
):
你如何用 LR(1) 来消除这个语法的歧义?我正在使用LALRPOP,最小的例子是:
因为 LR(1) 只能向前看一个标记,所以这个语法是模棱两可的,因为 LALRPOP 有用地告诉你(部分错误):
我看到它告诉我,在解析 BlockHeader、Begin 和 End 之后,它无法确定下一个标记是另一个 Begin 还是另一个 Block 的开始。我还没有找到在 LR(1) 中消除歧义的方法,但我只能假设这是我缺乏理解,而不是 LR(1) 语法的继承限制?
parsing - 在 LR(1) 前瞻中考虑了哪些产生式?
我目前正在使用 http://jsmachines.sourceforge.net/machines/lr1.html上的工具查看两个闭包计算示例
示例 1
在这里,在初始状态下以闭包结束:
示例 2
计算的第一步闭合是:
在示例 1 中,为什么规则 3 中的 b 不包含在前瞻中?在案例 2 中,我们遵循 B 来确定 $ 是前瞻的一部分,那么是否有一些特殊的理由不考虑案例 1 中的所有规则?
compiler-construction - 可以用 LL(1) 解析语法但不能用 LR(1) 解析语法吗?
对于家庭作业,我得到了以下语法:
我用 LL(1) 计算得很好。第一组是:
以下套装是:
当我制作解析表时,示例字符串“ab”解析得很好。但是,当我尝试使用 LR(1) 解析相同的语法时,我遇到了错误。
对于项目集 0,我得到以下信息:( , 分隔前瞻终端)
如果你做表,你会清楚地看到项目集0中A和B之间存在reduce-reduce冲突。如果要求我解析字符串“ab”,解析器将不知道是否要减少我的空到A或减少到B。我做错了什么?我总是被告知 LR(1) 实际上可以解析比 LL(1) 更多的语法,那么这里有什么问题呢?如果有人可以帮助我,我将不胜感激,因为这让我发疯。谢谢
compiler-construction - 如何解析给定的 LALR(1) 语法
我无法使用 LALR 方法解析以下语法。
一开始我没问题,这里是项目状态 0:(分隔前瞻状态的 , )
现在这很好,但是当您从广告终端转到状态 1 时,我会感到困惑。我的书的状态 2 如下:
X非终端中的前瞻终端“d”来自哪里?我以为 dX 来自 .dX,它有前瞻终端“$”和 $d”。但是在进行 E-closure 时,前瞻不应该是 $d 的第一个,即“$”?为什么是“$”,或“d”?我认为它可能来自另一个州,因为这是 LALR,但我最终合并状态 1 的状态也没有前瞻广告。有人可以向我解释为什么有一个“d”配对在这个状态的前瞻中有“$”?谢谢。