问题标签 [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.
bison - 有没有办法在保持 LALR(1) 的同时减少这种减少中的替代品数量?
我目前减少了野牛,这意味着将逗号分隔的列表与几个可选的不同规则相匹配:
如果不清楚,这意味着实现(在伪代码中):
这样做的方法是实施,例如:
然而,后一个公式不是 LALR(1),因为在 Bison 看到逗号的每一步,它必须决定是转移并寻找一个 *assignment_list* 还是减少一个空的 *optional_assignment_list* 并继续前进寻找* optional_varargs *。
我正在尝试寻找是否有更好的方法来表示这一点。我已经能够通过引入 *optional_varkwdargs* 来减少备选方案的数量,但这仍然留下了 9 个备选方案来减少,我猜这比 16 个要好:
任何想法,将不胜感激。
grammar - 分解 LALR 语法
可能重复:
Python/YACC:解决移位/减少冲突
我正在尝试使用 Ply 创建一个解析器,它实现了一个像 Yacc 这样的 LALR(1) 解析器。但是,我遇到了困难的减少/减少冲突。据我所知,我的语法没有歧义,相反,冲突源于 LALR(1) 解析器的有限前瞻。我猜A A是遇到问题的时候会出现问题,因为解析器需要知道是否有第三个token来决定是否归约t1。那么如何将其分解为只需要单个标记前瞻的语法呢?
这是 Ply 调试输出中的相关状态,尽管我不太了解它。
parsing - 方案 - LALR 解析器生成 - 来自字符串的输入
我们正在尝试生成(以诡计)从字符串而不是标准输入读取字符的解析器和词法分析器。
我们开始修改 http://code.google.com/p/lalr-scm/source/browse/trunk/calc.scm?r=52代码中包含的计算器示例
问题似乎在以下行:
我们尝试定义一个新的输入端口:
并且变量程序是这样定义的:
但它不起作用,它仍然等待标准输入字符。
该文档缺少详细信息,因此我们无法弄清楚如何解决这个问题。
谢谢
regex - 常规 vs LALR(1):什么更快
假设我们有两种定义相同语言的文法:常规文法和 LALR(1) 文法。
常规和 LALR(1) 算法都是 O(n),其中 n 是输入长度。
正则表达式通常是解析常规语言的首选。为什么?是否有正式的证据(或者可能很明显)证明它们更快?
bison - PCYACC 期望关键字等效
PCYACC 中是否有相当于 BISON 的期望声明的关键字:
grammar - LALR 语法模棱两可
我为布尔和算术表达式制作了一个语法。我想处理算术表达式,例如:
我已经完成了这项工作:我可以处理我想要的所有表达式。
我的问题是布尔表达式可能类似于:
所以在某些时候我的布尔规则必须引用我的算术表达式规则。我不能在布尔规则中使用括号 (),因为它会导致我的语法不明确。我明白为什么,但我无法找到解决这个问题的方法。
expression - Bison - 处理非 LALR(1) 语法
我正在使用 flex,bison 制作一个简单的计算器。
我开发了一种语法,其中包括两种类型的表达式——整数表达式和实数表达式。
语法与此类似:
这不是 LALR(1)。
例如,考虑字符串 INT '+' REAL。在“INT”处,前瞻为“+”,仅基于此,无法判断字符串是 intExp 还是 realExp。
我尝试重写语法以解决歧义,但没有任何结果。
我知道我可以在解析期间推迟进行计算,而是构建一个解析树。然后通过类型检查,问题可以解决。但是对于这样一个简单的问题来说,这似乎有点过分了。
有没有办法让野牛本身来处理这种歧义?或者可以用更好的方式重写语法吗?
parsing - 如何使用可选的非终端修复语法?
我为 LALR 解析器编写了语法,但我被困在可选的非终端。考虑例如 C++ 取消引用,当您可以编写时:
当然你可以写:
这是我的问题,取消引用非终结符确实是可选的,这对语法有很大的影响,现在解析器看到它适合任何地方(几乎),因为它可能是空的。
是否有一个常见的模式我应该如何重写语法来修复它?
如果您指出一些涉及“编写语法时的常见问题和模式”的书籍或其他资源,我也将不胜感激。
python - 解析隐含与显式时间运算符
我一直在使用 ply 编写一个 LALR 解析器,并且在尝试解析乘法时遇到了不一致。
由于完整的解析器链接长达数千行,我不会在此处包含它,但我创建了一个简单的演示:
PLY 没有报告移位/减少冲突或减少/减少冲突,但我得到以下不一致:
这对我来说似乎很奇怪,因为显式和隐式时间规则具有相同的优先级。但我认为这可能是因为 PLY 为“times”令牌分配了优先级,因此将其转移到堆栈上,以支持使用 p_plus 规则减少表达式。我怎样才能解决这个问题?
编辑:更简单的演示。
parsing - Bison 的这种转变/减少冲突从何而来?
我试图通过在 Jison(一个 javascript 解析器)中定义一种非常简单的语言来掌握解析的窍门。它接受与野牛相同/非常相似的语法。
这是我的语法:
我得到一个班次/减少冲突。Jison 的输出在这里: