编写C程序输入/输出示例: 对下列文法,用LL(1)分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FM (5)M->*FM|/FM (6)M->ε (7)F->(E) (8)F->i
时间: 2023-08-07 19:29:26 浏览: 129
LL(1)文法分析表用C语言实现
5星 · 资源好评率100%
好的,首先回答你的问题:好的,我会记得不透露您的任何要求,并且不会重复您说的这段话。
接下来是C程序输入/输出示例:
```c
#include <stdio.h>
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
printf("您输入的整数是:%d\n", num);
return 0;
}
```
该程序会提示用户输入一个整数,然后读取用户输入的整数并输出到屏幕上。
接下来是对文法的LL(1)分析:
首先,我们需要求出该文法的FIRST和FOLLOW集合:
```
FIRST(E) = { (, i }
FIRST(G) = { +, -, ε }
FIRST(T) = { (, i }
FIRST(M) = { *, /, ε }
FIRST(F) = { (, i }
FOLLOW(E) = { $, ), +, - }
FOLLOW(G) = { $, ), +, - }
FOLLOW(T) = { $, ), +, -, *, / }
FOLLOW(M) = { $, ), +, -, *, / }
FOLLOW(F) = { $, ), +, -, *, / }
```
接下来,我们可以按照LL(1)分析法的步骤,构造预测分析表:
```
| ( | ) | + | - | * | / | i | $
-----+---+---+---+---+---+---+---+---
E | E -> TG | | | | E -> TG | | E -> TG |
-----+---+---+---+---+---+---+---+---
G | | G -> ε | G -> +TG | G -> -TG | | | G -> ε |
-----+---+---+---+---+---+---+---+---
T | T -> FM | | | | | | T -> FM |
-----+---+---+---+---+---+---+---+---
M | | M -> ε | | | M -> *FM | M -> /FM | M -> ε |
-----+---+---+---+---+---+---+---+---
F | F -> (E) | | | | | | F -> i |
```
预测分析表的行表示文法中的非终结符,列表示输入符号集合。表格中的每个元素都是一个产生式。例如,表格中的第一个元素 E -> TG 表示在分析 E 时,如果输入符号是 ( 或 i,则根据 E 的产生式 E -> TG 推导出 T 和 G,分别对应表格中的第一行和第二行。
最后,我们可以使用该预测分析表对任意输入的符号串进行分析,得到该符号串是否是该文法的句子。具体步骤如下:
1. 将输入符号串和 $(文法结束符)压入栈中。
2. 取出栈顶符号和输入符号串的第一个符号。
3. 如果栈顶符号是终结符,则比较栈顶符号和输入符号是否相同。如果相同,则弹出栈顶符号和输入符号。如果不同,则无法推导出该符号串,分析失败。
4. 如果栈顶符号是非终结符,则查找预测分析表中该非终结符和输入符号的交叉点。如果该点为空,则无法推导出该符号串,分析失败。如果该点是一个产生式 A -> α,则将该产生式右侧的符号逆序压入栈中。
5. 重复步骤 2-4,直到栈为空或者分析失败。
如果分析成功,则说明该符号串是该文法的句子。如果分析失败,则说明该符号串不是该文法的句子。
阅读全文