左因子非左递归语法使其成为LL(1)

时间:2011-04-09 13:07:22

标签: grammar

我已经从给我的左递归语法中删除了左递归。原语法如下:

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)语法吗?

3 个答案:

答案 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 ...