我已经从给予我的左递归语法中删除了左递归。原来的语法如下:左分解非左递归语法使其成为LL(1)
SPRIME :: = Expr的EOF
Expr的:: =条款| Expr +期限| Expr - Term
Term :: = Factor |术语*因子|术语/因子|术语mod因子|术语div因子
因子:: = ID | {Expr} | num | Funcall |
Funcall :: = id [Arglist]
Arglist :: = Expr | EXPR,ARGLIST
当移除左递归,这是我公司生产的语法:
SPRIME :: = EXPR EOF
EXPR :: =期限EXPR '
EXPR' :: = È | + Term Expr'| - Term Expr'
Term :: = Factor Term'
Term':: = e | *因子术语'| /因子术语'| mod因子术语'| div因子项'
因子:: = ID | {Expr} | num | Funcall
Funcall :: = ID[ ARGLIST ]
ARGLIST :: = Expr的ARGLIST '
ARGLIST' :: = , ARGLIST | e
我的下一个任务是对该语法执行左分解以使其成为LL(1)。阅读了龙书中的相关章节后,我不确定是否需要对该语法做任何事情。我的问题是:这是LL(1)形式的语法吗?如果不是,我需要在哪里执行左分解以使其成为LL(1)?
编辑:在将@ suddnely_me的回答考虑在内后,我编辑了Arglist非终端以便将其生成的因素留下。我现在的语法是LL(1)语法吗?
所以会修改语法在以下方式将其转换为LL(1)? – 2011-04-10 11:39:01
乍一看,是的。正如我记得我的学年,检查语法是否为LL(1)的最好方法是构建LL(1)分析器。有一些常见的算法可以做到这一点。 – iehrlich 2011-04-10 12:27:44