编译原理实验报告(增加单词 修改单词 增加条件语句的ELSE子句)
编译原理 实验报告
编译原理实验报告编译原理实验报告引言编译原理是计算机科学中的重要课程,它研究的是如何将高级语言程序转化为机器语言程序的过程。
在本次实验中,我们学习了编译原理的基本概念和技术,并通过实践来加深对这些概念和技术的理解。
本报告将对我们在实验中遇到的问题、解决方案以及实验结果进行总结和分析。
实验目的本次实验的主要目的是设计并实现一个简单的编译器,能够将类C语言的源代码翻译成目标代码。
通过这个实验,我们可以更好地理解编译器的工作原理,掌握编译器设计的基本方法和技术。
实验过程在实验中,我们首先对给定的类C语言的语法进行了分析,并根据语法规则设计了相应的语法分析器。
然后,我们使用了自顶向下的递归下降分析法来实现语法分析器。
在实现语法分析器的过程中,我们遇到了一些问题,例如如何处理语法规则中的左递归、如何处理语法规则中的优先级和结合性等。
通过仔细研究相关的文献和资料,我们成功地解决了这些问题,并完成了语法分析器的设计和实现。
接下来,我们对语法分析器进行了测试,并对测试结果进行了分析。
通过测试,我们发现语法分析器在处理简单的源代码时能够正确地识别出语法错误,并给出相应的错误提示。
然而,在处理复杂的源代码时,语法分析器可能会出现一些错误,例如无法正确地处理嵌套的语法结构、无法正确地处理运算符的优先级和结合性等。
为了解决这些问题,我们对语法分析器进行了改进,并进行了多次测试,最终得到了令人满意的结果。
实验结果通过本次实验,我们成功地设计并实现了一个简单的编译器,能够将类C语言的源代码翻译成目标代码。
在实验中,我们对编译器的工作原理有了更深入的了解,掌握了编译器设计的基本方法和技术。
同时,我们也发现了一些问题,并通过不断地改进和测试,最终得到了令人满意的结果。
结论编译原理是一门重要的计算机科学课程,它研究的是如何将高级语言程序转化为机器语言程序的过程。
通过本次实验,我们对编译原理的基本概念和技术有了更深入的了解,并通过实践来加深了对这些概念和技术的理解。
编译原理实验报告(C语言)
编译原理实验报告实验项目1:词法分析程序实验一、实验的目的与任务:编译原理是计算机类专业特别是计算机软件专业的一门重要专业课。
设置该课程的目的在于系统地向学生讲述编译系统的结构、工作流程及编译程序各组成部分的设计原理和实现方法,使学生通过学习既掌握编译理论和方法方面的基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。
编译原理是一门理论性和实践性都比较强的课程。
进行上机实验的目的是使学生通过完成上机实验题目加深对课堂教学内容的理解。
同时培养学生实际动手能力。
编译实验由三个独立实验组成,按照由浅入深进行排列,希望通过本实验使学生更深学习并理解编译的主要过程和相关方法。
词法分析的目的是将输入的源程序进行划分,给出基本符号(token)的序列,并掠过注解和空格等分隔符号。
基本符号是与输入的语言定义的词法所规定的终结符。
本实验要求学生编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续进行)二、题目分析1.这里采用C语言编写的源程序作为词法分析程序的输入数据,输入数据保存在“in.txt”记事本中,将分析结果存在“out.txt”记事本中。
词法分析器的源代码使用C语言编写。
2.下面就词法分析程序中的主要变量进行说明:主函数main():打开要分析的C语言源程序,若不能正确打开,则报错。
先从源程序中读入一个字符ch,然后进行如下处理:1、cp消耗掉空格,制表符,换行符后,cp数组复位,开始检测cp;2、数字检测,对照符号表输出,若匹配成功,则返回序号;3、字符串检测, 对照符号表输出,若匹配成功,则返回序号;4、基本保留字检测,对照符号表输出,若匹配成功,则返回序号;5、运算符检测,对照符号表输出,若匹配成功,则返回序号;注意这里碰到‘/’时,要判断后面是否跟着是注释语句。
《编译原理》课程(语法分析)实验报告
《编译原理》课程实验报告题目语法分析专业计算机科学与技术班级学号姓名指导教师签名华东理工大学信息学院计算机系2013年5月8日一. 实验序号:《编译原理》第二次实验二. 实验题目:语法分析三. 实验日期:2013.4-2013.5四. 实验环境(操作系统,开发语言)操作系统:Windows开发语言:C五. 实验内容(实验要求)a)将复合语句语法中的“begin”改为“{”,“end”改为“}”。
b)将赋值语句的语法改为“赋值语句必须以分号;结束”。
c)将条件语句语法中的“条件”前增加“(”,“条件”后增加“)”但删除“then”d)“语句”语法中增加if-else语句:if (<条件>) <语句> else <语句>六. 实验体会(请手写,不能打印)(包括收获、心得体会、存在的问题及解决问题的方法、建议等)七. 实验结果(运行结果截图,关键源程序)复合语句更改后的程序:int CompoundStatement(int i){ PrintParsing(ResultofWordTable[AWordIndex],i,"OB");AWordIndex++;StatementParsing(i+1);while (ResultofWordTable[AWordIndex].W_Type==SEMICOLON){ PrintParsing(ResultofWordTable[AWordIndex],i,"SEMICOLOM");AWordIndex++;StatementParsing(i+1);}if (ResultofWordTable[AWordIndex].W_Type==CB){ PrintParsing(ResultofWordTable[AWordIndex],i,"CB");AWordIndex++;return 1;}elsereturn 0;}赋值语句以分号结尾:int AssignmentStatement(int i){ PrintParsing(ResultofWordT able[AWordIndex],i,"IDENTIFIER");AWordIndex++;if (ResultofWordTable[AWordIndex].W_Type==BECOMES){ PrintParsing(ResultofWordTable[AWordIndex],i,"BECOMES");AWordIndex++;Expression(i+1);if (ResultofWordTable[AWordIndex].W_Type==SEMICOLON){ PrintParsing(ResultofWordTable[AWordIndex],i,"SEMICOLON");AWordIndex++;return 1;}elsereturn 0;}elsereturn 0;}条件语句修改后:int ConditionalStatement(int i){ PrintParsing(ResultofWordTable[AWordIndex],i,"IF");AWordIndex++;if (ResultofWordTable[AWordIndex].W_Type==LPAREN){ PrintParsing(ResultofWordTable[AWordIndex],i,"LPAREN");AWordIndex++;Conditional(i);if (ResultofWordTable[AWordIndex].W_Type==RPAREN){ PrintParsing(ResultofWordTable[AWordIndex],i,"RPAREN");AWordIndex++;StatementParsing(i+1);if (ResultofWordTable[AWordIndex].W_Type==ELSE){ PrintParsing(ResultofWordTable[AWordIndex],i,"ELSE");AWordIndex++;StatementParsing(i+1);return 1; }}elsereturn 0;}elsereturn 0;}其他一些程序代码:主函数:int main(int , char* ){ FILE *fp;if((fp=fopen(FILE_NAME,"r"))==NULL)printf( "Can’t open the file!\n" );if((fp=fopen(FILE_RESULT,"w+"))==NULL)printf( " Can’t open the file!\n" );char ch; //定义读到的每个字符ch = fgetc(fp); //从文件中读入一个字符while(ch != EOF) //按读入字符逐个输出在屏幕中{ putchar(ch);ch = fgetc(fp);}Initialize(); //初始化printf("----------- Parsing Analysis!------------\n");printf("Index Rows Word Analysis\n");ParsingAnalysisFunction(Index);printf("-------------------END------------------\n");getchar();return 0;}分程序分析:int BlockParsing(int i){ PrintParsing(ResultofWordTable[AWordIndex],i-1,"BlockParsing");if(ResultofWordTable[AWordIndex].W_Type==CONST){PrintParsing(ResultofWordTable[AWordIndex],i,"CONST");AWordIndex++;PrintParsing(ResultofWordTable[AWordIndex],i,"oneConstantParsing");oneConstantParsing(i+1); //常量声明分析}if(ResultofWordTable[AWordIndex].W_Type==VAR){PrintParsing(ResultofWordTable[AWordIndex],i,"VAR");AWordIndex++;PrintParsing(ResultofWordTable[AWordIndex],i,"oneVarParsing");oneVariableParsing(i+1); //变量声明分析}while(ResultofWordT able[AWordIndex].W_Type==PROCEDURE){ PrintParsing(ResultofWordTable[AWordIndex],i,"PROCEDURE");AWordIndex++;PrintParsing(ResultofWordTable[AWordIndex],i,"oneProcesureParsing");ProcedureParsing(i+1); //过程声明分析}StatementParsing(i);return 1;}过程调用语句:int ProcedureCall(int i){ PrintParsing(ResultofWordTable[AWordIndex],i,"CALL");AWordIndex++;if (ResultofWordTable[AWordIndex].W_Type==IDENTIFIER){ PrintParsing(ResultofWordTable[AWordIndex],i,"IDENTIFIER");AWordIndex++;return 1;}elsereturn 0;}循环语句分析:int LoopStatement(int i){ PrintParsing(ResultofWordTable[AWordIndex],i,"WHILE");AWordIndex++;Conditional(i);if (ResultofWordTable[AWordIndex].W_Type==DO){ PrintParsing(ResultofWordTable[AWordIndex],i,"DO");AWordIndex++;StatementParsing(i+1);return 1;}elsereturn 0;}实验结果截图:。
编译原理实验报告(C语言)
else if(strcmp(word,"if")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',12,')'); else if(strcmp(word,"else")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',13,')'); else if(strcmp(word,"switch")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',14,')'); else if(strcmp(word,"case")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',15,')'); else if(strcmp(word,"for")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',16,')'); else if(strcmp(word,"do")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',17,')'); else if(strcmp(word,"while")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',18,')'); else if(strcmp(word,"goto")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',19,')'); else if(strcmp(word,"continue")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',20,')'); else if(strcmp(word,"break")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',21,')');
编译原理—pl0实验报告
PL/0实验报告课程名称编译原理题目名称PL/0编译程序学生学院计算机科学与技术学院专业班级学号学生姓名班内序号山东理工大学实验报告纸第 1 页姓名:蔡鹏飞计算机院_11_级02班同组者成绩_________室温:气压:课程名称:编译原理教师签字实验项目编号(1)PL/0编译程序的分析指导教师鞠传香实验目的1.熟悉pl/0语言并能编写小程序2.掌握pl/0编译程序的编译过程(词法分析、语法分析、语义分析等)实验仪器(编号)材料、工具PC机、VC++6.0(原理概述)pl/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。
词法分析和代码生成作为独立的子程序供语法分析程序调用。
语法分析的同时,提供了出错报告和出错恢复的功能。
在源程序没有错误编译通过的情况下,调用类pcode解释程序解释执行生成的类pcode代码。
PL/0语言文法的EBNF表示EBNF表示的符号说明。
〈〉:用左右尖括号括起来的中文字表示语法构造成分,或称语法单位,为非终结符。
∷= :该符号的左部由右部定义,可读作'定义为'。
| :表示'或',为左部可由多个右部定义。
{ } :花括号表示其内的语法成分可以重复。
在不加上下界时可重复0到任意次数,有上下界时为可重复次数的限制。
如:{*}表示*重复任意次,{*}38表示*重复3-8次。
[ ] :方括号表示其内的成分为任选项。
( ) :表示圆括号内的成分优先。
例:用EBNF描述<整数>文法的定义:<整数>∷=[+|-]<数字>{<数字>}<数字>∷=0|1|2|3|4|5|6|7|8|9或更好的写法<整数>∷=[+|-]<非零数字>{<数字>}|0<非零数字>∷=1|2|3|4|5|6|7|8|9<数字>∷=0|<非零数字>PL/0语言文法的EBNF表示PL/0语言文法的EBNF表示为:〈程序〉∷=〈分程序〉.〈分程序〉∷=[〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉〈常量说明部分〉∷=CONST〈常量定义〉{,〈常量定义〉};〈常量定义〉∷=〈标识符〉=〈无符号整数〉〈无符号整数〉∷=〈数字〉{〈数字〉}〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉};〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉};〈过程首部〉∷=PROCEDURE〈标识符〉;〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈当型循环语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉〈赋值语句〉∷=〈标识符〉∶=〈表达式〉〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉|ODD〈表达式〉〈表达式〉∷=[+|-]〈项〉{〈加法运算符〉〈项〉}〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')'〈加法运算符〉∷=+|-〈乘法运算符〉∷=*|/// 栈顶指针减一相关过程:base(),interpret()。
编译原理实验报告总结
编译原理实验报告总结一、实验目的编译原理是计算机科学中的一门重要课程,通过实验可以更深入地理解编译过程的各个阶段,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。
本次编译原理实验的目的主要有以下几点:1、加深对编译原理理论知识的理解和掌握,将抽象的概念通过实际操作转化为具体的实现。
2、培养实际动手能力和解决问题的能力,通过编写代码实现编译程序的各个模块,提高编程技能和调试能力。
3、熟悉编译程序的开发流程和工具,掌握相关编程语言和开发环境的使用。
4、培养团队合作精神和沟通能力,在实验过程中与小组成员共同探讨、解决问题,提高协作效率。
二、实验环境本次实验使用的编程语言为 C/C++,开发环境为 Visual Studio 2019。
同时,使用了一些辅助工具,如调试工具、代码管理工具等,以提高开发效率和代码质量。
三、实验内容1、词法分析任务:使用正则表达式或有限自动机实现对输入源程序的词法分析,将源程序分解为一个个单词,并识别出单词的类型,如标识符、关键字、常量、运算符等。
实现方法:采用有限自动机的方法,设计状态转移图,根据输入字符的类型进行状态转移,最终确定单词的类型。
遇到的问题及解决方法:在处理一些边界情况时,如字符串中的转义字符,出现了识别错误。
通过仔细分析正则表达式和有限自动机的规则,对代码进行了相应的修改和完善,解决了问题。
2、语法分析任务:使用自顶向下或自底向上的语法分析方法,对词法分析得到的单词序列进行语法分析,构建语法树。
实现方法:选择了自顶向下的递归下降分析法,根据语法规则编写递归函数,逐个处理单词,构建语法树。
遇到的问题及解决方法:在处理复杂的语法结构时,出现了回溯和左递归的问题,导致分析效率低下。
通过消除左递归和提取公共因子,优化了语法分析算法,提高了分析效率。
3、语义分析任务:在语法分析的基础上,进行语义分析,检查语法正确的程序是否在语义上也是正确的,如类型匹配、变量未定义等。
编译原理实验词法分析实验报告
编译原理实验词法分析实验报告一、实验目的词法分析是编译过程的第一个阶段,其主要任务是从左到右逐个字符地对源程序进行扫描,产生一个个单词符号。
本次实验的目的在于通过实践,深入理解词法分析的原理和方法,掌握如何使用程序设计语言实现词法分析器,提高对编译原理的综合应用能力。
二、实验环境本次实验使用的编程语言为_____,开发工具为_____。
三、实验原理词法分析的基本原理是根据编程语言的词法规则,将输入的字符流转换为单词符号序列。
单词符号通常包括关键字、标识符、常量、运算符和界符等。
词法分析器的实现方法有多种,常见的有状态转换图法和正则表达式法。
在本次实验中,我们采用了状态转换图法。
状态转换图是一种有向图,其中节点表示状态,有向边表示在当前状态下输入字符的可能转移。
通过定义不同的状态和转移规则,可以实现对各种单词符号的识别。
四、实验步骤1、定义单词符号的类别和编码首先,确定实验中要识别的单词符号种类,如关键字(if、else、while 等)、标识符、整数常量、浮点数常量、运算符(+、、、/等)和界符(括号、逗号等)。
为每个单词符号类别分配一个唯一的编码,以便后续处理。
2、设计状态转换图根据单词符号的词法规则,绘制状态转换图。
例如,对于标识符的识别,起始状态为“起始状态”,当输入为字母时进入“标识符中间状态”,在“标识符中间状态”中,若输入为字母或数字则继续保持该状态,直到遇到非字母数字字符时结束识别,确定为一个标识符。
3、编写词法分析程序根据状态转换图,使用所选编程语言实现词法分析器。
在程序中,通过不断读取输入字符,根据当前状态进行转移,并在适当的时候输出识别到的单词符号。
4、测试词法分析程序准备一组包含各种单词符号的测试用例。
将测试用例输入到词法分析程序中,检查输出的单词符号是否正确。
五、实验代码以下是本次实验中实现词法分析器的核心代码部分:```include <stdioh>include <ctypeh>//单词符号类别定义typedef enum {KEYWORD,IDENTIFIER,INTEGER_CONSTANT,FLOAT_CONSTANT,OPERATOR,DELIMITER} TokenType;//关键字列表char keywords ={"if","else","while","for","int","float","void"};//状态定义typedef enum {START,IN_IDENTIFIER,IN_INTEGER,IN_FLOAT,IN_OPERATOR} State;//词法分析函数TokenType getToken(char token, int tokenLength) {State state = START;int i = 0;while (1) {char c = getchar();switch (state) {case START:if (isalpha(c)){state = IN_IDENTIFIER;tokeni++= c;} else if (isdigit(c)){state = IN_INTEGER;tokeni++= c;} else if (c =='+'|| c ==''|| c ==''|| c =='/'|| c =='('|| c ==')'|| c ==';'|| c ==','){state = IN_OPERATOR;tokeni++= c;} else if (c ==''){state = IN_FLOAT;tokeni++= c;} else if (c == EOF) {tokeni ='\0';tokenLength = i;return -1;} else {tokeni ='\0';tokenLength = i;return -2;}break;case IN_IDENTIFIER:if (isalpha(c) || isdigit(c)){tokeni++= c;} else {ungetc(c, stdin);tokeni ='\0';tokenLength = i;//检查是否为关键字for (int j = 0; j < sizeof(keywords) / sizeof(keywords0); j++){if (strcmp(token, keywordsj) == 0) {return KEYWORD;}}return IDENTIFIER;}break;case IN_INTEGER:if (isdigit(c)){tokeni++= c;} else if (c ==''){state = IN_FLOAT;tokeni++= c;} else {ungetc(c, stdin);tokeni ='\0';tokenLength = i;return INTEGER_CONSTANT;}break;case IN_FLOAT:if (isdigit(c)){tokeni++= c;} else {ungetc(c, stdin);tokeni ='\0';tokenLength = i;return FLOAT_CONSTANT;}break;case IN_OPERATOR: tokeni ='\0';tokenLength = i;return OPERATOR; break;}}}int main(){char token100;int tokenLength;TokenType tokenType;while ((tokenType = getToken(token, &tokenLength))!=-1) {switch (tokenType) {case KEYWORD:printf("Keyword: %s\n", token);break;case IDENTIFIER:printf("Identifier: %s\n", token);break;case INTEGER_CONSTANT:printf("Integer Constant: %s\n", token);break;case FLOAT_CONSTANT:printf("Float Constant: %s\n", token);break;case OPERATOR:printf("Operator: %s\n", token);break;case DELIMITER:printf("Delimiter: %s\n", token);break;}}return 0;}```六、实验结果对准备的测试用例进行输入,得到的词法分析结果如下:测试用例 1:```int main(){int num = 10;float pi = 314;if (num > 5) {printf("Hello, World!\n");}}```词法分析结果:```Keyword: int Identifier: main Delimiter: (Delimiter: ){Identifier: num Operator: =Integer Constant: 10;Identifier: float Identifier: pi Operator: =Float Constant: 314;Keyword: ifDelimiter: (Identifier: numOperator: >Integer Constant: 5){Identifier: printfDelimiter: (String: "Hello, World!\n" Delimiter: );}```测试用例 2:```for (int i = 0; i < 10; i++){double result = i 25;```词法分析结果:```Keyword: for Delimiter: (Keyword: int Identifier: i Operator: =Integer Constant: 0;Identifier: i Operator: <Integer Constant: 10;Identifier: i Operator: ++)Identifier: doubleIdentifier: resultOperator: =Identifier: iOperator:Float Constant: 25;}```通过对多个测试用例的分析,词法分析器能够正确识别出各种单词符号,实验结果符合预期。
编译原理实验报告
编译原理实验报告一、实验目的编译原理是计算机科学中的重要学科,它涉及到将高级编程语言转换为计算机能够理解和执行的机器语言。
本次实验的目的是通过实际操作和编程实践,深入理解编译原理中的词法分析、语法分析、语义分析以及中间代码生成等关键环节,提高我们对编译过程的认识和编程能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
此外,还使用了一些相关的编译工具和调试工具,如 GDB 等。
三、实验内容(一)词法分析器的实现词法分析是编译过程的第一步,其任务是将输入的源程序分解为一个个单词符号。
在本次实验中,我们使用有限自动机的理论来设计和实现词法分析器。
首先,定义了各种单词符号的类别,如标识符、关键字、常量、运算符等。
然后,根据这些类别设计了相应的状态转换图,并将其转换为代码实现。
在实现过程中,使用了正则表达式来匹配输入字符串中的单词符号。
对于标识符和常量等需要进一步处理的单词符号,使用了相应的规则进行解析和转换。
(二)语法分析器的实现语法分析是编译过程的核心环节之一,其任务是根据给定的语法规则,分析输入的单词符号序列是否符合语法结构。
在本次实验中,我们使用了递归下降的语法分析方法。
首先,根据实验要求定义了语法规则,并将其转换为相应的递归函数。
在递归函数中,通过对输入单词符号的判断和处理,逐步分析语法结构。
为了处理语法错误,在分析过程中添加了错误检测和处理机制。
当遇到不符合语法规则的输入时,能够输出相应的错误信息,并尝试进行恢复。
(三)语义分析及中间代码生成语义分析的目的是对语法分析得到的语法树进行语义检查和语义处理,生成中间代码。
在本次实验中,我们使用了三地址码作为中间代码的表示形式。
在语义分析过程中,对变量的定义和使用、表达式的计算、控制流语句等进行了语义检查和处理。
对于符合语义规则的语法结构,生成相应的三地址码指令。
四、实验步骤(一)词法分析器的实现步骤1、定义单词符号的类别和对应的正则表达式。
编译原理实习报告
编译原理实习报告一、实习目的和意义编译原理是计算机科学的核心分支之一,涉及到将一种编程语言转换成另一种编程语言的过程。
通过本次实习,我希望能够深入理解编译原理的基本概念、方法和实现技术,提高自己的编程能力和软件设计能力。
二、实习内容和步骤1. 阅读实习指导书和相关的理论知识,了解编译程序的基本思想和构造方法。
2. 选择一个自己熟悉的程序设计语言,例如C语言,作为编译对象。
3. 设计并实现一个C语言子集的编译程序,包括词法分析、语法分析和语义分析等功能。
4. 对编译程序进行测试和调试,修复可能存在的问题和错误。
5. 撰写实习报告,总结实习过程中的经验和教训。
三、实习过程和成果在实习过程中,我首先阅读了相关的理论知识和实习指导书,对编译原理的基本概念和实现方法有了更深入的理解。
然后,我选择了C语言作为编译对象,并设计了一个C语言子集的编译程序。
在实现编译程序的过程中,我首先编写了词法分析器,用于识别源代码中的单词和符号。
然后,我编写了语法分析器,用于分析源代码的语法结构。
最后,我编写了语义分析器,用于检查源代码中的语义错误。
在完成编译程序的实现后,我对程序进行了测试和调试,发现并修复了一些可能的问题和错误。
通过测试,我发现我的编译程序能够正确地编译和生成目标代码。
最后,我撰写了实习报告,总结了实习过程中的经验和教训。
我意识到编译原理不仅是理论知识的掌握,还需要通过实践来加深理解和提高能力。
同时,我也学会了如何设计和实现一个简单的编译程序,提高了自己的编程能力和软件设计能力。
四、实习收获和展望通过本次实习,我对编译原理的基本概念和实现方法有了更深入的理解,提高了自己的编程能力和软件设计能力。
我学会了如何设计和实现一个简单的编译程序,并能够将其应用于实际的编程实践中。
在未来的学习和工作中,我将继续深入学习和研究编译原理相关的知识和技术,提高自己的专业水平和竞争力。
同时,我也希望能够将编译原理的应用扩展到更多的编程语言和领域中,为自己的职业发展打下更坚实的基础。
编译原理课程设计报告PL0编译程序改良及完善
燕山大学《编译原理课程设计》题目:《PL/0编译程序改良及完善》姓名:简越班级:06级运算机应用3班学号:060104010084日期:2020年7月15日设计题目:PL/0编译程序改良及完善。
设计目的:阅读研究,改良设计和调试一个简单的编译程序。
加深对编译理论和进程的了解。
设计要求:1.有选择的对PL/0编译源程序补充,完善.2.设计编译典型的运行实例,以便反映出自己作出改良后的编具有的功能。
设计思想:PL/0语言能够看成PASCAL语言的子集,它的编译程序是一个编译说明执行系统。
PL/0的目标程序为假想栈式运算机的汇编语言,与具体运算机无关。
PL/0的编译程序和目标程序的说明执行程序都是用PASCAL语言书写的,因此PL/0语言可在配备PASCAL语言的任何机械上实现。
其编译进程采纳一趟扫描方式,以语法分析程序为核心,词法分析和代码生成程序都作为一个独立的进程,当语法分析需要读单词时就挪用词法分析程序,而当语法分析正确需要生成相应的目标代码时,那么挪用代码生成程序。
用表格治理程序成立变量、常量和进程表示符的说明与引用之间的信息联系。
当源程序编译正确时,PL/0编译程序自动挪用说明执行程序,对目标代码进行说明执行,并按用户程序的要求输入数据和输出运行结果。
要紧变量说明:/*变量说明*/FILE* fas; /*输出名字表*/FILE* fa; /*输出虚拟机代码*/FILE* fa1; /*输出源文件及其各行对应的首地址*/FILE* fa2; /*输出结果*/bool listswitch; /*显示虚拟机代码与否*/bool tableswitch; /*显示名字表与否*/char ch; /*获取字符的缓冲区,getch利用*/enum symbol sym; /*当前的符号*/char id[al+1]; /*当前ident,多出的一个字节用于寄存0*/ int num; /*当前number*/int cc,ll; /*getch利用的计数器,cc表示当前字符(ch)的位置*/int cx; /*虚拟机代码指针,取值范围[0,cxmax-1]*/char line[81]; /*读取行缓冲区*/char a[al+1]; /*临时符号,多出的一个字节用于寄存0*/ struct instruction code[cxmax]; /*寄存虚拟机代码的数组*/char word[norw][al]; /*保留字*/enum symbol wsym[norw]; /*保留字对应的符号值*/enum symbol ssym[256]; /*单字符的符号值*/char mnemonic[fctnum][5]; /*虚拟机代码指令名称*/bool declbegsys[symnum]; /*表示声明开始的符号集合*/bool statbegsys[symnum]; /*表示语句开始的符号集合*/bool facbegsys[symnum]; /*表示因子开始的符号集合*//* 目标指令*/一、LIT:将常量值取到运行栈顶.二、LOD:将变量放到运行栈顶.3、STO:将栈顶的内容送入某变量单元中.4、CAL:挪用进程的指令.五、INT:为被挪用的进程(或主程序)在运行栈中开辟数据区.六、JMP:无条件转移指令.7、JPC:条件转移指令,当栈顶的布尔值为真时, 顺序执行,不然转向域的地址.八、OPR:系运算符和算术运算指令.将栈顶和次栈顶的内容进行运算,结果寄存栈顶./*函数说明*/void error(int n,int line)说明:犯错处置函数,打印犯错信息,错误总数加1。
编译原理的实验报告
一、实验目的1. 理解编译原理的基本概念和原理。
2. 掌握编译器的各个阶段及其实现方法。
3. 能够运用编译原理的知识解决实际问题。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 20194. 实验内容:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成三、实验内容1. 词法分析(1)实验目的:实现一个简单的词法分析器,将源代码中的字符序列转换为词法符号序列。
(2)实验步骤:1)定义词法符号类型,包括标识符、关键字、运算符、常量等。
2)设计词法分析器算法,对源代码进行遍历,将字符序列转换为词法符号序列。
3)实现词法分析器程序,输出词法符号序列。
(3)实验结果:输入源代码:int a = 10;输出词法符号序列:{<int, int>, <a, a>, <=, =>, <10, 10>, <;, ;>}2. 语法分析(1)实验目的:实现一个简单的语法分析器,将词法符号序列转换为抽象语法树(AST)。
(2)实验步骤:1)定义语法规则,包括产生式、非终结符、终结符等。
2)设计语法分析算法,根据语法规则对词法符号序列进行解析,生成AST。
3)实现语法分析器程序,输出AST。
(3)实验结果:输入词法符号序列:{<int, int>, <a, a>, <=, =>, <10, 10>, <;, ;>}输出AST:```AST:- ExpressionStatement- Expression- BinaryExpression- Identifier: a- Operator: =- Constant: 10```3. 语义分析(1)实验目的:实现语义分析器,对AST进行语义检查,确保程序的正确性。
(2)实验步骤:1)定义语义规则,包括类型检查、作用域检查等。
编译原理实验报告1
03091337 李璐 03091339 宗婷婷一、上机题目:实现一个简单语言(CPL)的编译器(解释器)二、功能要求:接收以CPL编写的程序,对其进行词法分析、语法分析、语法制导翻译等,然后能够正确的执行程序。
三、试验目的1.加深编译原理基础知识的理解:词法分析、语法分析、语法制导翻译等2.加深相关基础知识的理解:数据结构、操作系统等3.提高编程能力4.锻炼独立思考和解决问题的能力四、题目说明1.数据类型:整型变量(常量),布尔变量(常量)取值范围{…, -2, -1, 0, 1, 2, …}, {true, false}2、运算表达式:简单的代数运算,布尔运算3、程序语句:赋值表达式,顺序语句,if-else语句,while语句五、环境配置1.安装Parser Generator、Visual C++;2.分别配置Parser Generator、Visual C++;3.使用Parser Generator创建一个工程编写l文件mylexer.l;编译mylexer.l,生成mylexer.h与mylexer.c;4.使用VC++创建Win32 Console Application工程并配置该项目;加入mylexer.h与mylexer.c,编译工程;执行标识符数字识别器;注意:每次修改l文件后,需要重新编译l文件,再重新编译VC工程六、设计思路及过程设计流程:词法分析LEX的此法分析部分主要利用有限状态机进行单词的识别,在分析该部分之前,首先应该对YACC的预定义文法进行解释。
在YACC中用%union扩充了yystype的内容,使其可以处理char型,int型,node型,其中Node即为定义的树形结点,其定义如下:typedef enum { TYPE_CONTENT, TYPE_INDEX, TYPE_OP } NodeEnum;/* 操作符 */typedef struct {int name; /* 操作符名称 */int num; /* 操作元个数 */struct NodeTag * node[1]; /* 操作元地址可扩展 */} OpNode;typedef struct NodeTag {NodeEnum type; /* 树结点类型 *//* Union 必须是最后一个成员 */union {int content; /* 内容 */int index; /* 索引 */OpNode op; /* 操作符对象 */};} Node;extern int Var[26];结点可以是三种类型(CONTENT,INDEX,OP)。
编译原理实验报告
<<编译原理>>上机实验报告编译原理上机实验报告一、实验目的与要求目的:在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。
达到进一步了解程序编译过程的基本原理和基本实现方法的目的。
要求:对PL/0作以下修改扩充基本内容:增加单词:保留字ELSE,FOR,TO,DOWNTO,RETURN运算符+=,-=,++,--修改单词:不等号# 改为<>增加条件语句的ELSE子句实验环境与工具(1)计算机及操作系统:PC机,WindowsXP(2)程序设计语言:C++Builder6(3)教学型编译程序:PL/0二、设计方案1)概述:编译程序编绎的源程序是PL0,程序产生的目标代码是一个假想栈式计算机的汇编语言.称为类PCODE指令代码 ,指令格式格式如下:其中F代表功能码,L表示层次差,A表示位移量,不同指令其含义有所区别。
PL/0语言是Pascal语言的一个子集,这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。
PL/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。
词法分析和代码生成作为独立的子程序供语法分析程序调用。
语法分析的同时,提供了出错报告和出错恢复的功能。
在源程序没有错误编译通过的情况下,调用类PCODE解释程序解释执行生成的类PCODE 代码。
编译器实现工具和运行平台程序用C++语言编写,在C++ Builder平台下运行。
2)结构设计说明:PL/0的编译过程采用一趟扫描方式,以语法分析为核心,词法分析程序和代码生成程序都作为一个独立的过程,当语法分析需要读入单词时就调用词法分析程序,而当语法分析正确需生成相应的目标代码时,则调用代码生成程序。
此外,用表格管理程序建立变量、常量和过程标识符的说明与引用之间的信息联系。
《编译原理》课程(语法分析)实验报告
《编译原理》课程实验报告题目语法分析专业计算机科学与技术班级学号姓名指导教师签名华东理工大学信息学院计算机系2013年5月8日一. 实验序号:《编译原理》第二次实验二. 实验题目:语法分析三. 实验日期:2013.4-2013.5四. 实验环境(操作系统,开发语言)操作系统:Windows开发语言:C五. 实验内容(实验要求)a)将复合语句语法中的“begin”改为“{”,“end”改为“}”。
b)将赋值语句的语法改为“赋值语句必须以分号;结束”。
c)将条件语句语法中的“条件”前增加“(”,“条件”后增加“)”但删除“then”d)“语句”语法中增加if-else语句:if (<条件>) <语句> else <语句>六. 实验体会(请手写,不能打印)(包括收获、心得体会、存在的问题及解决问题的方法、建议等)七. 实验结果(运行结果截图,关键源程序)复合语句更改后的程序:int CompoundStatement(int i){ PrintParsing(ResultofWordTable[AWordIndex],i,"OB");AWordIndex++;StatementParsing(i+1);while (ResultofWordTable[AWordIndex].W_Type==SEMICOLON){ PrintParsing(ResultofWordTable[AWordIndex],i,"SEMICOLOM");AWordIndex++;StatementParsing(i+1);}if (ResultofWordTable[AWordIndex].W_Type==CB){ PrintParsing(ResultofWordTable[AWordIndex],i,"CB");AWordIndex++;return 1;}elsereturn 0;}赋值语句以分号结尾:int AssignmentStatement(int i){ PrintParsing(ResultofWordT able[AWordIndex],i,"IDENTIFIER");AWordIndex++;if (ResultofWordTable[AWordIndex].W_Type==BECOMES){ PrintParsing(ResultofWordTable[AWordIndex],i,"BECOMES");AWordIndex++;Expression(i+1);if (ResultofWordTable[AWordIndex].W_Type==SEMICOLON){ PrintParsing(ResultofWordTable[AWordIndex],i,"SEMICOLON");AWordIndex++;return 1;}elsereturn 0;}elsereturn 0;}条件语句修改后:int ConditionalStatement(int i){ PrintParsing(ResultofWordTable[AWordIndex],i,"IF");AWordIndex++;if (ResultofWordTable[AWordIndex].W_Type==LPAREN){ PrintParsing(ResultofWordTable[AWordIndex],i,"LPAREN");AWordIndex++;Conditional(i);if (ResultofWordTable[AWordIndex].W_Type==RPAREN){ PrintParsing(ResultofWordTable[AWordIndex],i,"RPAREN");AWordIndex++;StatementParsing(i+1);if (ResultofWordTable[AWordIndex].W_Type==ELSE){ PrintParsing(ResultofWordTable[AWordIndex],i,"ELSE");AWordIndex++;StatementParsing(i+1);return 1; }}elsereturn 0;}elsereturn 0;}其他一些程序代码:主函数:int main(int , char* ){ FILE *fp;if((fp=fopen(FILE_NAME,"r"))==NULL)printf( "Can’t open the file!\n" );if((fp=fopen(FILE_RESULT,"w+"))==NULL)printf( " Can’t open the file!\n" );char ch; //定义读到的每个字符ch = fgetc(fp); //从文件中读入一个字符while(ch != EOF) //按读入字符逐个输出在屏幕中{ putchar(ch);ch = fgetc(fp);}Initialize(); //初始化printf("----------- Parsing Analysis!------------\n");printf("Index Rows Word Analysis\n");ParsingAnalysisFunction(Index);printf("-------------------END------------------\n");getchar();return 0;}分程序分析:int BlockParsing(int i){ PrintParsing(ResultofWordTable[AWordIndex],i-1,"BlockParsing");if(ResultofWordTable[AWordIndex].W_Type==CONST){PrintParsing(ResultofWordTable[AWordIndex],i,"CONST");AWordIndex++;PrintParsing(ResultofWordTable[AWordIndex],i,"oneConstantParsing");oneConstantParsing(i+1); //常量声明分析}if(ResultofWordTable[AWordIndex].W_Type==VAR){PrintParsing(ResultofWordTable[AWordIndex],i,"VAR");AWordIndex++;PrintParsing(ResultofWordTable[AWordIndex],i,"oneVarParsing");oneVariableParsing(i+1); //变量声明分析}while(ResultofWordT able[AWordIndex].W_Type==PROCEDURE){ PrintParsing(ResultofWordTable[AWordIndex],i,"PROCEDURE");AWordIndex++;PrintParsing(ResultofWordTable[AWordIndex],i,"oneProcesureParsing");ProcedureParsing(i+1); //过程声明分析}StatementParsing(i);return 1;}过程调用语句:int ProcedureCall(int i){ PrintParsing(ResultofWordTable[AWordIndex],i,"CALL");AWordIndex++;if (ResultofWordTable[AWordIndex].W_Type==IDENTIFIER){ PrintParsing(ResultofWordTable[AWordIndex],i,"IDENTIFIER");AWordIndex++;return 1;}elsereturn 0;}循环语句分析:int LoopStatement(int i){ PrintParsing(ResultofWordTable[AWordIndex],i,"WHILE");AWordIndex++;Conditional(i);if (ResultofWordTable[AWordIndex].W_Type==DO){ PrintParsing(ResultofWordTable[AWordIndex],i,"DO");AWordIndex++;StatementParsing(i+1);return 1;}elsereturn 0;}实验结果截图:。
《编译原理》课程实验报告(词法分析)
信息科学与工程学院__《编译原理》_实验报告系别计算机科学与工程专业计算机科学与应用班级_____计122_______学号_____10123544_____姓名_____ 陈柏君_________指导教师金登男2014学年第二学期1.实验题目:词法分析2.实验日期:2015.4.9-2015.4.163.实验环境(操作系统,开发语言)操作系统:Windows开发语言:C4.实验要求4.1.用C语言开发词法分析程序PL0Compiler。
4.2.修改PL/0词法,将其定义为一种新的语言,例如称其为PL/1语言,并完成PL/1语言的词法分析程序。
5.实验步骤5.1.用PL/0语言编写PL/0测试用例源程序,将其命名为Test0.pl。
5.2.用C语言开发PL/0词法分析程序PL0Compiler。
PL0Compiler读入Test0.pl,识别出一个个单词,并将这些单词流依序同时输出到屏幕和文件中。
被输出的每个单词应包括(1)单词序号(2)单词字符串(3)单词类型(4)单词值(如果是标识符,其值是字符串;如果是数,其值是数值;如果是符号,其值是ASCII代码…)在程序开发过程中,应设立断点,单步运行词法分析程序,依次输出一个个单词。
分析和理解词法分析程序,解释词法分析程序中的数据和变量变化的原因和输出结果。
5.3.研究其他程序设计语言,找出与PL/0词法不同的构词法则(例如C语言的标识符的组成规则与PL/0标识符的组成规则有所不同)。
据此修改PL/0的某些词法(例如,将PL/0标识符组成规则修改为C语言的标识符的组成规则),将其定义为一种新的语言,例如称其为PL/1语言。
5.4.用PL/1语言编写PL/1测试用例源程序,将其命名为Test1.pl。
5.5.开发PL/1词法分析程序PL1Compiler。
(可通过修改原PL0Compiler,实现PL/1语言的词法分析功能)。
5.6.PL1Compiler读入Test1.pl,识别出一个个单词,并将这些单词流依序同时输出到屏幕和文件中。
编译原理中实验报告
实验名称:编译原理实验实验时间:2023年X月X日实验地点:实验室实验指导老师:XXX一、实验目的1. 理解编译原理的基本概念和流程。
2. 掌握词法分析和语法分析的基本方法。
3. 学习编译器生成中间代码和目标代码的过程。
4. 培养编程能力和问题解决能力。
二、实验内容本次实验主要包括以下内容:1. 词法分析:编写一个简单的词法分析器,将源代码输入转换为抽象语法树(AST)。
2. 语法分析:实现一个简单的递归下降解析器,对词法分析器输出的AST进行语法分析。
3. 中间代码生成:根据AST生成三地址代码(Three-Address Code)。
4. 代码优化:对生成的三地址代码进行优化。
5. 目标代码生成:将优化后的三地址代码转换为机器代码。
三、实验步骤1. 设计词法分析器首先,我们需要设计一个能够识别源代码中各种单词的词法分析器。
在本实验中,我们定义了以下几种单词:- 关键字:如if、else、while、int、float等。
- 标识符:由字母、数字和下划线组成,不能以数字开头。
- 常量:包括整型常量和浮点型常量。
- 运算符:如+、-、、/、==、<=等。
- 分隔符:如(、)、;、,等。
根据以上定义,我们可以编写一个词法分析器,它将输入的源代码字符串逐个字符地读取,并根据定义的规则识别出相应的单词。
2. 语法分析词法分析器生成的AST是一个树形结构,其中每个节点代表源代码中的一个单词或符号。
为了进一步分析AST的结构,我们需要实现一个递归下降解析器,它能够根据语法规则对AST进行解析。
在本实验中,我们以一个简单的算术表达式为例,实现了一个递归下降解析器。
解析器从AST的根节点开始,按照语法规则递归地解析每个子节点,直到整个表达式被解析完毕。
3. 中间代码生成在完成语法分析后,我们需要将AST转换为中间代码。
在本实验中,我们选择了三地址代码作为中间代码的形式。
三地址代码是一种表示赋值、条件判断和循环等操作的方式,它使用三个操作数和两个操作符来表示一个操作。
编译原理课设实验报告
《编译技术》课程设计报告实验名称编译器设计姓名学号班级本课设的任务是完成一个完整的编译器,处理用户提交的符合所定文法的源程序代码,生成四元式中间代码,进而翻译成等价的X86平台上汇编语言的目标程序。
编译程序的工作过程划分为下列5个过程:词法分析,语法分析,语义分析和中间代码生成,代码优化,目标代码生成。
其中,词法分析阶段的基本任务是从以字符串表示的源程序中识别出具有独立意义的单词符号,并以二元组的形式输出,以作为语法分析阶段的输入。
语法分析阶段的基本任务是将词法分析阶段产生的二元组作为输入,根据语言的语法规则,识别出各种语法成分,并判断该单词符号序列是否是该语言的一个句子。
语义分析的任务是首先对每种语法单位进行静态的语义审查,然后分析其含义,并用另一种语言形式 (本课设采用四元式) 来描述这种语义。
代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效即省时间和空间的目标代码。
目标代码生成的任务是将中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码(本课设生成汇编指令代码)。
在词法分析阶段,通过DOS环境手动输入字符串序列(以’#’作为结束标志)作为带分析的源程序,调用词法扫描子程序将字符串以二元组的形式输出(若有不属于该语言单词符号出现,则进行出错处理),词法扫描子程序包括了对源程序的预处理(忽略多余空格、回车换行符等空白字符),以及对单词的识别和分类,以形成(单词种别,单词自身的值)形式的二元组,并将用户自定义变量信息存入程序变量信息表。
在语法分析阶段,采用自上而下的递归下降分析法,从文法的开始符号出发,根据文法规则正向推导出给定句子。
根据递归下降分析函数编写规则来编写相应的函数,在各个函数的分析过程中调用词法分析程序中的扫描程序,发出“取下一个单词符号”的命令,以取得下一个单词符号作语法分析。
在语义分析和中间代码生成阶段,采用语法制导翻译法,使用属性文法为工具来描述程序设计语言的语义。
《编译原理》实验报告(用Java编写)
《编译原理》实验报告(用Java编写)学生姓名:学号:专业班级:实验类型:□验证□综合■设计□创新实验日期:实验成绩:实验1 词法分析程序的设计一、实验项目名称词法分析程序的设计二、实验目的掌握计算机语言的词法分析程序的开发方法。
三、实验基本原理编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。
1、根据以下的正规式,编制正规文法,画出状态图;标识符<字母>(<字母>|<数字字符>)*十进制整数0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*)八进制整数0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*十六进制整数0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*运算符和界符+ - * / > < = ( ) ;关键字if then else while do2、根据状态图,设计词法分析函数int scan( ),完成以下功能:1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词,2)以二元式形式输出单词<单词种类,单词属性>其中单词种类用整数表示:0:标识符1:十进制整数2:八进制整数3:十六进制整数运算符和界符,关键字采用一字一符,不编码其中单词属性表示如下:标识符,整数由于采用一类一符,属性用单词表示运算符和界符,关键字采用一字一符,属性为空3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。
四、主要仪器设备及耗材PC微机DOS操作系统或Windows 操作系统Turbo C 程序集成环境或Visual C++ 程序集成环境或Java五、实验步骤1、根据正规式,画出状态转换图;2、根据状态图,设计词法分析算法;3、采用C或C++语言,设计函数scan( ),实现该算法;4、编制测试程序(主函数main);5、调试程序:读入文本文件,检查输出结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验报告
学院
专业
班级
学号
姓名
指导教师
2011 年1 月8 日
学院专业班组、学号
姓名协作者_________ 教师评定_________________
实验题目增加单词
一、实验目的与要求
在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序。
二、实验内容
增加单词:保留字ELSE,FOR,TO,DOWNTO,RETURN
运算符+= -= ++ --
三、设计方法
1、首先修改头文件“pl0.h”:
enum symbol{
nul, ident, number, plus, minus,
times, slash, oddsym, eql, neq,
lss, leq, gtr, geq, lparen,
rparen, comma, semicolon, period, becomes,
beginsym, endsym, ifsym, thensym, whilesym,
writesym, readsym, dosym, callsym, constsym,
varsym, procsym, elsesym, forsym, tosym,
downtosym, returnsym, pluseql, minuseql, plusplus,
minusminus,
/*符号枚举体增加5个关键字4个运算符,用黑体字标注*/
};
# define norw 18 /*关键字个数数由初始值13增加至18 */
#define symnum 41 /*符号数初始值由32增加至41 */
2、接着修改源程序“PL0.cpp”:
/*设置保留字名字,按照字母顺序,便于折半查找*/
strcpy(&(word[0][0]),"begin");
strcpy(&(word[1][0]),"call");
strcpy(&(word[2][0]),"const");
strcpy(&(word[3][0]),"do");
strcpy(&(word[4][0]),"downto"); /*增加保留字DOWNTO*/ strcpy(&(word[5][0]),"else"); /*增加保留字ELSE*/
strcpy(&(word[6][0]),"end");
strcpy(&(word[7][0]),"for"); /**增加保留字FOR*/
strcpy(&(word[8][0]),"if");
strcpy(&(word[9][0]),"odd");
strcpy(&(word[10][0]),"procedure");
strcpy(&(word[11][0]),"read");
strcpy(&(word[12][0]),"return"); /*增加保留字RETURN*/
strcpy(&(word[13][0]),"then");
strcpy(&(word[14][0]),"to"); /*增加保留字TO*/
strcpy(&(word[15][0]),"var");
strcpy(&(word[16][0]),"while");
strcpy(&(word[17][0]),"write");
/*设置保留字符号*/
wsym[0]=beginsym;
wsym[1]=callsym;
wsym[2]=constsym;
wsym[3]=dosym;
wsym[4]=downtosym; /*增加保留字符号downtosym*/ wsym[5]=elsesym; /*增加保留字符号elsesym*/ wsym[6]=endsym;
wsym[7]=forsym; /*增加保留字符号forsym*/ wsym[8]=ifsym;
wsym[9]=oddsym;
wsym[10]=procsym;
wsym[11]=readsym;
wsym[12]=returnsym; /*增加保留字符号returnsym*/ wsym[13]=thensym;
wsym[14]=tosym; /*增加保留字符号tosym*/ wsym[15]=varsym;
wsym[16]=whilesym;
wsym[17]=writesym;
在语法分析函数getsym()添加++ -- += -=的符号分析:
/************ 增加检测++和+=符号***************/
else if(ch=='+')
{
getchdo;
if(ch=='=')
{
sym=pluseql; //构成+=号
getchdo;
}
else if(ch=='+')
{
sym=plusplus; //构成++号
getchdo;
}
else
{
sym=plus;
}
}
/********************结束*********************/
/************** 增加检测--和-=符号************/
else if(ch=='-')
{
getchdo;
if(ch=='=')
{
sym=minuseql; //构成-=号
getchdo;
}
else if(ch=='-')
{
sym=minusminus; //构成--号
getchdo;
}
else
{
sym=minus;
}
}
/*******************结束**********************/ 四、心得体会
熟悉了PL0的词法分析,了解了程序头文件和初始化函数“init()”的原理和功能,需要知道程序查找时用到了折半查找法,所以添加单词时注意按字典序的方
式插入单词。
学院专业班组、学号
姓名协作者_________ 教师评定_________________
实验题目修改单词
一、实验目的与要求
在分析理解一个教学型编译程序(如PL/0)的基础上,进一步对词法分析程序理解,扩充。
二、实验内容
修改单词:不等号# 改为<>
三、设计方法
因为<>不为单字符,不能被识别,故去掉原先单字符‘#’的设置部分://ssym['#']=neq;
需要在getsym()部分增加不等号语法判断:
if(ch=='<') /*检测小于或小于等于符号*/
{
getchdo;
if(ch=='=') //小于号后不是跟着等号
{
sym=leq; //构成小于等于号<=
getchdo;
}
//增加不等号语法分析
else if(ch=='>') //小于号后面跟着大于号
{
sym=neq; //构成不等号<>
getchdo;
}
else
{
sym=lss; //小于号<
}
}
四、心得体会
进一步理解词法分析程序,了解了GetSym()是如何分析单词,仿照前面<=符号写法可以实现不等号的语法分析。
学院专业班组、学号
姓名协作者_________ 教师评定_________________
实验题目增加条件语句的ELSE子句
一、实验目的与要求
在前两个实验的基础上,实现ELSE语句的语法语义扩充。
二、实验内容
增加条件语句的ELSE子句
三、设计方法
修改IF… THEN… ELSE条件语句句法分析流程图:
在int statement(bool* fsys,int * ptx,int lev) 函数增加else语法判断代码:
if(sym==elsesym) /*than语句后面发现else*/
{
getsymdo;
cx2=cx;
code[cx1].a=cx+1; /*cx为当前的指令地址,cx+1即为then语句执
行后的else语句的位置,回填地址
*/
gendo(jmp,0,0);
statementdo(fsys,ptx,lev);
code[cx2].a=cx; /*经statement处理后,cx为else后语句执行
完的位置,它正是前面未定的跳转地址,回
填地址*/
}
else /*than语句后面没有发现else*/
{
code[cx1].a=cx; /*经statement处理后,cx为then后语句执行完
的位置,它正是前面未定的跳转地址*/
}
四、测试用例
PL0程序代码段“test1.pl0”:
测试结果:
五、心得体会
通过这几次的实验,使我对PL0有了初步的认识,特别对其中词法分析,语法语义分析有进一步的认识!。