1

你好,

我有以下形式的产品:

Expr ---> Primary | UnaryOp Expr | Expr BinOp Expr | id=Expr | id[Expr]=Expr.

任何人都可以通过删除左递归来帮助我将其转换为 LL(1) 形式吗??我已经对此表示反对,但我仍然无法理解:(。以下是我的尝试。


Expr ---> Primary Expr' | UnaryOp Expr Expr' | id=Expr Expr' | id[Expr]=Expr Expr'

Expr' ---> BinOp Expr Expr' | epsilon

上述转换是否正确??我从这里做什么?

我使用了在wikipedia中找到的以下一般规则。


A --->  Ab | B

转换时:

A' --->  aA'
A  --->  BA' 
4

3 回答 3

0

DragonBook 很好地解释了如何从 LR(0) 转换为 LL(1),以及哪些语法不是 LL(1),等等。如果你热衷于学习这个,你应该看看这本书的解释.

于 2011-02-04T05:36:19.970 回答
0
Expr ---> Primary Expr' | UnaryOp Expr | id=Expr | id[Expr]=Expr
Expr' ---> BinOp Expr | epsilon

包含左递归的语法是 Expr ---> Expr BinOp Expr 已经完成的,从中删除左递归

通过与文章比较来检查这是否正确

http://en.wikipedia.org/wiki/Left_recursion

于 2011-02-04T12:54:20.007 回答
0
Expr ---> Primary | UnaryOp Expr | Expr BinOp Expr | id=Expr | id[Expr]=Expr

以这种方式很容易想到左递归删除。你在第三个表达式'Expr BinOp Expr'中有一个左重复。你知道左边的“Expr”项会在某个时间点被其他终端和表达式替换(这就是我们避免左递归的方式)。所以让我们这样做——>用其他表达式替换有问题的术语,

Expr ---> Primary BinOp Expr | UnaryOp Expr BinOp Expr | id=Expr  BinOp Expr | id[Expr]=Expr BinOp Expr | ( Primary | UnaryOp Expr | id=Expr | id[Expr]=Expr )

我们看到“BinOp Expr”被重复。将其提取到另一个语法,这是最终结果

Expr' --> e | BinOp Expr

Expr -- > Primary Expr' | UnaryOp Expr Expr' | id=Expr Expr' | Primary Expr' | id[Expr]=ExprExpr' 

注意 e :表示表达式也可以是 Primary , UnaryOp Expr 等中的任何一个

于 2011-02-05T17:05:43.297 回答