我已经从给我的左递归语法中删除了左递归。原语法如下:
SPRIME :: = Expr eof
Expr :: = Term | Expr + 期限| Expr - 期限
Term :: = Factor |术语 * 因子|术语 / 因素|术语 mod 因子|术语 div 因子
Factor :: = id | {Expr} | num | Funcall |
Funcall :: = id [Arglist]
Arglist :: = Expr | Expr,Arglist
删除左递归时,这是我生成的语法:
SPRIME :: = Expr eof
Expr :: = Term Expr'
Expr':: = e | + Term Expr'| - 期限Expr'
术语:: =因子术语'
术语':: = e | * 因子字词'| / 因素期限'| mod 因子字词'| div 因子字词'
Factor :: = id | {Expr} | num | Funcall
Funcall :: = id [ Arglist ]
Arglist :: = Expr Arglist'
Arglist':: = , Arglist |的ë
我的下一个任务是对此语法执行左因子分解以使其成为LL(1)。阅读龙书中的相关章节后,我不确定是否需要对此语法做任何事情。我的问题是:这个LL(1)形式的语法已经存在了吗?如果没有,我需要在哪里执行左因子以使其成为LL(1)?
编辑:考虑到@ suddnely_me的答案后,我编辑了Arglist非终端,以便对其生成进行左对齐。我的语法现在是LL(1)语法吗?
答案 0 :(得分:2)
不,这个语法不是LL(1)。至少,最后一个规则组没有留下因素,因为FIRST(Expr)和FIRST(Expr,Arglist)之间存在差异。
答案 1 :(得分:0)
if it is in the form of A->A.ALPHA|BETA
REMOVING LEFT RECURSION A->BETA A'|
A'->ALPHA A'|NULL
EXAMPLE:::A->A+B|a
IN THIS A=A A'=A'
ALPHA=+B
BETA=a
REMOVING LEFT RECURSION : A=aA'
A'=+BA'|NULL
答案 2 :(得分:0)
不,仍然(甚至一年后!)不是LL(1)。我的神谕说:
Can't choose between two rules of 'Factor'
-> id
-> Funcall
'Funcall' can start with id. For example:
Funcall -> id ...