您的位置:首页 > 编程语言 > Java开发

编译原理:递归向下分析程序建立语法分析树的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)文法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