问题标签 [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.
regex - 如何处理 x*、x+ 或 x?LR解析器中的类似正则表达式的运算符?
我过去已经实现了递归下降和类似 PEG 的解析器,您可以在其中执行以下操作:
- where
Segment+
表示“匹配一个或多个Segment
” - 并且有一个普通的旧正则表达式用于匹配一个或多个单词字符
\w+
您通常如何使用 LR 语法/解析器完成同样的事情?我见过的所有 LR 解析器的例子都是非常基础的,比如解析1 + 2 * 3
, or (())()
,其中的模式非常简单,似乎不涉及“一个或多个”功能(或者零个或多个 with *
,或者可选 with ?
) . 您通常如何在 LR 解析器中做到这一点?
或者LR解析首先需要词法分析阶段(即LR解析器需要终端和非终端“令牌”)。希望有一种方法可以在没有这样两个阶段的情况下进行 LR 解析。LR 解析器的定义谈到了我一直在阅读的书籍/网站中的“输入字符”,但随后您会不经意/巧妙地看到如下一行:
语法的终端符号是词法扫描器在输入流中找到的多字符符号或“标记”。
它就像什么,扫描仪是从哪里来的。
abstract-syntax-tree - 如何将 LR(1) Parse 翻译成抽象语法树?
我编写了一个表驱动的 LR(1) 解析器,它工作得很好,但是在将解析转换为语法树/抽象语法树的阶段我有点脱节。这是一个我非常热衷的项目,但我真的只是在这里遇到了死胡同。提前谢谢你的帮助。
编辑:我的解析器也只使用一个二维数组和一个动作对象,告诉它下一步去哪里,或者它是否减少去哪里以及要弹出多少项目。我注意到很多人使用访问者模式。我不确定他们如何知道要制作哪种类型的节点。
这是上下文的下推自动机
java - LR(1) 直接解析为抽象语法树
所以我最近问了一个问题,并得到了很好的答案。然而,所描述的步骤似乎更像是创建具体语法树的步骤。
LR 解析过程中的每个缩减都对应于解析树中的一个内部节点。减少的规则是内部 AST 节点,从堆栈中弹出的项目对应于该内部节点的子节点。为 goto 推送的项目对应于内部节点,而由 shift 操作推送的项目对应于 AST 的叶子(令牌)。
将所有这些放在一起,您可以通过在每次进行缩减时创建一个新的内部节点并将所有内容适当地连接在一起来轻松构建 AST。~克里斯·多德
我知道所采取的步骤暗示了解析树,但是我不想显式构建解析树。并且每次减少生成一个节点似乎会导致整个解析树。我考虑过,如果看到某个状态,我只构建一个节点。但是,这似乎无法正常工作。
parsing - 要求一个语法 LR(1) 和一个不是 LR(1) 进行测试
我在 Java 中编写了一个小的 LR(1) 解析器生成器,它在输入中给出了一个上下文无关的语法(最好把它放在产生式上),并且输入单词打印是否 1) 语法不是 LR(1) 2) 单词被接受语法 3) 单词被语法拒绝
到目前为止,我已经尝试过这个语法
S -> CC
C -> cC | d
和这个
一个 -> BA | e
B -> aB | b
(注意 e 是空字符串)
对于这种语法,解析器可以工作,但我很难找到我知道的语法(产品列表),我肯定会生成 LR(1) 语言进行测试。
另外,我需要一个不是 LR(1) 的上下文无关语法来测试程序的点 (1)。
你有什么可以给我的例子吗?
c - 是否存在没有 LL(1) 等价物的 LR(k) 文法
我还没有找到答案。是否存在无法转换为 LL(1) 的上下文无关且明确的语法?
我发现了一个我无法弄清楚如何转换为 LL(1) 的parameter-type-list
产品:C99 中的产品:
这是没有 LL(1) 等效项的 LR(k) 语法的示例,还是我做错了什么?
编辑:我复制了错误的名称,我的意思是复制参数声明:
问题在于声明符和抽象声明符都具有 ( 在它们的第一组中,但也是递归的。
parsing - 给定一个文法,生成 LR(1) 项
我正在研究 LR(1) 项目,我有点怀疑,希望有人能为我澄清。给定以下语法,我必须生成 LR(1) 项。我生成了第一项,但不确定它是否正确,所以在继续之前,我想确保我的第一项正确。如果有人可以帮助我/为我澄清,我将非常感激。谢谢你。这是我所拥有的:
compiler-construction - 如何理解非 LR(0) reduce state in A pratical method for Construction Effective LALR(k) Parsers with Automatic Error Recovery
我不明白非 LR(0) 减少状态的来源。这是否意味着:
- 移除 LR(0) reduce 状态和 get LR'(0) states
- 使用 LR'(0) states 来生成一个 LR(K) states 。而非 LR(0) 归约状态来自 LR(K) 状态。
这是A patyical method for cnstructing Effective LALR(K) Parders with Authomatic Error Recovery的副本
请阅读第 4.2 章
parsing - 从 Lemon Parser Generator 生成 LR 解析表
我正在尝试使用柠檬解析器生成器生成解析器表,但是.out
我运行时生成的文件lemon grammar.y
只包含自动机的状态。
有没有办法获得非终端的 goto 表,而不仅仅是自动机的状态?或者这只能通过阅读生成的代码来完成?是否有任何其他工具可以同时生成操作表和 goto 表?
PS:
一个简单语法的.out
文件(由柠檬生成)如下所示: