根据文法(0)E'→E(1)E→E+T(2)E→T(3)T→TF(4)T→F(5)F→(E)(6)F→id给出串id*id+id分析过程的状态栈,符号栈,输入串,动作,输出,格式为最右
时间: 2024-05-19 11:11:36 浏览: 22
1. 状态栈:0
2. 符号栈:$
3. 输入串:id*id+id$
4. 动作:Shift (移入id)
5. 输出:状态栈:0 1;符号栈:$ id;输入串:*id+id$;
6. 动作:Shift (移入*)
7. 输出:状态栈:0 1 2;符号栈:$ id *;输入串:id+id$;
8. 动作:Shift (移入id)
9. 输出:状态栈:0 1 2 1;符号栈:$ id * id;输入串:+id$;
10. 动作:Reduce by T → F
11. 输出:状态栈:0 1 2 3;符号栈:$ id * F;输入串:+id$;
12. 动作:Reduce by E → T
13. 输出:状态栈:0 1;符号栈:$ E;输入串:+id$;
14. 动作:Shift (移入+)
15. 输出:状态栈:0 1 4;符号栈:$ E +;输入串:id$;
16. 动作:Shift (移入id)
17. 输出:状态栈:0 1 4 1;符号栈:$ E + id;输入串:$;
18. 动作:Reduce by T → F
19. 输出:状态栈:0 1 4 3;符号栈:$ E + F;输入串:$;
20. 动作:Reduce by E → E + T
21. 输出:状态栈:0;符号栈:$ E;输入串:$;
22. 动作:Accept
相关问题
根据如下文法(0)E'→E(1)E→E+T(2)E→T(3)T→TF(4)T→F(5)F→(E)(6)F→id,给出串id*id+id的分析 过程,格式为最右
推导式,使用下推自动机进行分析。
步骤如下:
1. 初始化栈,并将 E' 和 $ 压入栈中。
2. 读入输入串 id*id+id,第一个字符为 i,栈顶为 E'。
3. 查找状态转移表,根据当前状态和输入字符确定下一个状态和操作。
- 当前状态为 0,输入字符为 i,查找表项 (0, i),下一个状态为 3,操作为 Shift。
4. 将状态 3 和字符 i 压入栈中,栈顶为 E' i E。
5. 读入下一个字符 d,栈顶为 E' i E。
6. 查找状态转移表,根据当前状态和输入字符确定下一个状态和操作。
- 当前状态为 3,输入字符为 d,查找表项 (3, d),下一个状态为 4,操作为 Shift。
7. 将状态 4 和字符 d 压入栈中,栈顶为 E' i E d T。
8. 读入下一个字符 *,栈顶为 E' i E d T。
9. 查找状态转移表,根据当前状态和输入字符确定下一个状态和操作。
- 当前状态为 4,输入字符为 *,查找表项 (4, *),下一个状态为 5,操作为 Shift。
10. 将状态 5 和字符 * 压入栈中,栈顶为 E' i E d T * F。
11. 读入下一个字符 i,栈顶为 E' i E d T * F。
12. 查找状态转移表,根据当前状态和输入字符确定下一个状态和操作。
- 当前状态为 5,输入字符为 i,查找表项 (5, i),下一个状态为 3,操作为 Reduce(5)。
- Reduce(5) 表示使用推导式 F → id,将栈顶的 F 替换为 id。
13. 根据推导式 F → id,弹出栈顶的 F,将 id 压入栈中,栈顶为 E' i E d T * id。
14. 查找状态转移表,根据当前状态和栈顶符号确定下一个状态和操作。
- 当前状态为 3,栈顶符号为 E,查找表项 (3, E),下一个状态为 6,操作为 Shift。
15. 将状态 6 和符号 E 压入栈中,栈顶为 E' i E d T * id E。
16. 查找状态转移表,根据当前状态和输入字符确定下一个状态和操作。
- 当前状态为 6,输入字符为 +,查找表项 (6, +),下一个状态为 7,操作为 Shift。
17. 将状态 7 和字符 + 压入栈中,栈顶为 E' i E d T * id E +。
18. 读入下一个字符 i,栈顶为 E' i E d T * id E +。
19. 查找状态转移表,根据当前状态和输入字符确定下一个状态和操作。
- 当前状态为 7,输入字符为 i,查找表项 (7, i),下一个状态为 3,操作为 Reduce(3)。
- Reduce(3) 表示使用推导式 E → E + T,将栈顶的 E + T 替换为 E。
20. 根据推导式 E → E + T,弹出栈顶的 + 和 T,将 E 压入栈中,栈顶为 E' i E d T * id E.
21. 查找状态转移表,根据当前状态和栈顶符号确定下一个状态和操作。
- 当前状态为 6,栈顶符号为 E,查找表项 (6, E),下一个状态为 8,操作为 Shift。
22. 将状态 8 和符号 E 压入栈中,栈顶为 E' i E d T * id E E。
23. 查找状态转移表,根据当前状态和输入字符确定下一个状态和操作。
- 当前状态为 8,输入字符为 $,查找表项 (8, $),下一个状态为 9,操作为 Accept。
24. 分析结束,输出最右推导式 E' → E → E + T → E + F → E + id → id * id + id。
根据文法(0)E'→E(1)E→E+T(2)E→T(3)T→TF(4)T→F(5)F→(E)(6)F→id给出串id*id+id分析过程的状态栈,符号栈,输入串,动作,输出,
假设我们使用 LR(0) 分析方法。
状态栈:[0]
符号栈:[$]
输入串:id*id+id$
动作:
(1)移进状态1,将 id 移入符号栈中,状态栈变为 [0,1],符号栈变为 [$,id]
(2)移进状态3,将 * 移入符号栈中,状态栈变为 [0,1,3],符号栈变为 [$,id,*]
(3)移进状态4,将 id 移入符号栈中,状态栈变为 [0,1,3,4],符号栈变为 [$,id,*,id]
(4)规约 T→id,弹出符号栈中的 id 和 T,将 T 移入符号栈中,状态栈变为 [0,1,3],符号栈变为 [$,T,*]
(5)移进状态5,将 + 移入符号栈中,状态栈变为 [0,1,3,5],符号栈变为 [$,T,*,+]
(6)移进状态4,将 id 移入符号栈中,状态栈变为 [0,1,3,5,4],符号栈变为 [$,T,*,+,id]
(7)规约 T→id,弹出符号栈中的 id 和 T,将 T 移入符号栈中,状态栈变为 [0,1,3,5],符号栈变为 [$,T,*,+]
(8)移进状态4,将 id 移入符号栈中,状态栈变为 [0,1,3,5,4],符号栈变为 [$,T,*,+,id]
(9)规约 T→id,弹出符号栈中的 id 和 T,将 T 移入符号栈中,状态栈变为 [0,1,3,5],符号栈变为 [$,T,*]
(10)规约 E→E+T,弹出符号栈中的 +、T 和 E,将 E 移入符号栈中,状态栈变为 [0,1],符号栈变为 [$,E]
(11)移进状态2,将 * 移入符号栈中,状态栈变为 [0,1,2],符号栈变为 [$,E,*]
(12)移进状态4,将 id 移入符号栈中,状态栈变为 [0,1,2,4],符号栈变为 [$,E,*,id]
(13)规约 T→id,弹出符号栈中的 id 和 T,将 T 移入符号栈中,状态栈变为 [0,1,2],符号栈变为 [$,E,*]
(14)规约 E→T,弹出符号栈中的 T 和 E,将 E 移入符号栈中,状态栈变为 [0,1],符号栈变为 [$,E]
(15)移进状态2,将 + 移入符号栈中,状态栈变为 [0,1,2],符号栈变为 [$,E,+]
(16)移进状态4,将 id 移入符号栈中,状态栈变为 [0,1,2,4],符号栈变为 [$,E,+,id]
(17)规约 T→id,弹出符号栈中的 id 和 T,将 T 移入符号栈中,状态栈变为 [0,1,2],符号栈变为 [$,E,+]
(18)规约 E→E+T,弹出符号栈中的 +、T 和 E,将 E 移入符号栈中,状态栈变为 [0],符号栈变为 [$,E]
(19)规约 E'→E,弹出符号栈中的 E' 和 E,分析结束。
输出:分析成功,输入串符合文法规则。
阅读全文