首页 大连理工大学编译原理实验报告

大连理工大学编译原理实验报告

举报
开通vip

大连理工大学编译原理实验报告大连理工大学编译原理实验报告 编译原理实验报告 课 程 名 称: 编译原理课程设计 考试形式: 实验报告 授课院 (系): 软件学院 交作业日期: 2013 年 7 月 26 日 共 19 页 班级: 学号: 姓 名: 联系方式:电子邮件: 手机号码: 上机检查 出勤 实验报告(二) 实验报告(三) 总分 标准分 70 10 15 5 100 得 分 一、上机实验检查(总计70分): (1)分离解释和编译器(10分): 将解释器从已有代码中分离出来,形成一个独立的解释器,对于中间代码文件,可以执行并输出...

大连理工大学编译原理实验报告
大连理工大学编译原理实验 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 编译原理实验报告 课 程 名 称: 编译原理课程 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 考试形式: 实验报告 授课院 (系): 软件学院 交作业日期: 2013 年 7 月 26 日 共 19 页 班级: 学号: 姓 名: 联系方式:电子邮件: 手机号码: 上机检查 出勤 实验报告(二) 实验报告(三) 总分 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 分 70 10 15 5 100 得 分 一、上机实验检查(总计70分): (1)分离解释和编译器(10分): 将解释器从已有代码中分离出来,形成一个独立的解释器,对于中间代码文件,可以执行并输出相应的结果。 (2)注释处理(10): 增加对注释的支持,注释由 (* 和 *)包含,不允许嵌套。 (3)布尔数据处理(10分): 增加对于布尔类型的支持,其产生式见《编译原理实践教程》。 (4)布尔表达式的短路处理(10分): 在上面工作的基础上,对 and 和 or 采取短路计算。 (5)for 语句处理(10分): 参照,语言,增加对于 for 语句处理。 (6)编译器界面实现(10分): 增加界面实现,以可视化方法展示编译器运行过程。 (7) 编译器界面动画实现(10分): 增加界面动画实现,以动态可视化方法展示编译器运行过程。 二、完成情况(15分): 一、完成情况(15分): 1. 修改后的PL/0词法(正规式) 下面是本设计用到的正规式,bool 类型的常量与变量都是通过保留字来体现的, number 只是用于识别整型变量与常量。 空白 w->’ ’; //空格 n->\n; //回车 t->Tab; //制表 blank -> (w | n | t)+; - 1 - 保留字 begin ->begin; //保留字 end -> end; if -> if; then -> then; while -> while; do -> do; call->call; const -> const; var -> var; procedure -> procedure; boolean ->boolean; bool ->true|false;//布尔常量 数字以及 ID digit -> 0|1|2|3|4|5|6|7|8|9; number -> digit(digit)*; letter -> a-zA-Z; id -> letter (digit|letter)*; 特殊符号 becomes->:=; leq-> ‘<=’; les -> ’<’; req-> ‘>=’; res -> ‘>’; relation -> = | <= | >= | > | < ;//关系运算符 plus -> ‘+’; minus-> ‘-’; times -> ‘*’; slash -> ‘/’; odd -> ‘odd’; equ ->’=’; lparen ->’(’; rparen -> ‘)’; comma -> ‘,’; semicolon -> ‘;’; period -> ‘.’; and -> ‘&’; or -> ‘|’; not -> ‘!’; 详情如下表: - 2 - 空白 w ‘ ’ 空格 n ‘\n’ 回车 t ‘\t’ Tab blank (w|n|t)+ 关键字 began began end end if if then then while while do do call call const const var var procedure procedure boolean boolean bool false|true 数字|ID digit 1|2|3|4|5|6|7|8|9|0 number digit(digit)* letter a-zA-Z id letter(letter|digit)* 特殊符号 becomes := leq <= les < req >= res > relation =|>=|<=|>|< plus + minus - times * slash / odd odd equ = lparen ( rparen ) comma , semicolon ; period . and & or || not ! - 3 - Program -> Block . Block -> Const_decl | Var_option | Procedures |Statement| Block|ε Procedure_decl -> procedure identifier; Block; Procedures -> Procedure_decl Procedures |ε Const_decl -> const Const_menber |ε > ident=number, Const_menber | ident=number; Const_menber - Var_option -> var Var_decl_list |ε Var_decl_list -> Var_decl | Var_decl_list Var_decl > Ident_list : Type Var_decl - Ident_list -> ident,Ident_list | identifier Type -> integer | bool Statement -> ident:=Condition; Statement -> call identifier; Statement -> begin Statements end Statements -> Statement Statements |ε Statement -> for ident:= Expression to Expression do Statement Statement -> if Condition then Statement Statement -> while Condition do Statement Condition -> odd Expression| Expression Condition ->Expression Compare Expression_1 | Expression Compare -> >= | > | <= | <> | < Expression -> Expression or Expression_1 | Expression_1 Expression_1 -> Expression_1 and Expression_2 | Expression_2 Expression_2 -> Expression_2+ Symbol Term | Expression_2 - Symbol Term |Symbol Term Symbol -> + | - |ε Term -> Term * Factor | Term / Factor | Factor Factor -> not Factor | number | ident | (Expression) 1. 各任务的实现伪代码或者主要思想 实验一:分离解释和编译器 实验 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 :Pl0含一个主函数,2个后端处理函数和16个前端处理函数,这两个前段处理函数是base()和interpret()。 其中各函数的作用是: Base():通过静态连找到数据区的基地址; Interpret():执行目标代码; Block():分析程序处理过程; Statement():语句部分处理; Constdeclaration():常数定义处理; Vardeclaration():整型定义处理; Expression():表达式部分处理; Term():项部分处理; Factor():因子部分处理; Condition():条件部分处理; Gen():生成目标代码,并写入code[][]; Enter():填入声明的名字,包括常数、整型、函数名; Test():测试当前 单词 英语单词 下载七年级上册英语单词表下载英语单词表下载深圳小学英语单词表 下载高中英语单词 下载 是否合理; - 4 - Error():出错处理; Getch():获取下一个字符; Getsym():词法分析,获取下一个标识符; Listcode():输出目标代码; Position():查找名字的位置; 基本思路:分离解释器的主要思想是不需要前段处理,直接用后端处理函数处理生成的中间 代码,然后输出结果。 实验输出结果: 实验二:增加注释处理功能 实验分析:当读入特定的字符时忽略之后读入的内容,当再次读入某些特定的字符时恢复读 入字符。 基本思路:当读入“(*”时忽略之后读入的所有内容直至再次独到“*)”。 代码实现:在getch()函数确认读入文件后加入如下代码: if(ch=='(') { ch=getc(infile); if(ch=='*') { while(!feof(infile)) { ch=getc(infile); if(ch=='*' && (ch=getc(infile))==')') { break; } } continue; } else { printf("("); printf("%c",ch); - 5 - } }实验输出结果: 实验三:增加布尔变量处理和布尔短路处理 实验分析:需要增加一种变量类型涉及到增加与之对应的关键字、指令、标示符等诸多与之对应的操作和声明,在每个函数和最开始的头文件中都要有增加。 基本思路:在头文件和函数中做相关操作,增加bool变量处理功能。 代码实现: 头文件声明部分: 在原有基础上,在oprcode中添加了JPD和JPE两种指令,JPE是遇到0就跳转,但是会保留栈顶的计算结果,JPD是遇到1就会跳转,同样保留栈顶的结果。在symtype枚举类型中添加了 SYM_FALSE,SYM_TRUE,SYM_AND,SYM_OR,SYM_NOT,SYM_COLON,SYM_INTEGER,SYM_BOOLEN,同时把它们到wsym[]中,在table类型中添加了type,用于标明该名字是布尔型还是整型,同时在mark中也添加type。 主程序部分:变量声明部分,只是在变量中区别了是整型还是布尔型,将变量的定义形式改为var a,b:bool(int);;逻辑运算部分,按照以下优先级调用函数:赋值运算符 < 关系运算符 < + — or < * / and < not < ( );为and ,or,not各写一个函数便于短路设计。函数的调用关系为:block()=>statement()=>condition()=>expression()(过程中调用l_or())=>term()(过程中调用l_and())=>factor()(过程中调用l_not());每个函数包括两个参数,fsys和tp。fsys是sym的集合,tp是名字的类型(bool和int)。在布尔设计过程中,遵循以下规则:不可以在逻辑运算表达式中算数表达式。在布尔短路设计中,在l_or()和l_and()函数中分别添加JPE和JPD跳转指令,由于要回填跳转位置,故采用递归。 具体实现过程: Block()函数将变量声明部分作如下变化: if (sym == SYM_VAR) { // variable declarations getsym(); do { vardeclaration(); if (sym == SYM_SEMICOLON) getsym(); else error(5); } while (sym == SYM_IDENTIFIER); - 6 - block_dx = dx; } 若是sym=SYM_VAR,那么所有的处理都在vardeclaration()中进行,Vardeclaration() 函数如下: void vardeclaration(void) { char ID[100][MAXIDLEN + 1]; //作为临时的变量,用于存储id int i = 0; int k; if (sym == SYM_IDENTIFIER) //每读到一个id,先将其存到ID[][]中,然后判断 sym是否为‘,’,若是,重复以上操作;若否, 检查是否位‘:’,若是读入类型,若否,出错。 { strcpy(ID[i++],id); getsym(); while (sym == SYM_COMMA) { getsym(); if (sym == SYM_IDENTIFIER) { strcpy(ID[i++],id); getsym(); } } if (sym == SYM_COLON) { getsym(); if (sym == SYM_INTEGER || sym == SYM_BOOLEN) {//在获取类型后,再将ID[][]中的内容依次复制给id,同时与类型同作 为参数,传递给enter(id,sym),填入table[]. k=i; i=0; while (i < k) { strcpy(id,ID[i]); enter(ID_VARIABLE,sym); i++; } getsym(); } else error(35);//缺少参数 } else error(34);//缺少冒号 } else error(4);//在var后面一定要有一个名字 } // vardeclaration 在变量声明结束以后,进行语句处理。Statement()语句处理时,若是 sym==SYM_IDENTIFIER,那么在确认id有效的同时,获取type,即添加了tp = table[i].type; 按照优先级关系,在此调用condition()。对condition()做一定的修改,使其可以满足除 关系运算以外的其他运算。Condition()获取一个id或者是num以后,若是sym不是关系运 - 7 - 算符,直接返回。在此,先调用expression(),然后若是if (! inset(sym, relset)),表 明不是关系运算,直接return。对expression()作如下修改: (1)在set中添加SYM_OR,即 set = uniteset(fsys, createset(SYM_PLUS, SYM_MINUS, SYM_OR, SYM_NULL)); (2)对于代码生成部分,修改为: while (sym == SYM_PLUS || sym == SYM_MINUS || sym == SYM_OR) { if (sym == SYM_PLUS || sym == SYM_MINUS) { if (tp != SYM_INTEGER) error(38);//在做算术运算时,操作数一定要是整型 addop = sym; getsym(); term(set, tp); if (addop == SYM_PLUS) gen(OPR, 0, OPR_ADD); else if (addop == SYM_MINUS) gen(OPR, 0, OPR_MIN); } else if (sym == SYM_OR) l_or(set, tp); } // while 在此调用的l_or()为: void l_or(symset fsys, int tp) { if (sym == SYM_OR) { int addop, cx1; getsym(); term(fsys, tp); gen(OPR, 0, OPR_OR); //以下部分是实现短路设计用的。在每遇到一个or时,其后都添加一条遇1跳转 指令,由于要回填,故而先记录指令的位置,在读完最后一个操作数之后再填入,用递 归实现。因为term()处理的操作的优先级都高于l_or(),所以每次递归结束后都能获得 一个操作数,实现了按优先级操作。 cx1 = cx; gen(JPD, 0, 0); l_or(fsys, tp); code[cx1].a = cx; } } 对于term()作同样修改,修改后为: (1)set=uniteset(fsys,createset(SYM_PLUS,SYM_MINUS,SYM_AND,SYM_NULL)); (2)代码生成部分: while (sym == SYM_TIMES || sym == SYM_SLASH || sym == SYM_AND) { if (sym == SYM_TIMES || sym == SYM_SLASH) { if (tp != SYM_INTEGER) error(38); mulop = sym; getsym(); factor(set, tp); - 8 - if (mulop == SYM_TIMES) gen(OPR, 0, OPR_MUL); else if (mulop == SYM_SLASH) gen(OPR, 0, OPR_DIV); } else if (sym == SYM_AND) l_and(set, tp); } // while 调用的l_and()为: void l_and(symset fsys, int tp) { if (sym == SYM_AND) { int addop, cx1; addop = sym; getsym(); factor(fsys, tp); gen(OPR, 0, OPR_AND); cx1 = cx; gen(JPE, 0, 0); l_and(fsys, tp); code[cx1].a = cx; } } 对于被调用的处理因子的factor(),添加对常量false和true的处理,同时 添加对not运算的处理。添加的部分为: else if (sym == SYM_FALSE) { if (tp != SYM_BOOLEN) error(38); gen(LIT, 0, 0); getsym(); } else if (sym == SYM_TRUE) { if (tp != SYM_BOOLEN) error(38); gen(LIT, 0, 1); getsym(); } else if (sym == SYM_NOT) l_not(fsys, tp); L_not()函数为: void l_not(symset fsys, int tp) { int addop; void factor(); symset set; getsym(); set = uniteset(fsys, createset( SYM_NOT, SYM_NULL)); factor(set, tp); gen(OPR, 0, OPR_NOT); destroyset(set); - 9 - }以上就是添加了bool类型后做的修改。修改后的图示内容如下: 程序 程序体 . 程序体 ConstIdent=number , ; varident:type , ; procedureident; ;程序体 语句 语句Ident:=condition callident begin语句序列End Ifconditionthen语句序列 条件 whileconditiondo语句序列 oddexpression expression expression <>>=><=<= expression 表达式 + 项 -+-or 项项 因子 */and 因子 因子 - 10 - ident false ture number 实验输出结果: notfactor (condition) 短路: 实验五:for语句处理 实验分析:C语言风格的for处理,要求程序按照左括号、声明、分号、逻辑运算、分号、 计算、右括号的顺序进行分析操作,这样就可以编写代码对此功能进行实现。 基本思路:按照for语句的语法要求进行匹配,若不匹配报错。 代码实现:出去再生命中加入SYM_FOR之外还在statement()加入如下代码 else if(sym==SYM_FOR) { int tag; int sym1; tag=0; getsym(); if(sym==SYM_LPAREN) { cx1 = cx; // printf("%d\n",cx); getsym(); sym1=sym; set1 = createset(SYM_IDENTIFIER,SYM_SEMICOLON,SYM_NULL); set = uniteset(set1, fsys); statement(set); destroyset(set1); destroyset(set); cx4=cx; } - 11 - else { printf("缺少左括号,退出\n"); exit(0); } if(sym==SYM_SEMICOLON) { // printf("%d\n",cx); getsym(); sym1=sym; cx4=cx; if(sym1==SYM_IDENTIFIER) { set1 = createset(SYM_IDENTIFIER,SYM_SEMICOLON,SYM_NULL); set = uniteset(set1, fsys); condition(set); destroyset(set1); destroyset(set); cx3 = cx; gen(JPC, 0,0); } else cx3=cx; // statement(fsys); } else { error(10); } if(sym==SYM_SEMICOLON) { cx2 =cx3; getsym(); set1 = createset(SYM_IDENTIFIER,SYM_RPAREN,SYM_NULL); set = uniteset(set1, fsys); statement(set); destroyset(set1); destroyset(set); } else { error(10); } if(sym==SYM_RPAREN) { getsym(); if(sym==SYM_ZUO) { - 12 - getsym(); set1 = createset(SYM_YOU,SYM_SEMICOLON,SYM_BREAK,SYM_END,SYM_NULL); set = uniteset(set1, fsys); statement(set); while (sym == SYM_SEMICOLON || inset(sym, statbegsys)) { // printf("%d\n",cx6); if (sym == SYM_SEMICOLON) { getsym(); } else { error(10); } statement(set); } // while destroyset(set1); destroyset(set); if(sym==SYM_BREAK) { tag=1; cx6=cx; getsym(); //printf("%d\n",sym); getsym(); gen(JMP, 0, cx); code[cx6].a=cx; // printf("%d\n",cx6); } if (sym == SYM_YOU) { if(tag==1) {code[cx6-1].a=cx;} getsym(); set1 = createset(SYM_END,SYM_NULL); set = uniteset(set1, fsys); statement(set); destroyset(set1); destroyset(set); gen(JMP, 0, cx4); // if(sym1==SYM_IDENTIFIER) { code[cx2].a = cx4; code[cx3].a=cx; if(tag==1) code[cx6].a=cx; } code[cx6].a=cx; - 13 - } else { printf("缺少右大括号,退出\n"); exit(0); } } else if(sym==SYM_SEMICOLON) { getsym(); set1 = createset(SYM_YOU,SYM_SEMICOLON,SYM_END,SYM_NULL); set = uniteset(set1, fsys); statement(set); destroyset(set1); destroyset(set); gen(JMP, 0, cx4); code[cx2].a = cx4; code[cx3].a=cx; } else { printf("缺少左大括号,退出\n"); exit(0); } } else { printf("缺少右括号,退出\n"); exit(0); } /* gen(JMP, 0, cx4); code[cx2].a = cx4; code[cx3].a=cx;*/ //printf("cx=%d,cx2=%d,cx3=%d,cx4=%d",cx,cx2,cx3,cx4); } else test(fsys, phi, 19); expressioident:=n callident expressiobeginendn ifconditionthenstatement whileconditiondostatement} expressioexpressio(修改后的statement) forTo/downtodostatementnn - 14 - 验结果输出: (6) (7)编译器界面实现 编译器界面动画实现 首先对于MFC的认识及相应的代码 程序核心代码中涉及到的函数说明:(在Pl0Doc.cpp中) //词法分析用函数 char GetChar(int n=1); //得到一个字符 CString OutputKeyWord();//输出关键词 int SearchKeyWord(CString str);//寻找关键词 //语法分析用函数 void Advance(int i=1); //读入下一个单词 bool test(CString n, int lev,int tx);//检查语法错误,即是否是合法的单词,并 负责跳到下一个正确的语法单元继续分析 bool test(CString n,int lev,int tx,KIND k); //重载的test函数 bool enter(CString n,KIND k,int lev,int val,int r,int c); //登录符号表 void error(int a); //当语法分析中查到错误时,报告出错信息 void factor(int lev, int tx); //因子处理函数,用来处理源程序中的“因子”部分 void expression(int lev, int tx); //表达式处理函数,用来处理源程序(文本)中 的“表达式”部分 void term(int lev, int tx); //项处理函数,用来处理源程序(文本)中的“项” void condition(int lev,int tx); // 条件处理函数,用来处理 “条件”部分 void statement(int lev,int tx); //语句处理函数,用来处理“语句” void block(int lev,int tx); //分程序的处理函数,用来处理“分程序” void program(); // 程序处理函数,用来处理“程序” //语义分析用的函数(生成中间代码) void Constdeclaration(int & dep); //常量声明的语义分析 void Vardeclaration(int & dep); //变量声明的语义分析 - 15 - void Advanced(int i=1); //从单词表中读入下一个单词 int Position(CString idname); //查找标识符在符号表中的登录信息,并检查 是否在符号表中 void Factor(int lev,int tx); //因子的语义分析 void Term(int lev,int tx,int i=1); //项的语义分析 void Expression(int lev,int tx); //表达式的语义分析 void Condition(int lev,int tx); //条件的语义分析 void Statement(int lev,int tx); //语句的语义分析 void Block(int lev,int tx); // 分程序的语义分析 bool Generate(Functions func,int lev,int amount); //生成一条中间代码 //解释执行中用到的函数 int Base(int lev); //查找当前被调用的变量、常量、过程在虚拟内存中的地址或 数值信息 void Interpret(bool & interrupt,int count); //负责动态的分配内存空间和 对中间代码进行的解释执行 与可视化界面有关的一些函数的说明(在Pl0Doc.h中) ? afx_msg void OnFileSaveAs(); //保存文档 ?afx_msg bool OnSyntaxAnalyze() //语法分析 { „„ OnWordAnalyze(); //现调用词法分析 total_err=0; TX=1; Advance(0); program(); „„ } ?afx_msg void OnWordAnalyze(); //词法分析,具体内容见CPL0Doc.cpp ?afx_msg void OnWordAnalyzeFile(); ?afx_msg void OnWordAnalyzeSee(); //查看词法分析的结果 ?afx_msg bool OnCodesAnalyze() //中间代码生成 - 16 - { bool flag=false; if(OnSyntaxAnalyze()==true) //语法分析已经完成,并且正确 { if(twoelement.head!=NULL) //若源程序为空,不生成代码 { Advanced(0); TXCode = 0; CIndex = 0; Block(0,0); //调用分程序处理模块,初始时程序为第零层 flag=true; //代码生成完成 „„ } } return flag; //返回参数,表示代码生成成功与否 } ?afx_msg void OnCodesview(); //查看生成的中间代码,结果显示在次窗口中 ?afx_msg void OnExecute() //程序的执行 { „„ if(OnCodesAnalyze()) { „„ Interpret(Interrupt,Count); // 调用解释执行程序 } „„ } ?afx_msg void OnSynHelp(); // 弹出一个窗口,显示语法定义规则 Afx_msg需要在.h文件声明消息的相应函数,然后在相应的.cpp文件中建立map对应关系 BEGIN_MESSAGE_MAP(CPL0Doc, CDocument) //{{AFX_MSG_MAP(CPL0Doc) 将.h文件与.cpp文件对应的映射起来,再往下问文件.cpp的实现 ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs) ON_COMMAND(ID_SYNTAX_ANALYZE, OnSyntaxAnalyze) ON_COMMAND(ID_WORD_ANALYZE, OnWordAnalyze) ON_COMMAND(ID_WORD_ANALYZE_FILE, OnWordAnalyzeFile) ON_COMMAND(ID_WORD_ANALYZE_SEE, OnWordAnalyzeSee) ON_COMMAND(ID_CODES_ANALYZE, OnCodesAnalyze) ON_COMMAND(ID_EXECUTE, OnExecute) ON_COMMAND(ID_CODESVIEW, OnCodesview) ON_COMMAND(ID_SynHelp, OnSynHelp) - 17 - //}}AFX_MSG_MAP END_MESSAGE_MAP() 三、实验体会(5分): 本人在该实验中的心得体会。 这门课程完全是练习编程能力的,这个程序函数较多,定义的变量也很多,所以就需要静下心来仔细研究。 而且编程前要实现了解PL0编译器的工作原理以及工作流程,在实验过程中,程序中各个函数之间的关系也比较复杂,这个时候,把函数之间的关系用图表示出来理解起来就容易多了,还有在编程的过程中,要经常做笔记,有些代码前一天懂,可是可能第二天就忘了,多写一些注释是必要的。 整个任务的各个内容循序渐进在解释器分离任务中,首先要求对原有的PL0文法的代码有较为深刻的理解,这样才能准确地了解到各段代码到底分别有什么功能,通过这些功能的分离和重组来实现分离解释器的效果。 下一个任务是增加注释功能,这个任务的核心思想是在字符流的读入过程中对读入内容按照程序员的要求加以筛选,这样就可以按照程序员的方式忽略掉一些内容,也就是我们所谓的注释,确定好增加代码的函数式这个功能的核心,准确地找到getch()函数的开始部分,增加代码,最终实现注释功能。 第三、四个任务分别是增加bool类型数据和短路处理,这就需要对程序运行的流程 - 18 - 和各个函数都加以修改,要求形成后的代码可以识别、处理、运算、输出关于bool类型的各个结果,然后还要为bool类型加上短路逻辑的功能处理。整个任务从指令、标示符、数据项等多个方面对代码进行了修改,要求学生对代码整体的理解要求较高。 第五个任务是增加for处理功能,处理必要的增加for需要的关键字添加之外就是对for逻辑的理解,按照for的与法规则,所谓的声明、分号、逻辑运算、分号、操作的顺序来编写识别程序嵌入到statement()函数中,这样就可以实现for处理了。 而在任务六七中,我使用了大一课程设计中所习得的MFC编程,把整个代码重新命名,组合,再把按钮和显示的简单代码实现,逻辑上并不那么复杂,但是确实面临着遗忘的问题,重新看书,把就知识拾起的过程正是一个完整的学习过程。 纵观整个编译原理课程设计的课程,通过对PL0文法编译器的诸多修改和拓展使我的编程能力和对代码分析和理解的能力都有很大提高,这是一个既有创新又温故知新的过程。感谢学校设置这门课,这真的是一段很开心的学习过程。 - 19 -
本文档为【大连理工大学编译原理实验报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_471618
暂无简介~
格式:doc
大小:135KB
软件:Word
页数:0
分类:互联网
上传时间:2018-10-25
浏览量:50