问题标签 [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.
java - 如何逐步使用java_cup?
我对 java_cup 和解析完全陌生,我想使用 bnfc 和 javacup 为简单的语法生成解析器。我已经指定了语法规则并使用了 bnfc:
这为我生成了一些文件(ia filename.cup)
然后我尝试用 java_cup 构建它:
这也成功结束。最后我得到了文件 parser.java 和 sym.java。
我有一些输入文件,我想检查它们是否解析。我不知道如何使用这个生成的解析器。我还编译了 parser.java 但是当我尝试运行它时,它抛出
parsing - 现实世界的 LR(k > 1) 语法?
为 k > 1 制作人工 LR(k) 文法很容易:
但是,是否有任何现实世界的非 LR(1) 计算机语言是 LR(k > 1) 可解析的?
还是非 LR(1) 语言也不是 LR(k)?
bison - 野牛语法移位/减少冲突的解决方案
我正在尝试为微小的 Visual Basic 语言编写解析器。而且我无法解决下一个班次/减少冲突。我有这些规则:
野牛对我说:
那么,在这场冲突中,正确的解决方案是什么?
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
解析器无法解析它。
bison - 如何解决这个 S/R 冲突
这是我的工作 EBNF 语法的简化:
\n 和 EOF 都将 NEWLINE 作为令牌吐出(因此在 EOF 之前不需要单个结尾的 NEWLINE)。它适用于这样的流:
现在我想有几个line
,block
至少一个是强制性的,其余的用NEWLINE
. 例如:
我试过这样做:
但是 Jison 在前瞻时抱怨 S/R 冲突NEWLINE
。我猜状态机在决定它NEWLINE
是新块的一部分line
还是最终NEWLINE*
输入时感到困惑file
(这是必需的,因为文件可以以 NEWLINE/EOF 结尾)。
我怎样才能解决这个问题?
python - Python lr解析模块;无法解析简单的递归语法
这是使用lrparsing
Python 模块的语法。该模块报告语法中没有冲突。
它无法解析{{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
根本不像我期望的那样工作吗?
parsing - 使用 shift-reduce 解析构建解析树
我正在尝试在空闲时间进行解析,并且我想为一个非常简单的语法实现一个 shift-reduce 解析器。我已经阅读了许多在线文章,但我仍然对如何创建解析树感到困惑。这是我想做的一个例子:
语法:
这是一个示例输入:
在标记化之后,变成:
我明白那个:
- 移位意味着将第一个输入令牌压入堆栈并将其从输入中删除
- 减少意味着用语法元素替换堆栈上的一个或多个元素
所以,基本上,这应该发生:
除了“要减少什么?” 怀疑,我不知道如何正确构建解析树。树应该看起来像这样:
我应该在减少时创建一个新节点吗?
什么时候应该将子节点添加到新创建的节点/什么时候应该创建一个新的根节点?
parsing - LR(1) 解析器中的左递归
LR(1) 解析器可以解析这种类型的文法吗?
我正在尝试编写一个实现这种类型解析器的 Java 程序,但我只能在没有左递归的语法上得到正确的结果。
java - 任何适用于 Java 的 L(AL)R 语法
我正在拼命寻找可以保证是 LR(1) 的 Java 语法。我不在乎哪个版本的 Java;我应该能够将其修改为我想要的版本。
我正在阅读 Java™ 语言规范第二版的最后一章。见鬼,那一章的语法似乎根本不是 LR(1)。我感觉语法是循环的或有些奇怪,因为当我尝试从语法生成解析表时,我不断遇到减少移位冲突。
任何人都可以对此提出一些建议吗?
注意:将标题编辑为 L(AL)R,因为我也可以接受 Java 的 LALR 语法。