Parsing 将语法转换为LL(1)
我的语法如下:Parsing 将语法转换为LL(1),parsing,compiler-construction,ll,Parsing,Compiler Construction,Ll,我的语法如下: START -> STM $ STM -> VAR = EXPR STM -> EXPR EXPR -> VAR VAR -> id VAR -> * EXPR 使用此第一套和第二套设置: First set Follow set START id, * $ STM id, * $ EXPR id, * $, = VAR
START -> STM $
STM -> VAR = EXPR
STM -> EXPR
EXPR -> VAR
VAR -> id
VAR -> * EXPR
使用此第一套
和第二套
设置:
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)
?如果您考虑此特定语法可以生成哪些类型的字符串,则所有字符串都是以下形式之一:
***....**id
***....**id = ***...**id
考虑到这一点,您可以通过从头开始为该语言构建新的语法来为该语言设计LL(1)语法。有一种方法可以做到这一点:
开始→ 声明$
声明→ StarredID OptExpr
斯塔雷迪德→ * StarredID | id
OptExpr→ ε|=StarredID
这里,第一组数据如下所示:
- 第一个(开始)={*,id}
- 第一个(语句)={*,id}
- 第一(StarredID)={*,id}
- 第一(OptExpr)={ε,*,id}
- FOLLOW(语句)={$}
- FOLLOW(StarredID)={=,$}
- FOLLOW(OptExpr)={$}
* | id | = $
---------------+-------------------+-------------------+-------------+-----------
Start | Statement$ | Statement$ | |
Statement | StarredID OptExpr | StarredID OptExpr | |
StarredID | * StarredID | id | |
OptExpr | | | = StarredID | epsilon
所以这个语法是LL(1)。没有系统的方法来实现它。你需要经历几乎所有编译器教科书中讨论的各种语法转换方法。有一个相当好的概述。