问题标签 [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.

0 投票
5 回答
2624 浏览

.net - .NET 有没有好的 yacc/bison 类型的 LALR 解析器生成器?

.NET 有没有好的 yacc/bison 类型的 LALR 解析器生成器?

0 投票
5 回答
9379 浏览

parsing - 如何修复后增量运算符的 YACC 移位/减少冲突?

我正在用 YACC(实际上是 Bison)编写语法,并且遇到了移位/减少问题。它是由于包含后缀递增和递减运算符而产生的。这是语法的精简版:

Bison 告诉我有 12 个移位/减少冲突,但如果我注释掉后缀递增和递减的行,它就可以正常工作。有谁知道如何解决这个冲突?在这一点上,我正在考虑迁移到 LL(k) 解析器生成器,这使它更容易,但 LALR 语法似乎总是更自然地编写。我也在考虑 GLR,但我不知道有什么好的 C/C++ GLR 解析器生成器。

0 投票
2 回答
7707 浏览

parsing - 如何解决明确语法中的 shift-reduce 冲突

我正在尝试使用 LALR(1) 解析器生成器(Bison,但问题并非特定于该工具)解析一个简单的语法,并且我遇到了 shift-reduce 冲突。我发现的有关修复这些问题的文档和其他资源往往会说以下一项或多项:

  • 如果语法有歧义(例如 if-then-else 歧义),请更改语言以修复歧义。
  • 如果是运算符优先级问题,请明确指定优先级。
  • 接受默认分辨率并告诉生成器不要抱怨它。

然而,这些似乎都不适用于我的情况:据我所知,语法是明确的(当然它只有一个前瞻字符是模棱两可的),它只有一个运算符,默认分辨率会导致解析错误在正确格式的输入上。是否有任何技术可以重新定义语法以消除不属于上述存储桶的移位减少冲突?

具体而言,这是有问题的语法:

目的是解析“[A-Za-z]+”或“[A-Za-z] -> [A-Za-z]+”形式的分号分隔的行。

0 投票
2 回答
3673 浏览

c - 语法中的左递归导致冲突

在整个 Bison 语法中,我都在使用右递归,并且我读过左递归更好,因为它不必先构建整个堆栈。

但是,当我尝试在其中任何一个上切换到左递归时,我总是会遇到很多冲突,我不明白为什么。

谁能告诉我一个通用示例,说明使用左递归而不是右递归会导致冲突(当右递归不会导致冲突时)。那么在切换到左时需要做什么来纠正这样的冲突。我认为一个基本的例子对我的帮助不仅仅是纠正我自己的语法。

编辑:
但我想无论如何我都应该包含一个特定的示例,因为我的理解还不够完整:-) 将“列表分隔符命令”更改为“命令分隔符列表”可以解决冲突。

0 投票
1 回答
2492 浏览

parsing - 解决 LALR 解析器中的移位/减少冲突

我一直在使用 PLY 为我的语言构建解析器,但是我遇到了 shift/reduce 冲突,这给我带来了一些麻烦。我的语言具有语法 ala C++ 模板的泛型类型。所以现在我有这样的规则:

但是,我发现它无法解析:

(由于显而易见的原因,这是一个问题)。以下是调试输出:

如果需要更多我的解析器,我可以提供。谢谢。

编辑:向我建议的一种解决方案是使类型成为自己的令牌。这需要做一些工作,因为我的语言不使用预处理器,包括像 C/C++ 这样的系统,但是我认为它仍然是可能的,但是我更喜欢一个仅限于语法的解决方案。

0 投票
2 回答
709 浏览

parsing - LALR(2) 悬空其他

LALR(2) 是否能够自然地处理悬空的 else 情况(没有任何特殊规则,如 LALR(1))?

谢谢

0 投票
2 回答
1487 浏览

c++ - 什么是 C++ 的最佳 LALR 解析器生成器,可以生成有意义的错误消息

我正在为 C++ 的 LALR 解析器生成器寻找最佳解决方案,这将使我能够生成非常好的错误消息。我真的很讨厌 MySQL 生成的语法错误,我想将解析器放入其中并用“lint”检查器替换它,它不仅能告诉我更多信息

我使用过 YACC/LEX 和 BISON/FLEX。它必须在 Mac 或 Linux 上运行。

0 投票
2 回答
675 浏览

parsing - LALR(1) 函数的空参数列表

我有一个简单的 LALR(1) 语法,但我遇到了问题。

点标记规则的结束,括号之间的终端具有关联性:ASSIGN 是右关联的,COMMA 是左关联的。

但是柠檬说它不能减少规则“empty_stmt_list ::=”。因为它没有连接到开始符号。我敢打赌 :-)

“invoke”也存在解析冲突,当empty_stmt_list确实是一个empy语句列表时,它无法在RPAREN和COMMA之间做出决定。

我想要实现的是能够解析没有(void)参数的函数调用。

其他一切都按预期工作。

谢谢

编辑:我已经编辑了我的原始帖子并发布了整个精简的语法。

0 投票
2 回答
1416 浏览

c++ - Windows 上的 LALR(1) 或 GLR - 当前 Bison++ / Flex++ 的替代品?

更新:此问题已过时,但仅供参考。

原始问题

自 2002 年以来,我一直在使用相同版本的 bison++ (1.21-8) 和 flex++ (2.3.8-7)。

我现在不是在寻找 LALR(1) 或 GLR 的替代品,只是在寻找最新的选项。有没有人知道这些比不依赖 Cygwin 的原始端口的任何后续端口?

其他人在 Windows 环境中使用什么进行 C++ 编译器开发(除了 ANTLR 或 Boost.spirit)?如果您有第一手经验,商业选择是可以的。我也需要在 Linux 上编译。

更新:当我不了解有关工具建议的政策时,有人问了这个老问题(不确定 2010 年是否存在政策,但无论如何......

从那以后,我更新到具有 GLR 功能的 Bison 3.0,并开始尝试使用它。

我最终决定我的解析器的任何重写都将是递归下降,以改进错误报告并允许在编译器以外的工具中更容易使用,所以现在我将在 Bison 中完成参考版本。我认为此时转换为不同的 PG 工具没什么意义。

0 投票
1 回答
506 浏览

c++ - 使用 Flex 和 Bison 在脚本引擎中实现 eval 和 load 函数

嗨,伙计们,我正在开发一个带有 flex 和 bison 的脚本引擎,现在我正在为这种语言实现 eval 和 load 函数。举个例子,语法如下:

所以,在我的词法分析器中,我实现了这个功能:

但这似乎不起作用。好吧,确实如此,但是当字符串(从文件加载或直接评估)完成时,我得到一个 sigsegv :

您可能会注意到,sigsegv 是由 flex/bison 代码生成的,而不是我的……任何提示,或者至少有任何关于如何实现这些功能的示例?

PS:我已经成功实现了 include 指令,但是我需要 eval 和 load 来工作,而不是在解析时而是在执行时(PHP 的 include/require 指令的一种)。