编译方法实验指导书(8学时_第1页
编译方法实验指导书(8学时_第2页
编译方法实验指导书(8学时_第3页
编译方法实验指导书(8学时_第4页
编译方法实验指导书(8学时_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、E-TG-FSG-iSG-i/FSG-i/iSG-i/iG-i/i-TG-i/i-FSG-i/i-iSG-i/i-iG-i/i-i编译原理实验课程教学大纲1实验课程名称:编译原理实验2实验课程名称(英文): Compiling Method3课程代码:4实验课程性质:非独立设课5学 时:86学 分:37适用专业:计算机科学与技术 8先修或同修课程:离散数学,数据结构,高级语言程序设计等9开课单位:信息与计算机工程学院10制定实验教学大纲的依据:东北林业大学编译方法教学大纲。11本实验课在培养实验能力中的地位及作用通过本实验课程培养学生以下几方面的能力:加深学生对编译方法所涉及的概念、算法、理论

2、的理解;体验编译方法所涉及的抽象思维的具体实现; 激励学生在编译方法设计方面的创新精神;培养正规系统程序设计的能力;12应达到的实验能力标准本课程的实验主要培养学生的抽象思维能力和正规的程序设计能力,加强对编译方法基本原理、基本概念的理解,使学生初步具备将算法或理论转化为正确程序的能力。13实验内容(1) 实验一词法分析实验目的: 编制一个类c语言的词法分析程序。 实验要求:画好类c语言的有穷状态自动机。在进行本实验之前,应熟练课程内容,在上机之前做好实验计划,编写好相应的代码实验内容:根据有穷状态自动机编制一个类c语言的扫描程序。 (2)实验二 语法分析 实验目的:编写一个类c语言的语法分析

3、程序实验要求:阅读课本有关章节,花一周时间确定语法部分的文法,设计出LL(1)分析表;考虑好设计方案;设计出模块结构、测试数据,初步编制好程序。实验内容:根据LL(1)分析表和文法编制类c语言的语法分析程序实验指导书(1) 实验一词法分析实验目的:编制一个类c语言的词法分析程序。 一、 实验内容实验目的:建立一个词法分析器,其功能是输入一段源程序,经过处理后,按程序顺序并以二元式输出单词符号(即程序语言的语法单位),并且,如果该单词是关键字或符号(包括界符和运算符),则在相应的关键字表或符号表中找出其位置;如果该单词是关键字或常数,则直接输出。 二、 程序设计原理与方法程序设计原理: 根据各个

4、单词的状态转换图,可以进行合成,给出能够识别Simple-C语言中各类单词的DFA,如图2-8所示。三、 示例程序 #include stdio.h#include string.h/状态名表typedef enum S_state, A_state, B_state, C_state, D_state, E_state, F_state, G_state, H_state, I_state, J_state, K_state, L_state, M_state, N_state, O_state, P_state, Q_state, R_state, T_state, U_state, V_

5、state, W_state, X_state, Y_state, Z_state, END_state STATE;/单词类别标识typedef enum KEY_WORD = 0, IDENTIFIER, UNSINED_INT, REAL_CONST, SINGLE_DELIMITER, COMMENT, DIVISION_SIGN, ADDSELF_OPERATOR, ADD_OPERATOR, SUBTRACTIONSELF_OPERATOR, SUBTRACTION_OPERATOR, DOUBLERELATIONAL_OPERATOR, SINGLERELATIONAL_OPER

6、ATOR, ERROR, CHAR_CONST, STRING_CONST , NONE WORDTYPE;/单词类别名称char WordTypeExplanation30 = 关键字, 标识符, 无符号整数 ,实型常量 ,单界限符, 注释, 除号, 自增运算符 , 加法运算符, 自减运算符, 减法运算符或取负运算符, 双界限关系运算符 ,单界限关系运算符, 出错, 字符常量, 字符串常量 , 无可处理字符 ;#define KEYWORD_COUNT 18#define KEYWORD_MAXLENGTH 20 /关键字表 编号由位置隐含char KeyWordTableKEYWORD_C

7、OUNTKEYWORD_MAXLENGTH = break, case, char ,continue ,default, do, double, else , float, for , if, int, return, struct , switch ,unsigned ,void, while ;/* GetWordType判断是关键字还是自定义标识符 参数:char* str 待判断标识符 返回值:KEY_WORD 关键字 IDENTIFIER 自定义标识符*/WORDTYPE GetWordType(char* str) int i=0; for(i = 0;i KEYWORD_COU

8、NT ; i+) if(strcmp(str, KeyWordTablei) =0 ) break; /*查找关键字表,此处可用折半查找提高效率*/ if(i = A & ch= a & ch= 0 & ch) return 17; else if(ch = = strlength ) state = Z_state; break; ch_type = GetCharactorType(straddrcur_pos); /*取得当前字符类别*/ switch(ch_type) case 1: /*字母*/case 3: /*下划线*/case 4: /*字母e或E*/ state = A_st

9、ate;tmpstrcur_pos- *pcurpos = straddrcur_pos; /*记录当前字符,用以在B状态判断是标识符还是关键字*/ break;case 2: /*数字*/ state = C_state;break;case 6:/*星号*/case 7:/*百分号*/ case 9:/*分号*/case 10:/*左方括号*/case 11:/*右方括号*/case 12:/*逗号*/case 13:/*空格*/case 22:/*左括号*/case 23:/*右括号*/ case 24: /*左大括号*/case 25: /*右大括号*/ state = L_state

10、; break; case 8: /*斜线*/ state = M_state; break; case 14: /*加号*/ state = Q_state; break;case 15: /*减号*/ state = R_state; break;case 16: /*等号*/case 17: /*大于号*/case 18: /*小于号*/ state = T_state; break;case 19: /*叹号*/ state = U_state; break; case 20: /*单引号*/ state = V_state; break;case 21: /*双引号*/ state

11、= X_state; break; default: /* 其它字符 */ state = Z_state; break; cur_pos +; break; case A_state: if(cur_pos = strlength ) state = B_state; break; ch_type = GetCharactorType(straddrcur_pos); if(ch_type = 1 | ch_type = 2 | ch_type = 3 | ch_type = 4) state = A_state; tmpstrcur_pos- *pcurpos = straddrcur_p

12、os; /*记录当前字符,用以在B状态判断是标识符还是关键字*/ cur_pos +; else state = B_state; break; case B_state: wordtype = GetWordType(tmpstr); /*判断是关键字还是标识符*/ state = END_state; break; /*A_state - B_state 处理关键字和标识符 */ case C_state: if(cur_pos = strlength ) state = D_state; break; ch_type = GetCharactorType(straddrcur_pos);

13、 if(ch_type = 2) /*数字*/ cur_pos +; state = C_state; else if(ch_type = 4) /* e或E */ cur_pos +; state = H_state; else state = D_state; break; break; case D_state: if(cur_pos = strlength ) /*所有字符处理完毕*/ wordtype = UNSINED_INT; state = END_state; break; ch_type = GetCharactorType(straddrcur_pos);/*此句可以省略

14、*/ if(ch_type = 5)/*小数点*/ cur_pos +; state = F_state; else /*其它字符*/ wordtype = UNSINED_INT; state = END_state; break; case F_state: if(cur_pos = strlength ) /*所有字符处理完毕*/ wordtype = ERROR; state = END_state; break; ch_type = GetCharactorType(straddrcur_pos); if(ch_type = 2)/*数字*/ cur_pos +; state = G

15、_state; else /*其它字符*/ wordtype = ERROR; state = END_state; break; case G_state: if(cur_pos = strlength ) /*所有字符处理完毕*/ wordtype = REAL_CONST ; state = END_state; break; ch_type = GetCharactorType(straddrcur_pos); if(ch_type = 2 ) /*数字*/ cur_pos +; state = G_state; else if(ch_type = 4) /*E 或 e*/ cur_p

16、os +; state = H_state; else wordtype = REAL_CONST ; state = END_state; break; case H_state: /*处理科学记数法表示的实数中 e或E后面的部分 */ if(cur_pos = strlength ) /*所有字符处理完毕, e后面没有字符*/ wordtype = ERROR; state = END_state; break; ch_type = GetCharactorType(straddrcur_pos); if(ch_type = 2 ) /*数字*/ cur_pos +; state = J_

17、state; else if(ch_type = 14 | ch_type = 15 ) /* + 或 - */ cur_pos +; state = I_state; else /* 3.4e 或 3e 后面不是数字也不是正负号 */ wordtype = ERROR; state = END_state; break; case I_state: if(cur_pos = strlength ) /*所有字符处理完毕, e+-后面没有字符*/ wordtype = ERROR; state = END_state; break; ch_type = GetCharactorType(str

18、addrcur_pos); if(ch_type = 2 ) /*数字*/ cur_pos +; state = J_state; else /* e+-后面不是数字*/ wordtype = ERROR; state = END_state; break; case J_state: if(cur_pos = strlength ) /*所有字符处理完毕,是实常数*/ wordtype = REAL_CONST; state = END_state; break; ch_type = GetCharactorType(straddrcur_pos); if(ch_type = 2 ) /*数

19、字*/ cur_pos +; state = J_state; else /* 是实常数*/ wordtype = REAL_CONST; state = END_state; break; /*C_state - J_state 数字(包括 正整数 实数 科学记数的实数)*/ case L_state: wordtype = SINGLE_DELIMITER; state = END_state; break; case M_state: if(cur_pos = strlength ) /*所有字符处理完毕,是除号*/ wordtype = DIVISION_SIGN; state = E

20、ND_state; break; ch_type = GetCharactorType(straddrcur_pos); if(ch_type = 6 ) /*星号*/ cur_pos +; state = N_state; else /*是除号 */ wordtype = DIVISION_SIGN; state = END_state; break; case N_state: if(cur_pos = strlength ) /*所有字符处理完毕, ,注释不完整*/ wordtype = ERROR; state = END_state; break; ch_type = GetChar

21、actorType(straddrcur_pos); if(ch_type != 6 ) /*不是星号*/ cur_pos +; state = N_state; else /*是星号 */ cur_pos +; state =O_state; break; case O_state: if(cur_pos = strlength ) /*所有字符处理完毕,注释不完整*/ wordtype = ERROR; state = END_state; break; ch_type = GetCharactorType(straddrcur_pos); if(ch_type != 8 ) /*不是斜线

22、*/ cur_pos +; state = N_state; else /*是斜线 */ cur_pos +; wordtype = COMMENT; state = END_state; break; /* 注释和除号处理完毕*/ case Q_state: if(cur_pos = strlength ) /*所有字符处理完毕,是加号 */ wordtype = ADD_OPERATOR; state = END_state; break; ch_type = GetCharactorType(straddrcur_pos); if(ch_type = 14 ) /* 自增+ */ cur

23、_pos +; wordtype = ADDSELF_OPERATOR; state = END_state; else /*是加号 */ wordtype = ADD_OPERATOR; state = END_state; break; /*加号和自增处理完毕*/ case R_state: if(cur_pos = strlength ) /*所有字符处理完毕,是减号 */ wordtype = SUBTRACTION_OPERATOR; state = END_state; break; ch_type = GetCharactorType(straddrcur_pos); if(ch

24、_type = 15 ) /* 自减- */ cur_pos +; wordtype = SUBTRACTIONSELF_OPERATOR; state = END_state; else /*是减号 */ wordtype = SUBTRACTION_OPERATOR; state = END_state; break; /*减号和自减处理完毕*/ case T_state: if(cur_pos = strlength ) /*所有字符处理完毕,是 关系单界运算符 */ wordtype = SINGLERELATIONAL_OPERATOR; state = END_state; bre

25、ak; ch_type = GetCharactorType(straddrcur_pos); if(ch_type = 16 ) /* 关系双界运算符 = = = strlength ) /*所有字符处理完毕,出错 */ wordtype = ERROR; state = END_state; break; ch_type = GetCharactorType(straddrcur_pos); if(ch_type = 16 ) /* 关系双界运算符 != */ cur_pos +; wordtype = DOUBLERELATIONAL_OPERATOR ; state = END_sta

26、te; else /* 出错 */ wordtype = ERROR; state = END_state; break; /* 关系 单双 界运算符处理完毕*/ case V_state: if(cur_pos = strlength ) /*所有字符处理完毕,字符常量缺少右边的单引号 */ wordtype = ERROR; state = END_state; break; ch_type = GetCharactorType(straddrcur_pos); if(ch_type = 20 ) /* 两个单引号中间没有字符,出错 */ cur_pos +; wordtype = ERR

27、OR; state = END_state; else /* 其它字符 */ cur_pos +; state = W_state; break; case W_state: if(cur_pos = strlength ) /*所有字符处理完毕,字符常量缺少右边的单引号 */ wordtype = ERROR; state = END_state; break; ch_type = GetCharactorType(straddrcur_pos); if(ch_type = 20 ) /* 字符型常量 */ cur_pos +; wordtype = CHAR_CONST; state =

28、END_state; else /* 出错,字符型常量中只能有一个字符 */ wordtype = ERROR; state = END_state; break; /* 字符型常量 处理完毕*/ case X_state: if(cur_pos = strlength ) /*所有字符处理完毕,字符串常量缺少右边的双引号 */ wordtype = ERROR; state = END_state; break; ch_type = GetCharactorType(straddrcur_pos); if(ch_type = 21 ) /* 字符串型常量 */ cur_pos +; word

29、type = STRING_CONST; state = END_state; else /* 其它字符 */ cur_pos +; state = X_state; break; /* 字符串型常量 处理完毕*/ case Z_state: default: wordtype = ERROR; state = END_state; break; *pcurpos = cur_pos ; /* 修改当前行待处理位置游标变量的值 */ return wordtype; int main() char teststr80 = 0; char outstr256 = 0; int i=0; int

30、curpos = 0 , start = 0; WORDTYPE wordtype; int strlength = 0; puts(Input a program line to test please: ); gets(teststr); strlength = (int)strlen(teststr); while(curpos strlength) start = curpos; memset(outstr, 0 , sizeof(char)*256); wordtype = RecogniteWordByDFA(teststr ,strlength , &curpos ); for(

31、i = start;icurpos; i+)outstri-start = teststri; printf(%s: %s)n, outstr , WordTypeExplanationwordtype); getchar(); return 0;四、总结在上述程序中,主要是实现了把源文件的关键字、标识符、常数、符号分离开的功能。并附带了简单的错误处理过程。 (2) 实验二 语法分析1、实验目的:对Simple-C语言进行LL(1)分析的实现过程及方法。 2、实验内容:编能够根据文法及LL(1)分析表生成语法分析程序。1)文法:Program:=ProgramHead FunctionDecl

32、are VarDifine FunctionGroup (2) | FunctionDeclare VarDifine FunctionGroup(3) | ProgramHead VarDifine FunctionGroup(4) | ProgramHead FunctionDeclare FunctionGroup(5) | ProgramHead FunctionGroup(6) | FunctionDeclare FunctionGroup(7) | VarDifine FunctionGroup(8) | FunctionGroup程序头:(9)ProgramHead := # i

33、ncludeLibFileName.h ProgramHead(10)LibFileName :=stdio(11) |math(12) |string(13) |ctype函数声明与全局变量定义:(14)FunctionDeclare := BaseType FunctionName(ForParList) FunctionDeclareMore(15) | struct StrTypeName FunctionName(ForParList) FunctionDeclareMore(16) | void StrTypeName FunctionName(ForParList) Functi

34、onDeclareMore(17)FunctionDeclareMore :=; FunctionDeclare(18) |(19)VarDifine := ExpSentence(20)FunctionName := Id函数组: (21)FunctionGroup := UnMainFunction MainFunction UnMainFunction(22)UnMainFunction :=FunctionHead FunctionBody(23) |(24)FunctionHead := BaseType FunctionName(ForParList)(25) | void Fun

35、ctionName(ForParList)(26) | struct StrTypeName FunctionName(ForParList)(27)FunctionBody :=ExpSentence ExecSentence(28)MainFunction := MainFunctionHead FunctionBody(29)MainFunctionHead := void main()类型:(30)BaseType :=int(31) |char(32) |float(33) |double(34)OneArrayType := BaseType ArrayNameDimlong (35)TwoArrayType := BaseType ArrayNameDimlong Dimlong(36)ArrayName :=Id(37)Dimlong :=Intc(38)StructureType :=struct StrTypeName StructureBody(39)StrTypeName := Id(40)StructureBody := MembersList (41)MembersList :=BaseType IdList; MembersListMore(42) |OneArrayType; MembersListMo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论