问题标签 [lr]

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.

0 投票
0 回答
77 浏览

parsing - “配置对可行的前缀有效”是什么意思?

0 投票
1 回答
555 浏览

java - 如何逐步使用java_cup?

我对 java_cup 和解析完全陌生,我想使用 bnfc 和 javacup 为简单的语法生成解析器。我已经指定了语法规则并使用了 bnfc:

这为我生成了一些文件(ia filename.cup)

然后我尝试用 java_cup 构建它:

这也成功结束。最后我得到了文件 parser.java 和 sym.java。

我有一些输入文件,我想检查它们是否解析。我不知道如何使用这个生成的解析器。我还编译了 parser.java 但是当我尝试运行它时,它抛出

0 投票
1 回答
1164 浏览

parsing - 现实世界的 LR(k > 1) 语法?

为 k > 1 制作人工 LR(k) 文法很容易:

但是,是否有任何现实世界的非 LR(1) 计算机语言是 LR(k > 1) 可解析的?
还是非 LR(1) 语言也不是 LR(k)?

0 投票
1 回答
222 浏览

bison - 野牛语法移位/减少冲突的解决方案

我正在尝试为微小的 Visual Basic 语言编写解析器。而且我无法解决下一个班次/减少冲突。我有这些规则:

野牛对我说:

那么,在这场冲突中,正确的解决方案是什么?

0 投票
1 回答
2066 浏览

parsing - LR(k) 到 LR(1) 语法转换

我对维基百科的以下引用感到困惑:

换句话说,如果一种语言足够合理以允许高效的一次性解析器,那么它可以用 LR(k) 文法来描述。并且该语法总是可以机械地转换为等效(但更大)的 LR(1) 语法。因此,理论上,LR(1) 解析方法足够强大,可以处理任何合理的语言。在实践中,许多编程语言的自然语法接近于 LR(1)。[需要引用]

这意味着解析器生成器,如bison,非常强大(因为它可以处理LR(k)语法),如果能够将LR(k)语法转换为LR(1)语法。是否存在一些这样的例子,或者如何做到这一点的秘诀?我想知道这一点,因为我的语法中有移位/减少冲突,但我认为这是因为它是一种LR(2)语法并且想将其转换为LR(1)语法。附带问题:是C++一种不合理的语言,因为我读过,生成的bison解析器无法解析它。

0 投票
2 回答
330 浏览

bison - 如何解决这个 S/R 冲突

这是我的工作 EBNF 语法的简化:

\n 和 EOF 都将 NEWLINE 作为令牌吐出(因此在 EOF 之前不需要单个结尾的 NEWLINE)。它适用于这样的流:

现在我想有几个lineblock至少一个是强制性的,其余的用NEWLINE. 例如:

我试过这样做:

但是 Jison 在前瞻时抱怨 S/R 冲突NEWLINE。我猜状态机在决定它NEWLINE是新块的一部分line还是最终NEWLINE*输入时感到困惑file(这是必需的,因为文件可以以 NEWLINE/EOF 结尾)。

我怎样才能解决这个问题?

0 投票
3 回答
454 浏览

python - Python lr解析模块;无法解析简单的递归语法

这是使用lrparsingPython 模块的语法。该模块报告语法中没有冲突。

它无法解析{{0}}带有错误 的字符串lrparsing.ParseError: line 1 column 5: Got '}' when expecting __end_of_input__ while trying to match block in state 11

一步一步的栈状态是:

其中 afaik 意味着它正在移动{{0,然后在看到}减少0到 时expr,然后在没有先移动它的情况下} 再次减少,这让我的 bajeezus 感到困惑。

这是一个错误,还是我在做一些非常简单和愚蠢的事情?

如果这是我的语法,我将如何重构它来满足我永恒的热情和热情的欲望?如果这是一个错误,有人可以指导我使用一个与lrparsing最相似的语法的 python 模块吗

编辑:重构为:

允许正确解析。我现在的问题是……为什么?我觉得lrparsing之前会向我抱怨任何解析问题......Repeat根本不像我期望的那样工作吗?

0 投票
2 回答
1859 浏览

parsing - 使用 shift-reduce 解析构建解析树

我正在尝试在空闲时间进行解析,并且我想为一个非常简单的语法实现一个 shift-reduce 解析器。我已经阅读了许多在线文章,但我仍然对如何创建解析树感到困惑。这是我想做的一个例子:


语法:

这是一个示例输入:

在标记化之后,变成:


我明白那个:

  1. 移位意味着将第一个输入令牌压入堆栈并将其从输入中删除
  2. 减少意味着用语法元素替换堆栈上的一个或多个元素

所以,基本上,这应该发生:

除了“要减少什么?” 怀疑,我不知道如何正确构建解析树。树应该看起来像这样:

我应该在减少时创建一个新节点吗?

什么时候应该将子节点添加到新创建的节点/什么时候应该创建一个新的根节点?

0 投票
2 回答
5648 浏览

parsing - LR(1) 解析器中的左递归

LR(1) 解析器可以解析这种类型的文法吗?

我正在尝试编写一个实现这种类型解析器的 Java 程序,但我只能在没有左递归的语法上得到正确的结果。

0 投票
1 回答
804 浏览

java - 任何适用于 Java 的 L(AL)R 语法

我正在拼命寻找可以保证是 LR(1) 的 Java 语法。我不在乎哪个版本的 Java;我应该能够将其修改为我想要的版本。

我正在阅读 Java™ 语言规范第二版的最后一章。见鬼,那一章的语法似乎根本不是 LR(1)。我感觉语法是循环的或有些奇怪,因为当我尝试从语法生成解析表时,我不断遇到减少移位冲突。

任何人都可以对此提出一些建议吗?

注意:将标题编辑为 L(AL)R,因为我也可以接受 Java 的 LALR 语法。