1、简单编译器编译原理课设中版编译原理课程设计简单编译器学 院(系):电子信息与电气工程学部 学 生 姓 名:李梦珂 学 号:6 班 级:电计1101 同 组 人 :宫丽迪 电计1101 6陈笛 电计1101 6大连理工大学Dalian University of Technology1 词法分析(李梦珂 6 负责) 实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的明白得。 实验要求设计、编制并调试一个词法分析程序,三人一组。待分析的简单的词法(1)关键字: int if then else while do read write所有的关键字都是小写。(2)运算符和界符: := =
2、+ - + - * / = = ; ( ) #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式概念:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和换行符组成。空格一样用来分隔ID、SUM、运算符、界符和关键字,词法分析时期通常被忽略。 各类单词符号对应的类别码:表 各类单词符号对应的类别码单词符号种别码 单词符号种别码int1+17If2-18Then3:=19else420while5!=21do623write8=24lettet(letter|digit)*10=25dight dight*11;
3、26=12(27+13)28-1430*15!31/16:32 ,3335 36 词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)组成的序列。其中:syn为单词类别码; token为寄存的单词自身字符串; sum为整型常数。例如:对源程序输入如下: Int x,y; X:=2*y; If(x5) Then x:=2*x+2/3;#后经词法分析输出如下序列:( 35 (int 1)(x 10)(, 33)(y 10) (;26)(x 10) 词法分析程序的算法思想:算法的大体任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其大体思想是依照扫描
4、到单词符号的第一个字符的种类,拼出相应的单词符号。 主程序示用意:主程序示用意如下图。其中初始包括以下两个方面: 关键字表的初值。关键字作为特殊标识符处置,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,那么该单词为关键字,不然为一样标识符。关键字表为一个字符串数组,其描述如下:Char *rwtab6 = “int”, “if”, “then”, “else”,“while”, “do”, “read”,”write”; 图(2)程序中需要用到的要紧变量为syn,token和sum 扫描子程序的算法思想:第一设置3个变量:token用来寄
5、存组成单词符号的字符串;sum用来整型单词;syn用来寄存单词符号的类别码。扫描子程序要紧部份流程如下图。 图 词法分析程序的C语言程序源代码: 结果分析:输入如下: Int x,y; X:=2*y; If(x5) Then x:=2*x+2/3;#后经词法分析输出如下序列:( 35 (int 1)(x 10)(, 33)(y 10) (;26)(x 10) 如下图: 图 总结:词法分析的大体任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其大体思想是依照扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本实验的完成,加倍加深了对词法分析原理的明白得。 2 语法分析 实验目的
6、编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 待分析的简单语言的语法用扩充的BNF表示如下:=;:=;:=:=ID:=:=+ | -:=* | /:=ID | NUM | () 实验算法结构输入单词串,以“#”终止,若是是文法正确的句子,那么输出成功信息,打印“success”,不然输出“error”。例如: 输入 int a,x,b; a:=9; x:=2*3; b:=a+x 输出 success! 语法分析程序的算法思想(1)主程序示用意如下图。 图 语法分析主程序示用意(2)递归下降分
7、析程序示用意如下图。 图 递归下降分析程序示用意(3)语句串分析进程示用意如下图。图2-3 语句串分析示用意(4)statement语句分析程序流程如图、所示。 图 statement语句分析函数示用意 图 expression表达式分析函数示用意图 term分析函数示用意 图 factor分析进程示用意 结果分析:输入 后输出success! 如下图:图输入 后输出 error 如下图:图 总结:通过本次实验,了解了语法分析的运行进程,主程序大致流程为:“置初值”挪用scaner函数读下一个单词符号挪用IrParse终止。递归下降分析的大致流程为:“先判定是不是有声明”不是那么“犯错处置”,
8、假设是那么“挪用scaner函数”挪用语句串分析函数“判定是不是为end”不是那么“犯错处置”,假设是那么挪用scaner函数“判定syn=0&kk=0是不是成立”成立那么说明分析成功打印出来。不成立那么“犯错处置”。3 语义分析程序 实验目的:通过上机实习,加深对语法制导翻译原理的明白得,把握将语法分析所识别的语法成份变换为中间代码的语义翻译方式。 实验要求:采纳递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 算法思想: 程序结构图(1)主程序示用意如下图。 图 语法分析主程序示用意(2)递归下降分析程序示用意如下图。(3)语句串分析进程示用意如下图。 图递归下
9、降分析程序示用意 图 语句串分析示用意(4)statement语句分析程序流程如图、所示。 图 statement语句分析函数示用意 图 expression表达式分析函数示用意图 term分析函数示用意图2-7 factor分析进程示用意 设置语义进程(1)emit(char *result,char *ag1,char *op,char *ag2)该函数的功能是生成一个三地址语句送到四元式表中。四元式表的结构如下:struct char result8;char ag18;char op8;char ag28;quad20; (2) char *newtemp()该函数回送一个新的临时变量
10、名,临时变量名产生的顺序为T1,T2,char *newtemp(void) char *p; char m8; p=(char *)malloc(8); k+; itoa(k,m,10); strcpy(p+1,m); p0=t; return(p); 函数lrparser 在原先语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中咱们只对表达式、赋值语句进行翻译。 简单赋值语句的翻译文法SID n ifD n p = E x 若ID概念,则emit x (n=x) ;不然错误E x T q + T r x=newtemp ;emit x qr (x=q + r)T x F
11、 q * F r x=newtemp ;emit x qr (x=q * r)F x ID n ifD n p ;x=n F x ( E q ) x=qF x NUM lexval ifD lexval p ; x= lexval ifD进程表示在符号表中查找标识符,假设不存在,那么报告“变量未概念而利用”的错误,假设存在,返回标识符在符号表中的入口地址p。在执行语义规那么,输出四元式时, 参数可用变量名、临时变量名和整常数代替。 newtemp()函数用来产生临时变量, 如产生临时变量t1 : N=N+1; “t”| ITOS(N) ;emit()函数产生四元式代码: 例如用输出函数输出:t
12、1=q+r 例如:翻译x=sum*(b+c); 四元式是: t1=b+c t2=sum*t1 x=t2;在下面的递归下降语法制导翻译程序中,sym和symval 读取词法分析结果中的单词二元式. 如:关于单词二元式 (ID sum), 则ID存入syn中,sum存入scaner中。 结果分析 总结:通过本次实验,了解了语法分析的运行进程,主程序大致流程为:声明-“置初值”挪用scaner函数读下一个单词符号挪用IrParse四元式输出-终止。递归下降分析的大致流程为:“先判定是不是有声明”不是那么“犯错处置”,假设是那么“挪用scaner函数”挪用语句串分析函数“判定是不是为”不是那么“犯错处置”,假设是那么挪用scaner函数“判定syn=0&kk=0是不是成立”成立那么说明分析成功打印出来。不成立那么“犯错处置”。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1