《编译原理实验报告2011(共21页).doc》由会员分享,可在线阅读,更多相关《编译原理实验报告2011(共21页).doc(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上编译原理实验报告姓 名: 高亮 学 号: 班 级: 计算机4班哈尔滨工业大学(威海) 计算机科学与技术学院实验一 词法扫描器设计一 实验目的通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。二 实验内容设计一个简单的类C语言的词法扫描器。三 实验要求(一) 程序设计要求(1) 根据附录给定的文法,从输入的类C语言源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、分隔符五大类;分发见最后附录。(2) 提供源程序输入界面;(3) 词法分析后可查看符号表和TOKEN串表;(4) 保存符号表和T
2、OKEN串表(如:文本文件); (5) 遇到错误时可显示提示信息,然后跳过错误部分继续进行分析。(二)实验报告撰写要求(1) 系统功能(包括各个子功能模块的功能说明);(2) 开发平台(操作系统、设计语言);Windows 系统,C语言(3) 设计方案;1) 主数据流图;源程序 Token链符号表词法分析器词法分析器是否为字母存入token链是否为数字存入token链是否为数字2) 主要子程序的流程框图(若有必要);3) 模块结构图;词法分析填入符号表生成单词序列字符分类读入字符4) 主要数据结构:符号表、TOKEN串表等。符号表:char *keyword8=do,begin,else,en
3、d,if,then,var,while;/保留字char *operatornum4=+,-,*,/;/运算符char *comparison6=,=,;char *interpunction8=,;,:=,.,(,),;/界限符(4)。具体设计过程(包括主控程序、各个功能模块的具体实现)。字母处理:char letterprocess (char ch)/字母处理函数 int i=-1; char letter20; while (isalnum(ch)!=0)/isalnum:如果是英文或阿拉伯数字 letter+i=ch; ch=fgetc(fp); ; letteri+1=0; if
4、(search(letter,1) printf(n,letter); /strcat(letter,n); /fputs(n,outp); else printf(n,letter); /strcat(letter,n); /fputs(letter,outp); return(ch);数字处理:char numberprocess(char ch)/数字处理程序 int i=-1; char num20; while (isdigit(ch)!=0) num+i=ch; ch=fgetc(fp); if(isalpha(ch)!=0)/如果是字母即为以数字开始的标识符,这是非法的 whil
5、e(isspace(ch)=0)/负责读完这个非法标识符 num+i=ch; ch=fgetc(fp); numi+1=0; printf(错误!非法标识符:%sn,num); goto u; numi+1=0; printf(n,num); /strcat(num,n); /fputs(num,outp);u: return(ch);主函数:void main () char str,c; printf(*词法分析器*n); /outp=fopen(二元式表.txt,w); if (fp=fopen(source.txt,r)=NULL) printf(源程序无法打开!n); else st
6、r =fgetc(fp); while (str!=EOF) if (isalpha(str)!=0) str=letterprocess(str); else if (isdigit(str)!=0) str=numberprocess(str); else str=otherprocess(str); ; printf(词法分析结束,谢谢使用!n); printf(点任意键退出!n); c=getch();四 实验总结能正确进行词法分析,遇到非法字符时能够继续执行五 运行结果附录:类C语言的词法文法id Letter int10 Num int10 | Num OP +| - |* |/
7、| = |= | !=Keywordif | then | else | while | do Lettera|b|c|d|e|f|g|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|ZNum0|1|2|3|4|5|6|7|8|9 | Letter | Num |实验二 LR语法分析技术一 实验目的通过设计调试LR语法分析程序,实现根据词法分析的输入TOKEN字,进行文法的语法分析;加深对课堂教学的理解;提高语法分析方法的实践能力。二 实验内容使用附录中的文法,可以对类似
8、下面的程序语句进行语法分析:int a;int b;int c;a=2;b=1; if (ab)c=a+b;elsec=a-b;三 实验要求(一) 程序设计要求(1)给出主要数据结构:分析栈、符号表、语法分析树;(2)将扫描器作为一个子程序,每次调用返回一个TOKEN;(3)程序界面:表达式输入、语法分析树的表示结果(文件或者图形方式);(二)实验报告撰写要求(1)系统功能分析与设计(包括各个子功能模块的功能说明); 输入单词符号,进行语法检查,判断源程序是否符合给定文法的语法定义,通过语义分析检查语义,运用语法制导翻译原理,将语法分析所识别的语法范畴变换为中间代码(四元式)。(2)开发平台(
9、操作系统、设计语言);Windows,c+(3) 设计方案:包括功能模块结构图、主要函数的流程图;主控程序语法分析各个功能函数语法分析器Token链增加结束标记及初始化查actions创建叶子节点语法分析成功语法分析错误创建节点语法分析结束(4) 主要数据结构:分析栈、分析表、符号表、语法分析树;void SymbolTable_fuction(int address,int lentgh,char *type,char *kind);/字符表函数int table88=1,1,-1,-1,-1,1,-1,1, / + 1,1,-1,-1,-1,1,-1,1, / - 1,1, 1, 1,-1
10、,1,-1,1, / * 1,1, 1, 1,-1,1,-1,1, / / -1,-1,-1,-1,-1,-1,-1,0, / ( 1,1,1,1,0,1,0,1, / ) 1,1,1,1,0,1,0,1, / i -1,-1,-1,-1,-1,0,-1,-1 / # ; /*存储算符优先关系表,先于为,后于或同等优先为-1,其它为表示出错*/ struct keyword /存储关键字,标识符,界限符的NAME及编号char *name;int kind;keyword_ABC60;struct SymbolTable /字符表结构体int symbol_address;int symbol
11、_length;char *symbol_type;char *symbol_kind;SymbolTable1100;/*存放读入的token的结构体*/struct ch_charchar *chchar;struct ch_char *next;*p,*h,*temp,*top;/*进行分析用的栈结构*/struct fenxizhanchar *starname;float val;struct fenxizhan *next;*base1,*stact_top,*stact_top_top;(5) 具体设计实现过程(包括主控程序、各个功能模块的具体实现)。 void analyze_
12、ABC(FILE *output,char *arry) /识别关键字、标识符、数字int i=0,flag=0;int count=0;if (isalpha(arry0) /判断首字母是不是英文字母for(int j=1;j=33;j+) /关键字查找if (strcmp(keyword_ABCj.name,arry)=0) /如果与关键字匹配的话printf(%s (%d,_)n,keyword_ABCj.name,keyword_ABCj.kind); /输出关键字的token串fprintf(output,%s (%d,_)n,keyword_ABCj.name,keyword_AB
13、Cj.kind);/并写入token串文件flag=1; /判断关键字SymbolTable_fuction(num2,strlen(keyword_ABCj.name),关键字,字符型); /符号表函数调用break;if(flag=0)printf(%s (34,%s)n,arry,arry);/输出标识符的token串fprintf(output,%s (34,%s)n,arry,arry);/并写入token串文件SymbolTable_fuction(num2,strlen(arry),简单变量,字符型);/符号表函数调用else /如果首字符不是英文字母for(;i(int)str
14、len(arry);i+) if(isdigit(arryi)count+;if (count=(int)strlen(arry) printf(%s (35,%s)n,arry,arry);/输出数字的token串 fprintf(output,%s (35,%s)n,arry,arry);/并写入token串文件SymbolTable_fuction(num2,strlen(arry),实数,整型); /符号表函数调用else printf(%s is not standard symbol!n,arry);fprintf(output,%s is not standard symbol!
15、,arry); /提示所要识别的字符没有定义void analyze_CD(FILE *outfile,char *symbol) /识别界限符、运算符 int flag=0;for (int u=38;ustarname=pchar; stact_top_top-val=val;stact_top_top-next=stact_top; stact_top=stact_top_top; float pop(void)/*出栈函数*/ if(strcmp(stact_top-starname,#)!=0 ) data=stact_top-val; stact_top=stact_top-nex
16、t; return data; float calculate(float number1,float number2,char *str)/四则运算float sum;if(strcmp(str,+)=0)sum=number1+number2;else if(strcmp(str,-)=0)sum=number1-number2;else if(strcmp(str,*)=0)sum=number1*number2;else if(strcmp(str,/)=0)if(number2=0)printf(错误提示:除数为零!);exit(0);sum=number1/number2; ret
17、urn sum;/返回结果四 实验总结加深了对语法分析器的理解五 运行结果:附录:简单类c语言文法产生式 语义规则注:P为文法的开始符号说明语句部分文法:P D SD T id ; D |T int | float程序语句部分文法:S id = E; S.code = E.code | gen(id.place:=E.place)S if (C) S1 C.true = newlabel; C.false = S.next;S1.next = S.next;S.code = C.code | gen(C.true:) | S1.codeS if (C) S1 else S2S while (C
18、) S1 do S2C.true = newlabel; C.false = newlabel;S1.next = S2.next =S.next;S.code = C.code | gen(C.true:) | S1.code| gen(gotoS.next)| gen(C.false:)| S2.code;S S ; S;C E1 E2C.code = E1.code | E2.code |gen(ifE1.placeE2.placegotoC.true) |gen(gotoC.false)C E1 E2 C.code = E1.code | E2.code |gen(ifE1.place
19、b)c=a+b;elsec=a-b;(二)实验报告撰写要求(1) 系统功能分析与设计(包括各个子功能模块的功能说明);首先将待编译程序写入TXT文本,接下来经过词法扫描器的扫描和分析,将程序转化为TOKEN链,接下来语法分析器对TOKEN链进行语法分析,产生语法分析树和符号表。接下来使用语义制导翻译使用语义分析器进行语义分析,生成参数表,函数表,以及四元式的中间代码。(2) 开发平台(开发软硬件环境);Windows C语言(3) 语义翻译中使用的数据结构;/定义结点类template class linkpublic:link* next;Elem element;int sign;link
20、(const Elem& elementValue,link* nextValue = NULL)element = elementValue;next = nextValue;sign = -1;link(link* nextValue = NUll)next = nextValue;sign = -1;/定义堆栈类template class stackprivate:link *top;int size;public:stack(int sz = DefaultSize)top = NULL;size = 0;stack()clear();void clear()while(top!=N
21、ULL)link* temp = top;top = top-next;size = 0;delete temp;/入栈函数bool push(const Elem& item)top = new link(item,top);size+;return true;/出栈函数Elem pop()Elem item;if (size = 0)return false;item = top-element;link* temp = top-next;delete top;top = temp;size-;return item;/获取栈顶元素的值Elem GetTop() constElem ite
22、m; if(size = 0)return false;item = top-element;return item;/获取堆栈的深度int length() constreturn size;/判断栈是否为空bool IsEmpty() constreturn top = NULL;/获取标志位int GetSign() constreturn top-sign; /设置标志位void SetSign(int s)top-sign = s;/定义产生式的数据结构class Productionpublic:char From;char To20;(4) 程序具体设计实现过程(包括主要功能模块
23、的具体实现)。/定义保存first,Follow的类class FirstFollowpublic:char ch;char first10;char follow10;/ 建立文法分析表类class LRParseprivate:Item * item;Grammar * egra;Grammar * gra;ParseTable * pt;char InputSymbol20;char NonTeminalSymbol20;char Symbol40;int NumOfTeminal;int NumOfNonTeminal;int NumOfGrammar;int NumOfItems;c
24、har * First(char *ch);char * Follow(char ch);bool IsTeminal(char ch);char GetDigitChar(int a);int GetCharDigit(char a);int ToDigit(char * a);char *ToChar(int a);void Error();public:void OutPutFirstFollow();void OutputItems();char GetNextOfDot(char *str);char * InsertIndexOf(char *str,int i);Producti
25、on Shift(Production pro);Grammar Goto(Grammar g,char ch);void FormItems(Grammar *g);Grammar E_cloure(Grammar g);void ExGrammar();void AddDot(Production str);LRParse();LRParse();void GetGrammar();void FormParseTable();void MadeMoves(char * pt);void Run();void analyze();bool IsInString(char *st,char ch);int GetPos(char *str,char ch);/消除左递归Grammar *ELRecrusion(Grammar *g); 四 实验总结通过本次试验,了解了语法分析的运行过程,主程序大致流程为:“置初值”调用scaner函数读下一个单词符号调用IrParse结束。递归下降分析的大致流程为:“先判断是否为begin”不是则“出错处理”,若是则“调用scaner函数”调用语句串分析函数“判断是否为end”不是则“出错处理”,若是则调用scaner函数“判断syn=0&kk=0是否成立”成立则说明分析成功打印出来。不成立则“出错处理”。五 运行界面专心-专注-专业