试将下列文法转换为LL(1)文法。 DL →DL;D DL →D D →idL : Type idL → id idL → idL,id Type →Stype Type→array(STypeL)of Type Stype→id Stype→ Bound.. Bound Bound→Sign IntLiteral Bound → id Sign→+ Sign →- STypeL→STypeL,Stype STypeL→Stype
时间: 2023-11-18 15:07:43 浏览: 22
首先,需要消除左递归和提取公因子。
1. 消除左递归
将文法中的左递归部分消除:
DL → D DL'
DL' → ε | ; D DL'
D → idL : Type
L → id idL'
L' → ε | , id L'
Type → SType Type'
Type' → ε | array(STypeL) of Type
SType → id SType'
SType' → ε | Bound .. Bound
Bound → Sign IntLiteral | id
Sign → + | -
STypeL → SType STypeL'
STypeL' → ε | , SType
2. 提取公因子
对于每个非终结符的产生式,找到它们的公共前缀,并将其提取出来。
DL → D DL'
DL' → ε | ; D DL'
D → id L : Type
L → id L'
L' → ε | , id L'
Type → SType Type'
Type' → ε | array(STypeL) of Type
SType → id SType'
SType' → ε | Bound .. Bound
Bound → Sign Bound'
Bound' → IntLiteral | id
Sign → + | -
STypeL → SType STypeL'
STypeL' → ε | , SType
最后,给出LL(1)文法的预测分析表:
| | id | : | array | + | - | Bound | .. | IntLiteral | , | of | ε | ; |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| DL | D DL' | | | | | | | | | | | |
| DL' | | ε | | | | ε | | | ; D DL' | | ε | ε |
| D | id L | | | | | | | | | | | |
| L | id L' | | | | | | | | | | | |
| L' | | ε | , id L' | | | ε | | | | | | ε |
| Type | SType Type' | | array(STypeL) of Type | | | | | | | | | |
| Type' | ε | | | | | | | | | of Type | ε | ε |
| SType | id SType' | | | | | | | | | | | |
| SType' | ε | Bound .. Bound | | | | ε | | | | | | ε |
| Bound | Sign IntLiteral | id Bound' | | | | | | | | | |
| Bound' | ε | | | | | | | | | | | ε |
| Sign | + | - | | | | | | | | | | |
| STypeL | SType STypeL' | | | | | | | | | | | |
| STypeL' | ε | | , SType STypeL' | | | ε | | | | | | ε |