编译原理:递归向下分析程序建立语法分析树的Java实现(一)

来源:互联网 发布:涂师傅数据恢复 编辑:程序博客网 时间:2024/06/04 18:16

考虑如下的源语言

消除first-first冲突和first-follow冲突后的文法:

1)program -> block2)block -> {decls stmts}3)decls -> decl decls | ε4)decl -> type id;5)type -> basic | type’6)type’ -> [num]type’ | ε7)basic -> int | bool8)stmts -> stmt stmts | ε9)stmt -> loc = bexpr;| if (bexpr) stmt elsmt| while (bexpr) stmt| do stmt while (bexpr);| break;| block10)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 | factor26)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)文法


阅读全文
0 0
原创粉丝点击