Compiler---Thesisandcode

所属分类:编译器/解释器
开发工具:Visual C++
文件大小:1454KB
下载次数:217
上传日期:2009-03-11 11:59:48
上 传 者1SecBlank
说明:  参照龙书编写的编译器,包括词法分析器,语法分析器,和生成三地址码的中间代码生成器。文件中包含代码和三篇论文。
(Reference book written long compilers, including lexical analyzer, parser, and generate three address code between the code generator. File contains code and thesis 3.)

文件列表:
定稿论文\论文一:词法分析器.doc (241152, 2009-03-04)
定稿论文\论文三:中间代码生成.doc (240640, 2009-03-04)
定稿论文\论文二:语法分析器.doc (144896, 2009-03-04)
生成三地址码的Compiler\Compiler\Compiler\Bi_buf.cpp (3083, 2009-02-01)
生成三地址码的Compiler\Compiler\Compiler\Bi_buf.h (1420, 2009-02-12)
生成三地址码的Compiler\Compiler\Compiler\code.fc (214, 2009-03-02)
生成三地址码的Compiler\Compiler\Compiler\Compiler.cpp (335, 2009-02-27)
生成三地址码的Compiler\Compiler\Compiler\Compiler.vcproj (5063, 2009-02-27)
生成三地址码的Compiler\Compiler\Compiler\Compiler.vcproj.vspscc (256, 2009-02-27)
生成三地址码的Compiler\Compiler\Compiler\Compiler.vcproj.WangJia-PC.WangJia.user (1417, 2009-03-03)
生成三地址码的Compiler\Compiler\Compiler\Debug\Bi_buf.obj (84754, 2009-03-02)
生成三地址码的Compiler\Compiler\Compiler\Debug\BuildLog.htm (6420, 2009-03-03)
生成三地址码的Compiler\Compiler\Compiler\Debug\Compiler.exe.embed.manifest (405, 2009-03-02)
生成三地址码的Compiler\Compiler\Compiler\Debug\Compiler.exe.embed.manifest.res (472, 2009-03-02)
生成三地址码的Compiler\Compiler\Compiler\Debug\Compiler.exe.intermediate.manifest (387, 2009-03-03)
生成三地址码的Compiler\Compiler\Compiler\Debug\Compiler.obj (27830, 2009-03-03)
生成三地址码的Compiler\Compiler\Compiler\Debug\Compiler.pch (1048576, 2009-03-02)
生成三地址码的Compiler\Compiler\Compiler\Debug\Id_table.obj (280897, 2009-03-02)
生成三地址码的Compiler\Compiler\Compiler\Debug\lexer.obj (161189, 2009-03-02)
生成三地址码的Compiler\Compiler\Compiler\Debug\mt.dep (63, 2009-03-03)
生成三地址码的Compiler\Compiler\Compiler\Debug\parser.obj (919211, 2009-03-03)
生成三地址码的Compiler\Compiler\Compiler\Debug\stdafx.obj (10555, 2009-03-02)
生成三地址码的Compiler\Compiler\Compiler\Debug\vc80.idb (289792, 2009-03-03)
生成三地址码的Compiler\Compiler\Compiler\Debug\vc80.pdb (323584, 2009-03-03)
生成三地址码的Compiler\Compiler\Compiler\Id_table.cpp (1165, 2009-03-02)
生成三地址码的Compiler\Compiler\Compiler\Id_table.h (744, 2009-03-02)
生成三地址码的Compiler\Compiler\Compiler\lexer.cpp (5688, 2009-02-16)
生成三地址码的Compiler\Compiler\Compiler\lexer.h (980, 2009-02-12)
生成三地址码的Compiler\Compiler\Compiler\mssccprj.scc (132, 2009-02-27)
生成三地址码的Compiler\Compiler\Compiler\parser.cpp (16897, 2009-03-02)
生成三地址码的Compiler\Compiler\Compiler\parser.h (3616, 2009-03-03)
生成三地址码的Compiler\Compiler\Compiler\stdafx.cpp (213, 2009-02-27)
生成三地址码的Compiler\Compiler\Compiler\stdafx.h (378, 2009-02-27)
生成三地址码的Compiler\Compiler\Compiler\vssver2.scc (424, 2009-03-03)
生成三地址码的Compiler\Compiler\Compiler.ncb (1723392, 2009-03-03)
生成三地址码的Compiler\Compiler\Compiler.sln (1086, 2009-02-27)
生成三地址码的Compiler\Compiler\Compiler.suo (29184, 2009-03-03)
生成三地址码的Compiler\Compiler\Compiler.vssscc (256, 2009-02-27)
生成三地址码的Compiler\Compiler\debug\Compiler.exe (258048, 2009-03-03)
... ...

