【发布时间】:2016-10-19 21:56:44
【问题描述】:
我正在尝试为 C 编写一个编译器(虽然语法更简单)。
有些事情我已经坚持了一段时间。如果我低估了,那么所有二进制操作都是关联的。所以如果我们有我们“x+y+z”,x+y首先出现,然后是加z。
但是,强制左关联性不会导致无限左递归吗?
到目前为止,我检查过的所有解决方案要么是左关联的,要么没有左递归,但不是两者都。是否有可能拥有同时具有这两个属性的语法。有没有可能?
例子:
左联想:
Expr = Term | Expr + Term
Term = Element | Term ∗ Element
Element = x|y|z|(Expr)
左递归消除:
Expr = Term ExprTail
ExprTail = epsilon | + Term ExprTail
Term = Element TermTail
TermTail = epsilon | * Element TermTail
Element = x|y|z|(Expr)
有什么想法吗?
【问题讨论】:
-
您可以在不丢失左结合性的情况下消除左递归,这是LL解析器中的标准过程。求幂运算符(如果有的话)是二元右结合的。
-
在 C 中,赋值运算符是右结合的,仅此而已。
-
@EJP 你是说有一种方法可以在没有左递归的情况下重写问题中的语法,这样生成的解析树将是左关联的,而无需对那个树?如果是这样:如何?
标签: parsing compiler-construction grammar left-recursion