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)。

没有系统的方法来实现它。你需要经历几乎所有编译器教科书中讨论的各种语法转换方法。有一个相当好的概述。