问题标签 [lalr]
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.
erlang - Erlang 的 Yecc 优先级问题
我正在尝试使用 Yecc 编写 Erlang 解析器,但我在语义规则的优先级方面遇到了一些麻烦。在我的例子中,我定义了语法、终端和非终端符号、规则和相关代码。
这是我为测试而写的。
现在让我们执行一个特定的术语来检查规则是如何应用的。
解析器输出为:
但我需要这个。只要解析器处理该术语(如调试输出),我就在编写输出。
初始任期。
规则 %[req1 & req2]。(这是正确应用的 - 案例 '$1' == '$5')
现在,我不知道会发生什么,但输出应该是这样的。
规则 %[mand2 & mand3]。(情况属实)
规则 %[mand2 & mand3]。(案例 '$2' == '$7')
规则 %[tick] – 最终结果。
我已经尝试过了:
正如 Yecc 手册中所解释的,我能够做到这一点:
- 使用运算符优先级。
- 将优先级应用于规则。从文档中(也可以声明非终端的优先级,“上一级”。这在运算符重载时很实用(另请参见下面的示例 3))。
但这似乎对我不起作用。有什么帮助???
谢谢!
parsing - 语法分析器错误恢复可以自动引导吗?
我正在编写一个 LALR 解析器生成器作为一个宠物项目。
我正在使用紫龙书来帮助我进行设计,我从中收集到的是解析器中有四种错误恢复方法:
- 恐慌模式:开始转储输入符号,直到找到编译器设计者预先选择的符号
- 短语级恢复:将输入字符串修改为允许当前生产减少的内容
- 错误产生:通过将错误合并到语法中来预测错误
- 全局校正:更复杂的短语级恢复版本(据我了解)
其中两个需要修改输入字符串(我想避免),另外两个需要编译器设计者预测错误并根据他们对语言的了解设计错误恢复。但是解析器生成器也有关于语言的知识,所以我很好奇是否有更好的方法来从解析错误中恢复,而无需预先选择同步标记或用错误产生填充语法。
除了选择同步标记,解析器不能只将当前生产可以减少到的所有非终结符后面的符号视为同步标记吗?我还没有真正弄清楚它的工作原理 - 我想象解析器正在一系列正在进行的产品中,但当然这不是自下而上的解析器的工作方式。试图找到一个可行的状态会不会产生太多不相关的错误?它会尝试在无效状态下恢复解析器吗?有没有一种好方法可以用有效的错误操作预先填充解析器表,以便实际的解析程序在遇到错误时不必推理下一步该去哪里?
parsing - 计算 FOLLOW() 还是传播?
我对 LALR(1) 解析器的前瞻计算有点困惑。
在“解析技术 - 实用指南”一书中,他们指出传播前瞻(+自发生成的前瞻)等同于计算变量的 FOLLOW()。那么为什么 LALR(1) 解析器(根据 Dragon 的书)完全使用传播/自发技术,如果它可以使用 FIRST() 和 FOLLOW(),它们计算简单直接?
如果不是这种情况,这两种技术有什么区别?
parsing - LALR(1) 解析器中的冲突解决
关于LALR(1)解析器冲突的一些问题,主要涉及到解析的细节:
根据教科书中描述的不同 LALR(1) 解析器,如果遇到移位/归约冲突,那么这表明语法一开始就不是 LALR(1),对吧?
Reduce/Reduce 冲突可能出现在有效的LALR(1) 语法中,因为从 LR(1) 到 LALR(1) 的状态合并,对吧?
YACC 和 GNU Bison 中使用的优先级和关联性是用来帮助解决移位/减少冲突的工具,对吧?
此外,只有当冲突的移位/归约规则优先级等于先行符号优先级时,解析器才应该检查关联性,在任何其他情况下关联性都无关紧要,对吧?
我之所以问,是因为我不是 100% 确定,而且这些书籍没有提供关于解决冲突的太多细节,我在这个主题上找到的仅有的几行是在 GNU Bison 手册中
与上述 Bison 手册链接相关的问题:
- 为什么他们声称在冲突规则或前瞻令牌中没有优先级,选择是 SHIFT?我认为,如果减少规则有任何优先级,它会完全没有优先级地击败前瞻。
compiler-construction - 后增量和前增量和 Rval
我有点困惑,为什么第二行没有产生任何错误,但为什么第三行会产生语义错误?
context-free-grammar - 合并 LR 状态以形成 LALR 语法分析的集合
如果假设我有以下状态:
I1: S->TaV.,$
T -> V.,a
I2: T -> V.,a|$
我会合并这些州吗?
基本上,我想知道I1的核心是什么。是 { S->TaV。, T->V。I1 的核心还是我会说 I1 包含两个核心 - S->TaV & T->V?
Dragonbook 说,对于 LR(1) 项目集合中存在的每个核心,找到所有具有该核心的集合,并将其替换为它们的并集。
现在,如果 { S->TaV。, T->V。} 是I1的核心,那我就不合并集合了。但是,对于核心T->V。,I1 和 I2 都包含核心,因此必须用它们的并集替换。
那么我应该合并集合吗?
一些可能有用的背景细节:
最初的语法是
G: S->TaV | T
T->V | b
V->Ta | c
parsing - LR(1) 解析器状态大小仍然是个问题?
从历史上看,LALR(1) 解析器优于 LR(1) 解析器,因为 LR(1) 解析器生成的大量状态需要资源。很难相信这仍然是当今计算环境中的一个问题。由于 LALR 语法是 LR 语法的适当子集,现在仍然是这种情况还是现代编译器是使用规范的 LR 解析器构建的?
c# - Irony 中的 C99 语法 - 声明/语句冲突
我正在尝试使用Irony来解析 C99,我在网上找到了一个语法来指导我。
我在声明与声明的冲突中遇到困难。以下规则未能检测到带有初始化程序的指针声明。
它失败的线路类型是:
当我从语句的规则中删除labeledStatement 和expressionStatement 时(两者都可能以标识符开头),这种类型的声明被正确识别。
在尝试声明之前强制 Irony 用尽声明规则的最佳方法是什么?或者,我可以在 Irony 解析时添加到语法中,以便它可以将 MyType 注册为终端而不是标识符?
c# - 如何获取(LA)LR解析器中的标识符
(LA)LR解析器的一个缺点是 reduce 仅在规则末尾处理。这是具有范围变量的编程语言中的一个问题,例如javascript
.
例子:
请参见上面的代码示例。解析器可能如下所示:
现在很清楚,每次解析器都会消耗一个标识符。可以在寄存器中注册标识符。然而问题是一个函数(行/*1*/
)只在函数的末尾被考虑。因此,在函数中使用标识符(如 ;)的指令a = 4
不能在解析器时绑定到本地/全局标识符,因为当时它是未知的。
解决这个问题有哪些好的做法,C#(标准库)提供了哪些功能来处理这种情况?