问题标签 [gppg]
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.
grammar - 转变减少冲突
我在理解我知道没有歧义的语法的移位/减少冲突时遇到问题。该案例是 if else 类型之一,但它不是“悬空 else”问题,因为我有强制 END 子句分隔代码块。
这是 gppg 的语法(它是一个类似于 Bison 的编译器编译器......这不是回声):
这是冲突输出:
我已经切换了所有内容,并且我确实知道如何解决它,但是该解决方案涉及放弃“elseif”上的左递归以进行右递归。
我已经浏览了我在互联网上找到的关于这个问题的所有稀缺文档(我在最后发布了一些链接),但仍然没有找到一个优雅的解决方案。我知道 ANTLR,我现在不想考虑它。请将您的解决方案限制为 Yacc/Bison 解析器。
我会很欣赏优雅的解决方案,我设法通过消除 /* empty */ 规则和复制所有需要空列表的内容来做到这一点,但在我正在研究的更大的语法中,它最终就像“意大利面条语法综合症”一样。
以下是一些链接:
http://nitsan.org/~maratb/cs164/bison.html
c# - 使用 C# 和 gppg,我将如何构建抽象语法树?
有没有办法做到这一点几乎是开箱即用的?
我可以编写一个大方法,使用收集到的标记来确定哪些叶子应该放在哪些分支中,最后填充一个 TreeNode 对象,但是由于 gppg 已经使用提供的正则表达式处理了所有事情,我想知道是否有更简单的方法吗?即使没有,任何关于如何最好地解决创建 AST 问题的指针都将不胜感激。
抱歉,如果我说了什么愚蠢的话,我才刚刚开始玩编译器游戏。:)
parsing - 帮助解决 Shift/Reduce 冲突 - 尝试建模 (XA)* (XB)*
我试图模拟 EBNF 表达式
我已经建立了 yacc(我使用 MPPG)语法,它似乎代表了这一点,但它与我的测试表达式不匹配。
我要匹配的测试用例是
来自词法分析器的令牌流是
语法分析表明存在“Shift/Reduce 冲突,KW_Declare 上的状态 6”。我试图用“%left PrologHeaderList PrologBodyList”解决这个问题,但两种解决方案都不起作用。
KW_Declare KW_Namespace KW_Variable 分隔符都是具有值“declare”、“naemsapce”、“variable”、“;”的标记。
parsing - 让 YACC 输出一个 AST(token tree)
是否可以让 YACC(或者我是 MPPG)输出一个抽象语法树(AST)。
我正在阅读的所有内容都表明让 YACC 执行此操作很简单,但我正在努力了解您如何知道何时在构建树中的节点时向上移动它。
c# - GPPG (bison) - 如何实现一个“表达表达”的概念
我们正在使用 GPPG(本质上是 C# 的野牛)为编程语言生成解析器。一切都很好,除了一个非常讨厌的地方。我们正在解析的语言有一种“隐式比较”规则,其中“表达式表达式”应该被解释为“表达式 == 表达式”。
例如,这是一个完全有效的陈述:
这显然在解析器生成期间引入了各种冲突。我第一次尝试解决它们是沿着这些思路进行的(为简洁起见进行了编辑)。我试图对规则进行一些重构,它似乎不再模棱两可了,但我一定只是遗漏了一些明显的东西。
这是一个非常小的语法,显示了我遇到的冲突,以及我如何尝试解决它,但不起作用
任何帮助将不胜感激
c# - 解析器生成器:如何一起使用 GPLEX 和 GPPG?
在浏览了关于好的 C# 解析器生成器的帖子后,我偶然发现了 GPLEX 和 GPPG。我想使用 GPLEX 生成令牌,以便 GPPG 解析和创建树(类似于 lex/yacc 关系)。但是,我似乎找不到关于这两者如何相互作用的例子。使用 lex/yacc,lex 返回由 yacc 定义的标记,并且可以将值存储在 yylval 中。这是如何在 GPLEX/GPPG 中完成的(他们的文档中缺少它)?
附件是我想转换为 GPLEX 的 lex 代码:
谢谢!安德鲁
c# - GPPG-Grammar - 永远不会使用的规则
我的一些语法规则有问题。
语法如下:
使用输入检查:
对于此输入,应使用以“defLine”为首的产生式的第二条规则。
为什么不呢?将始终使用第三条规则并引发错误
非常感谢您的帮助,亚历克斯