////////////////////////////////////////////////////////////////////////// //------------第一次签入记录---------------// 2009-01-31 0:40 词法分析器完成 能输出二元式组,输出完后瘫痪 输出的二元式组有问题(至少有符号表相关的问题) 还没有来得及写注释 总共587行 //------------第一次签入记录---------------// ////////////////////////////////////////////////////////////////////////// //------------第二次签入记录---------------// 2009-02-01 1:00 词法分析器纠错 能输出正确的二元式组 {另注: 昨天的错误是因为匹配‘(’类似的单字符之后,缓冲区的两个指针没有统一 因为统一只有在空白符的处理分支里有,和在标志符的get_lexeme的标志符里有, 所以当(int出现时,int本应是词素,但却因为‘(’没有被lexeme_beginning过掉而变成了(int词素 } 输出完成后瘫痪,是因为不能正确处理EOF字符;为了测试,暂时如此(主函数里写了个while(1)) 依然没来得及写注释 因为测试用的源代码太短,实际上只用了一个缓冲区,双缓冲区未经测试 //------------第二次签入记录---------------// //------------第三次签入记录---------------// 构建基于带回溯的递归下降分析法的语法分析器 语法如下: 1.program --> declaration-list 2.declaration-list --> declaration declaration-list | declaration 4.declaration --> var-declaration | fun-declaration 5.var-declaration --> “int” ID; 6.fun-declaration --> type-specifier ID (params) compound-stmt | type-specifier ID () compound-stmt 7.type-specifier --> "int" | "void" 8.params --> param params’ 9.params’ --> , param params’ | empty 10.param --> “int” ID 11.compound-stmt --> {local-declarations statement-list} 12.local-declarations --> var-declaration local-declarations | empty 13.statement-list --> statement statement-list | empty 14.statement --> expression-stmt | compound-stmt | selection-stmt | iteration-stmt | return-stmt 15.expression-stmt --> expression; | ; 16.selection-stmt --> "if" (expression) statement | “if” (expression) statement “else” statement 17.iteration-stmt --> "while" (expression) statement 18.return-stmt --> “return”; | “return” expression; 19.expression --> ID = expression | simple-expression 20.simple-expression --> additive-expression RELOP additive-expression | additive-expression 21.additive-expression --> term additive-expression' 22.additive-expression' --> ADDOP term additive-expression' | empty 23.term --> factor term' 24.term' --> MULOP factor term' | empty 25.factor --> (expression) | ID | call | NUM 26.call --> ID (args) | ID () 27.args --> expression args' 28.args' --> ,expression args' | empty 语法分析器构造完毕,与词法分析器的接口正常工作(可在调试时跟踪tokens容器,符号表对象和词素表对象) 语法分析不显示构造分析树,调用函数的过程即是分析树(对语法分析器的调试即是测试) 先前的词法分析器做了以下改动: 1. 能够处理文件结束的情况,state==0时加入一个抛出异常的cur == -52的检测 2. 返回 这样的二元组,而非返回 <'+', 0> 这样做是为了简化语法分析器的语法定义 2009-2-16 18:05 测试成功,签入 //------------第三次签入记录---------------// //------------第四次签入记录---------------// 改写语法分析器,使其输出语法树 生成语法树的翻译模式如下 1.program --> declaration-list { program.nptr := declaration-list.nptr } 2.declaration-list --> declaration declaration-list1 { declaration-list.nptr := mknode(“”, declaration.nptr, declaration-list1.nptr) } | declaration1 { declaration.nptr := declaration1.nptr } 3.declaration --> var-declaration { declaration.nptr := var-declaration.nptr } | fun-declaration { declaration.nptr := fun-declaration.nptr } 4.var-declaration --> “int”ID; { var-declaration.nptr := mknode(“int”, mkleaf(“id”, id.place)) } 5.fun-declaration --> type-specifier ID (params) compound-stmt { fun-declaration.nptr := mknode(“()”, type-specifier.nptr, mkleaf(“id”, id.place), params.nptr, compound-stmt.nptr) } | type-specifier ID () compound-stmt { fun-declaration.nptr := mknode(“()”, type-specifier.nptr, mkleaf(“id”, id.place), compound-stmt.nptr) } 6.type-specifier --> "int" { type-specifier.nptr := mknode(“int”, -1) } | "void" { type-specifier.nptr := mknode(“void”, -1) } 7. params --> param { paramsR.i := param.nptr } paramsR { params.nptr := paramsR.nptr } 8. paramsR --> , param { paramsR1.i := mknode(“,”, paramsR.i, param.nptr) } paramsR1 { paramsR.nptr := paramsR1.nptr } | empty { paramsR.nptr := paramsR.i } 9.param --> “int”ID { param.nptr := mknode(“int”, mkleaf(“id”, id.place)) } 10.compound-stmt --> {local-declarations statement-list} { compound-stmt.nptr := mknode(“{}”, local-declarations.nptr, statement-list.nptr) } 11.local-declarations --> var-declaration local-declarations { local-declarations.nptr := mknode(“”, var-declaration.nptr, local-declarations.nptr) } | empty { local-declarations.nptr := -1 } 12.statement-list --> statement statement-list { statement-list.nptr := mknode(“”, statement.nptr, statement-list.nptr) } | empty { statement-list.nptr := -1 } 13.statement --> expression-stmt { statement.nptr := expression-stmt.nptr } | compound-stmt { statement.nptr := compound-stmt.nptr } | selection-stmt { statement.nptr := selection-stmt.nptr } | iteration-stmt { statement.nptr := iteration-stmt.nptr } | return-stmt { statement.nptr := return-stmt.nptr } 14.expression-stmt --> expression; { expression-stmt.nptr := mknode(“;”, expression.nptr) } | ; { expression-stmt.nptr := mknode(“;”, -1) } 15.selection-stmt --> "if" (expression) statement { selection-stmt.nptr := mknode(“if()”, expression.nptr, statement.nptr) } | “if”(expression) statement1 “else”statement2 { selection-stmt.nptr := mknode(“if()else”, expression.nptr, statement1.nptr, statement2.nptr) } 16.iteration-stmt --> "while" (expression) statement { iteration-stmt.nptr := mknode(“while()”, expression.nptr, statement.nptr) } 17.return-stmt --> “return”; { return-stmt.nptr := mknode(“return;”, -1) } | “return”expression; { return-stmt.nptr := mknode(“return;”, expression.nptr) } 18.expression --> ID = expression1 { expression.nptr := mknode(“=”, mkleaf(“id”, id.place), expression1.nptr) } | simple-expression { expression.nptr := simple-expression.nptr } 19.simple-expression --> additive-expression1 RELOP additive-expression2 { simple-expression.nptr := mknode(“RELOP”, additive-expression1.nptr, additive-expression2.nptr) } | additive-expression { simple-expression.nptr := additive-expression.nptr } 20.additive-expression --> term { additive-expressionR.i := term.nptr } additive-expressionR { additive-expression.nptr := additive-expressionR.nptr } 21. additive-expressionR --> ADDOP term { additive-expressionR1.i := mknode(“ADDOP”, additive-expressionR.i, term.nptr) } additive-expressionR1 { additive-expressionR.nptr := additive-expressionR1.nptr } | empty { additive-expressionR.nptr := additive-expressionR.i } 22. term --> factor { termR.i := factor.nptr } termR { term.nptr := termR.nptr } 23. termR --> MULOP factor { termR1.i := mknode(“MULOP”, termR.i, factor.nptr) } termR1 { termR.nptr := termR1.nptr } | empty { termR.nptr := termR.i } 24.factor --> (expression) { factor.nptr := expression.nptr } | ID { factor.nptr := mkleaf(“id”, id.place) } | call { factor.nptr := call.nptr } | NUM { factor.nptr := mkleaf(“num”, num.value) } 25.call --> ID (args) { call.nptr := mknode(“()”, mkleaf(“id”, id.place), args.nptr) } | ID () { call.nptr := mknode(“()”, mkleaf(“id”, id.place)) } 26. args --> expression { argsR.i := expression.nptr } argsR { args.nptr := argsR.nptr } 27. argsR --> , expression { argsR1.i := mknode(“,”, argsR.i, expression.nptr) } argsR1 { argsR.nptr := argsR1.nptr } | empty { argsR.nptr := argsR.i } RELOP, ADDOP, MULOP在翻译时需要翻译成具体的符号---->已完成! 2009-2-27 完成预期目的,能够顺利生成语法树,签入! //------------第四次签入记录---------------// 全局变量Par_table_chain 全局变量 Quads_code 1.program --> { Par_table_chain.mktable() } declaration-list 2.declaration-list --> declaration declaration-list1 | declaration1 3.declaration --> var-declaration | { Par_table_chain.mktable() } fun-declaration {Par_table_chain.jumpout()} 4.var-declaration --> “int”ID; { Par_table_chain.enter(ID.name, "int", 4) } 5.fun-declaration --> type-specifier ID { Par_table_chain.set_name_type(ID.name, type-specifier.type)} {Par_table_chain.add_to_previous()}{ Quads_code.gen_entry(ID.name) } (params) compound-stmt | type-specifier ID { Par_table_chain.set_name_type(ID.name, type-specifier.type)} { Quads_code.gen_entry(ID.name) } () compound-stmt 6.type-specifier --> "int" { type-specifier.type := "int"} | "void" { type-specifier.type := "void"} 7.params --> param, params | param 8. param --> "int" ID { Par_table_chain.enter(ID.name, "int", 4) } {Quads_code.gen_param_load(Par_table_chain, "load", ID.name)} 9.compound-stmt --> {local-declarations statement-list} 10.local-declarations --> var-declaration local-declarations | empty 12.statement-list --> statement statement-list | empty 13.statement --> expression-stmt | selection-stmt | iteration-stmt | return-stmt | { Par_table_chain.mktable() } {Par_table_chain.add_to_previous()}compound-stmt { Par_table_chain.jumpout() } 14.expression-stmt --> expression; | ; 15.selection-stmt --> "if" ( { to_true := newlabel; to_false := newlabel } {condition-expression.to_true := to_true} {condition-expression.to_false := to_false} condition-expression) {Quads_code.gen_label(to_true)} statement {Quads_code.gen_label(to_false)} | "if" ( { to_true := newlabel; to_false := newlabel } {condition-expression.to_true := to_true} {condition-expression.to_false := to_false} condition-expression) {Quads_code.gen_label(to_true)} statement1 {to_next = newlabel} “else”{Quads_code.gen_goto(to_next)} {Quads_code.gen_label(to_false)} statement2 {Quads_code.gen_label(to_next)} 16.iteration-stmt --> "while" ( {to_begin := newlabel} {Quads_code.gen_label(to_begin)} { to_true := newlabel; to_false := newlabel } {condition-expression.to_true := to_true} {condition-expression.to_false := to_false} condition-expression) {Quads_code.gen_label(to_true)} statement {Quads_code.gen_goto(to_begin)} {Quads_code.gen_label(to_false)} 19.condition-expression --> additive-expression1 RELOP additive-expression2 { Quads_code.gen_condition(Par_table_chain, RELOP.name, additive-expression1.name, additive-expression2.name, condition-expression.to_true)} { Quads_code.gen_goto(condition-expression.to_false)} 17.return-stmt --> “return”; { Quads_code.gen_uni("return") } | “return”expression; {Quads_code.gen_param_load(Par_table_chain, "return", expression.name)} 18.expression --> ID = expression1 { Quads_code.gen_bi(Par_table_chain, ID.name, expression1.name)} {expression.name := ID.name} | additive-expression { expression.name := additive-expression.name } 20. additive-expression --> term {additive-expressionR.i := term.name} additive-expressionR {additive-expression.name := additive-expressionR.s} additive-expressionR --> ADDOP term {additive-expressionR.n := newtemp} {Par_table_chain.enter(additive-expressionR.n, "int", 4)} {Quads_code.gen_tri(Par_table_chain, ADDOP.name, additive-expressionR.n, additive-expressionR.i, term.name)} {additive-expressionR1.i := additive-expressionR.n} additive-expressionR1 {additive-expressionR.s := additive-expressionR1.s} additive-expressionR --> empty {additive-expressionR.s := additive-expressionR.i} 21. term --> factor {termR.i := factor.name} termR {term.name := termR.s} termR --> MULOP factor {termR.n := newtemp} {Par_table_chain.enter(termR.n, "int", 4)} {Quads_code.gen_tri(Par_table_chain, MULOP.name, termR.n, termR.i, factor.name)} {termR1.i := termR.n} termR1 {termR.s := termR1.s} termR --> empty {termR.s := termR.i} 22.factor --> (additive-expression) { factor.name := additive-expression.name} | ID {factor.name := ID.name} | call {factor.name := call.name} | NUM { factor.name := int_to_str(NUM.value) } 23.call --> ID ( {call.name := newtemp } { Par_table_chain.enter(call.name, "int", 4) }{ Quads_code.gen_uni("begin_args")} args ) { Quads_code.gen_call(Par_table_chain, ID.name) } | ID ( {call.name := newtemp } { Par_table_chain.enter(call.name, "int", 4)} {Quads_code.gen_uni("begin_args")} ) { Quads_code.gen_call(Par_table_chain, ID.name) } 24. args --> additive-expression { Quads_code.gen_param_load(Par_table_chain, "param", additive-expression.name) } , args | additive-expression { Quads_code.gen_param_load(Par_table_chain, "param", additive-expression.name) }

近期下载者

相关文件


收藏者