编译原理:递归向下分析程序建立语法分析树的Java实现(一)
2017-12-07 20:40
1051 查看
考虑如下的源语言
消除first-first冲突和first-follow冲突后的文法:
1) program -> block
2) block -> {decls stmts}
3) decls -> decl decls | ε
4) decl -> type id;
5) type -> basic | type’
6) type’ -> [num]type’ | ε
7) basic -> int | bool
8) stmts -> stmt stmts | ε
9) stmt -> loc = bexpr;
| if (bexpr) stmt elsmt
| while (bexpr) stmt
| do stmt while (bexpr);
| break;
| block
10) elsmt -> else stmt | ε
11) loc -> id loc’
12) loc’ -> [aexpr]loc’ | ε
13) bexpr -> join bexpr’
14) bexpr’ -> || join bexpr’ | ε
15) join -> equality join’
16) join’ -> && equality join’ | ε
17) equality -> rel equality’
18) equality’ -> == rel equality’ | != rel equality’ | ε
19) rel -> aexpr rel’
20) rel’ -> < aexpr | <= aexpr | >= aexpr | > aexpr | ε
21) aexpr -> term aexpr’
22) aexpr’ -> +term aexpr’ | -term aexpr’ | ε
23) term -> unary term’
24) term’ -> *unary term’ | /unary term’ | ε
25) unary -> !unary | -unary | factor
26) factor -> (bexpr) | loc | num | true | false
计算first集:
1) program: {{}
2) block: {{}
3) decls: {ε, int, bool}
4) decl: {int, bool}
5) type: {int, bool}
6) type’: {ε, [}
7) basic: {int, bool}
8) stmts: {ε, if, while, do, break, {, id}
9) stmt: {if, while, do, break, {, id}
10) elsmt: {ε, else}
11) loc: {id}
12) loc’: {ε, []
13) bexpr: {!, -, (, true, false, num, id}
14) bexpr’: {ε, ||}
15) join: {!, -, (, true, false, num, id}
16) join’: { ε, &&}
17) equality: {!, -, (, true, false, num, id}
18) equality’: {ε, !=, ==}
19) rel: {!, -, (, true, false, num, id}
20) rel’: {ε, <, <=, >, >=}
21) aexpr: {!, -, (, true, false, num, id}
22) aexpr’: {ε, +, -}
23) term: {!, -, (, true, false, num, id}
24) term’: {ε, *, /}
25) unary: {!, -, (, true, false, num, id}
26) factor: {(, true, false, num, id)
通过消除左递归或提取左公因子改写文法,避免first-first冲突同时计算所有改写后产生式的first集,通过删除部分语句消除first-follow冲突得到LL(1)文法
消除first-first冲突和first-follow冲突后的文法:
1) program -> block
2) block -> {decls stmts}
3) decls -> decl decls | ε
4) decl -> type id;
5) type -> basic | type’
6) type’ -> [num]type’ | ε
7) basic -> int | bool
8) stmts -> stmt stmts | ε
9) stmt -> loc = bexpr;
| if (bexpr) stmt elsmt
| while (bexpr) stmt
| do stmt while (bexpr);
| break;
| block
10) elsmt -> else stmt | ε
11) loc -> id loc’
12) loc’ -> [aexpr]loc’ | ε
13) bexpr -> join bexpr’
14) bexpr’ -> || join bexpr’ | ε
15) join -> equality join’
16) join’ -> && equality join’ | ε
17) equality -> rel equality’
18) equality’ -> == rel equality’ | != rel equality’ | ε
19) rel -> aexpr rel’
20) rel’ -> < aexpr | <= aexpr | >= aexpr | > aexpr | ε
21) aexpr -> term aexpr’
22) aexpr’ -> +term aexpr’ | -term aexpr’ | ε
23) term -> unary term’
24) term’ -> *unary term’ | /unary term’ | ε
25) unary -> !unary | -unary | factor
26) factor -> (bexpr) | loc | num | true | false
计算first集:
1) program: {{}
2) block: {{}
3) decls: {ε, int, bool}
4) decl: {int, bool}
5) type: {int, bool}
6) type’: {ε, [}
7) basic: {int, bool}
8) stmts: {ε, if, while, do, break, {, id}
9) stmt: {if, while, do, break, {, id}
10) elsmt: {ε, else}
11) loc: {id}
12) loc’: {ε, []
13) bexpr: {!, -, (, true, false, num, id}
14) bexpr’: {ε, ||}
15) join: {!, -, (, true, false, num, id}
16) join’: { ε, &&}
17) equality: {!, -, (, true, false, num, id}
18) equality’: {ε, !=, ==}
19) rel: {!, -, (, true, false, num, id}
20) rel’: {ε, <, <=, >, >=}
21) aexpr: {!, -, (, true, false, num, id}
22) aexpr’: {ε, +, -}
23) term: {!, -, (, true, false, num, id}
24) term’: {ε, *, /}
25) unary: {!, -, (, true, false, num, id}
26) factor: {(, true, false, num, id)
通过消除左递归或提取左公因子改写文法,避免first-first冲突同时计算所有改写后产生式的first集,通过删除部分语句消除first-follow冲突得到LL(1)文法
相关文章推荐
- 编译原理:递归向下分析程序建立语法分析树的Java实现(二)
- 编译原理:使用flex和bison工具实现语法分析树的建立
- 编译原理 实验3 递归下降语法分析程序设计
- 编译原理语法分析实验(Java实现)
- 编译原理动手实操,用java实现一个简易编译器-语法解析
- 编译原理实习(应用预测分析法LL(1)实现语法分析)
- 编译原理语法分析对循环语句和条件判断语句编写词法分析编译程序,只能通过一遍扫描完成
- 编译原理-用Bison构造语法分析程序-二进制转换十进制
- 关于Basic程序解释器及编译原理的简单化(1)---Basic器的语法分析及主要代码
- 设计有穷自动机DFA实现C++简单程序的词法分析、扫描(编译原理实验) 推荐
- 编译原理丨第十三周 ——1000. 输入输出LL(1)语法分析程序
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
- 编译原理语法分析(java)
- 用JAVA实现LL(1)文法语法分析程序
- 编译原理——语法分析程序的设计
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
- 【编译原理】语法分析——自上向下分析
- 关于Basic程序解释器及编译原理的简单化(1)---Basic器的语法分析及主要代码
- 编译原理动手实操,用java实现编译器-算术表达式及其语法解析器的实现
- 编译原理,自上而下非递归语法分析自上而下的语法分析