我有以下语法:
START -> STM $
STM -> VAR = EXPR
STM -> EXPR
EXPR -> VAR
VAR -> id
VAR -> * EXPR
使用此first
和follow
集:
First set Follow set
START id, * $
STM id, * $
EXPR id, * $, =
VAR id, * $, =
我已经创建了以下解析表:
$ = id * $
START START → STM $ START → STM $
STM STM → VAR = EXPR STM → VAR = EXPR
STM → EXPR STM → EXPR
EXPR EXPR → VAR EXPR → VAR
VAR VAR → id VAR → id
VAR → * EXPR VAR → * EXPR
从这里我可以看到这不是LL(1)
。
如何修改此语法以使其成为LL(1)
?
答案 0 :(得分:0)
如果你考虑这个特定语法可以生成什么类型的字符串,它是以下形式之一的所有字符串:
***....**id
***....**id = ***...**id
考虑到这一点,您可以通过从头开始为语言构建新语法来为该语言设计LL(1)语法。这是一种方法:
开始→声明$
声明→StarredID OptExpr
StarredID→* StarredID | ID
OptExpr→ε| = StarredID
这里,FIRST集如下:
FIRST(OptExpr)= {ε,*,id}
关注(声明)= {$}
此处显示解析表:
* | id | = $
---------------+-------------------+-------------------+-------------+-----------
Start | Statement$ | Statement$ | |
Statement | StarredID OptExpr | StarredID OptExpr | |
StarredID | * StarredID | id | |
OptExpr | | | = StarredID | epsilon
所以这个语法是LL(1)。