19得票4回答
为什么LL文法不能是左递归的?

在龙书中,LL语法的定义如下: 如果对于任何产生式A -> a|b,满足以下两个条件,则该文法是LL文法。 1. FIRST(a)和FIRST(b)不相交。这意味着它们不能同时推导EMPTY。 2. 如果b能够推导EMPTY,则a不能推导以FOLLOW(A)开头的字符串,即FIRST(a)...

14得票1回答
表达式解析器文法和左结合性

我一直在尝试创建一个带有变量的表达式解析器,并将它们简化为二次方程式的形式。 这是我的解析器语法:Exercise : Expr '=' Expr Expr : Term [+-] Expr | Term Term : Factor [*/] Term | Factor Factor: Ato...

14得票2回答
逐步消除这种间接左递归

我见过这个算法可以用来消除所有左递归。但是我在处理这个特定的语法时遇到了问题: A -> Cd B -> Ce C -> A | B | f 无论我尝试什么,最终都陷入循环或者语法仍然是间接左递归的问题。 在这个语法上,正确实现该算法需要哪些步骤?

8得票2回答
左递归分析

描述: 在阅读《C语言编译器设计》书籍时,我遇到了以下规则来描述上下文无关文法: 一个能够识别由一个或多个语句组成的文法,每个语句是一个算术表达式后跟一个分号。语句由一系列以分号分隔的表达式组成,每个表达式由一系列数字组成,数字之间用星号(表示乘法)或加号(表示加法)分隔。 以下是该...

8得票1回答
左结合性 vs 左递归

我正在尝试编写一个C语言编译器(尽管它使用简化语法)。 有一件事情困扰了我很长时间。如果我理解得正确,所有的二元操作符都是左结合的。所以,如果我们有“x+y+z”,首先执行x+y,然后再加上z。 然而,强制左结合是否会导致无限的左递归? 到目前为止,我检查过的所有方法都是左结合或没有左递...

7得票1回答
帮助左因子分解语法以消除左递归

我有一种小型的自定义脚本语言,现在我正在尝试更新它以允许布尔表达式,例如a > 2和a > 2 and (b < 3 or c > 5)。问题出在括号表达式上。这是一个(根据@Bart Kiers的答案进行编辑后的)完整语法,展示了问题。这是我实际语法的简化版本,但问题...

7得票1回答
在基本表达式解析器中消除左递归

作为一项练习,我正在使用以下GADT在Haskell中实现解析器来处理一个非常简单的语言(我的项目的实际语法涉及更多表达式,但是这个摘录已足够回答问题): data Expr a where I :: Int -> Expr Int Add :: [Expr Int...