将语法转换为LL(1)

时间:2014-06-08 10:05:47

标签: parsing compiler-construction ll

我有以下语法:

START -> STM $
STM -> VAR = EXPR
STM -> EXPR
EXPR -> VAR
VAR -> id
VAR -> * EXPR

使用此firstfollow集:

          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)

1 个答案:

答案 0 :(得分:0)

如果你考虑这个特定语法可以生成什么类型​​的字符串,它是以下形式之一的所有字符串:

 ***....**id
 ***....**id = ***...**id

考虑到这一点,您可以通过从头开始为语言构建新语法来为该语言设计LL(1)语法。这是一种方法:

  

开始→声明$

     

声明→StarredID OptExpr

     

StarredID→* StarredID | ID

     

OptExpr→ε| = StarredID

这里,FIRST集如下:

  • FIRST(开始)= {*,id}
  • FIRST(声明)= {*,id}
  • FIRST(StarredID)= {*,id}
  • FIRST(OptExpr)= {ε,*,id}

  • 关注(声明)= {$}

  • 关注(StarredID)= {=,$}
  • 关注(OptExpr)= {$}

此处显示解析表:

                  *                 | id                | =             $
 ---------------+-------------------+-------------------+-------------+-----------
 Start          | Statement$        | Statement$        |             |
 Statement      | StarredID OptExpr | StarredID OptExpr |             |
 StarredID      | * StarredID       | id                |             |
 OptExpr        |                   |                   | = StarredID | epsilon

所以这个语法是LL(1)。