编译原理实验报告2011_第1页
编译原理实验报告2011_第2页
编译原理实验报告2011_第3页
编译原理实验报告2011_第4页
编译原理实验报告2011_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

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",&

3、quot;begin","else","end","if","then","var","while"/保留字char *operatornum4="+","-","*","/"/运算符char *comparison6="<","<=","=",">",">=",&

4、quot;<>"char *interpunction8=",","",":=",".","(",")","",""/界限符(4)。具体设计过程(包括主控程序、各个功能模块的具体实现)。字母处理:char letterprocess (char ch)/字母处理函数 int i=-1; char letter20; while (isalnum(ch)!=0)/isalnum:如果是英文或阿拉伯数字 letter+

5、i=ch; ch=fgetc(fp); ; letteri+1='0' if (search(letter,1) printf("<%s,->n",letter); /strcat(letter,"n"); /fputs('<' letter '>n',outp); else printf("<indentifier,%s>n",letter); /strcat(letter,"n"); /fputs(letter,outp); r

6、eturn(ch);数字处理:char numberprocess(char ch)/数字处理程序 int i=-1; char num20; while (isdigit(ch)!=0) num+i=ch; ch=fgetc(fp); if(isalpha(ch)!=0)/如果是字母即为以数字开始的标识符,这是非法的 while(isspace(ch)=0)/负责读完这个非法标识符 num+i=ch; ch=fgetc(fp); numi+1='0' printf("错误!非法标识符:%sn",num); goto u; numi+1='0'

7、; printf("<num,%s>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"); el

8、se str =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 &

9、lt;temp> int10® Num int10 | Num OP® +| - |* |/ |>| < | = | ( | ) | ; | | = | >= |<= | !=Keyword®if | then | else | while | do Letter®a|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|ZNum®0|1|2|3|4|5|6|7|8|9 |&

10、lt;temp>® Letter <temp> | Num <temp> |实验二 LR语法分析技术一 实验目的通过设计调试LR语法分析程序,实现根据词法分析的输入TOKEN字,进行文法的语法分析;加深对课堂教学的理解;提高语法分析方法的实践能力。二 实验内容使用附录中的文法,可以对类似下面的程序语句进行语法分析:int a;int b;int c;a=2;b=1; if (a>b)c=a+b;elsec=a-b;三 实验要求(一) 程序设计要求(1)给出主要数据结构:分析栈、符号表、语法分析树;(2)将扫描器作为一个子程序,每次调用返回一个TOK

11、EN;(3)程序界面:表达式输入、语法分析树的表示结果(文件或者图形方式);(二)实验报告撰写要求(1)系统功能分析与设计(包括各个子功能模块的功能说明); 输入单词符号,进行语法检查,判断源程序是否符合给定文法的语法定义,通过语义分析检查语义,运用语法制导翻译原理,将语法分析所识别的语法范畴变换为中间代码(四元式)。(2)开发平台(操作系统、设计语言);Windows,c+(3) 设计方案:包括功能模块结构图、主要函数的流程图;主控程序语法分析各个功能函数语法分析器Token链增加结束标记及初始化查actions创建叶子节点语法分析成功语法分析错误创建节点语法分析结束(4) 主要数据结构:分

12、析栈、分析表、符号表、语法分析树;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,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 /

13、 # ; /*存储算符优先关系表,先于为,后于或同等优先为-1,其它为表示出错*/ struct keyword /存储关键字,标识符,界限符的NAME及编号char *name;int kind;keyword_ABC60;struct SymbolTable /字符表结构体int symbol_address;int symbol_length;char *symbol_type;char *symbol_kind;SymbolTable1100;/*存放读入的token的结构体*/struct ch_charchar *chchar;struct ch_char *next;*p,*h,

14、*temp,*top;/*进行分析用的栈结构*/struct fenxizhanchar *starname;float val;struct fenxizhan *next;*base1,*stact_top,*stact_top_top;(5) 具体设计实现过程(包括主控程序、各个功能模块的具体实现)。 void analyze_ABC(FILE *output,char *arry) /识别关键字、标识符、数字int i=0,flag=0;int count=0;if (isalpha(arry0) /判断首字母是不是英文字母for(int j=1;j<=33;j+) /关键字查找

15、if (strcmp(keyword_ABC,arry)=0) /如果与关键字匹配的话printf("%s (%d,_)n",keyword_ABC,keyword_ABCj.kind); /输出关键字的token串fprintf(output,"%s (%d,_)n",keyword_ABC,keyword_ABCj.kind);/并写入token串文件flag=1; /判断关键字SymbolTable_fuction(num2,strlen(keyword_ABC),"关键字",&q

16、uot;字符型"); /符号表函数调用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)strlen(arry);i+) if(isdigit(arr

17、yi)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(o

18、utput,"%s is not standard symbol!",arry); /提示所要识别的字符没有定义void analyze_CD(FILE *outfile,char *symbol) /识别界限符、运算符 int flag=0;for (int u=38;u<=60;u+)if (strcmp(keyword_ABC,symbol)=0) /界限符、运算符查找printf("%s (%d,_)n",keyword_ABC,keyword_ABCu.kind);/输出界限符、运算符的token串fprintf(

19、outfile,"%s (%d,_)n",keyword_ABC,keyword_ABCu.kind);/并写入token串文件flag=1;SymbolTable_fuction(num2,strlen(keyword_ABC),"界限符和运算符","符号");/符号表函数调用if(flag=0)printf("%s is unrecognizable symbol!n",symbol); /输出不符合的字符fprintf(outfile,"%s is unrecognizabl

20、e symbol!n",symbol);int changchar_int(char *ch)/*将字符转为数字,以得到算符优先值*/ int t; if(strcmp(ch,"+")=0)t=0;else if(strcmp(ch,"-")=0)t=1;else if(strcmp(ch,"*")=0)t=2;else if(strcmp(ch,"/")=0)t=3;else if(strcmp(ch,"(")=0)t=4;else if(strcmp(ch,")"

21、;)=0)t=5;else if(strcmp(ch,"#")=0)t=7;else t=6; return t; void error()/错误提示printf("n");printf("输入表达式有错误!n");exit(0);void push(char *pchar,float val)/*入栈函数*/ stact_top_top=(fenxizhan*)malloc(sizeof(fenxizhan); stact_top_top->starname=pchar; stact_top_top->val=val;s

22、tact_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->next; return data; float calculate(float number1,float number2,char *str)/四则运算float sum;if(strcmp(str,"+")=

23、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; return sum;/返回结果四 实验总结加深了对语法分析器的理解五 运行结果:附录:简单类c语言文法产生式 语

24、义规则注: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) S1 do S2C.true = newlabel; C.false = newlabel;S1.nex

25、t = 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.place>E2.placegotoC.true) |gen(gotoC.false)C E1 < E2 C.code = E1.code | E2.code |gen(ifE1.place<E2.placegotoC.true) |gen(gotoC.false

26、)C E1 = E2 C.code = E1.code | E2.code |gen(ifE1.place=E2.placegotoC.true) |gen(gotoC.false)E E1 + T E.place = newtemp;E.code = E1.code|T.code|gen(E.place:=E1.place+T.place)E E1 T E.place = newtemp; E.code = E1.code | T.code |gen(E.place:=E1.place-T.place)E T E.place = T.place; E.code = T.codeT F T.p

27、lace = F.place; T.code = F.codeT T1 * F T.place = newtemp;T.code = T1.code | F.code |gen(T.place:=T1.place*F.place)T T1 / F T.place = newtemp; T.code = T1.code | F.code |gen(T.place:=T1.place/F.place)F ( E ) F.place = E.place; F.code = E.codeF id F.place = ; F.code = F int10 F.place = int10.v

28、alue; F.code = 实验三 语义分析及中间代码生成一 实验目的通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法范畴变换为某种中间代码的语义翻译方法。二 实验内容实现简单的高级语言源程序的语义处理过程。三 实验要求(一) 程序设计要求(1) 目 标 机:8086及其兼容处理器(2) 中间代码:三地址码或者四元式(3) 设计结果:语法分析树(节点具有属性)、三地址码表、符号表、TOKEN串表(4) 语义分析内容要求:1) 变量说明语句2) 赋值语句3) 控制语句(任选一种)(5) 其它要求:1) 将词法分析(扫描器)作为子程序,供语法语义程序调用;2) 使用语法制导

29、的语义翻译方法;3) 编程语言自定;4) 最好提供源程序输入界面;5) 目标代码生成暂不做;6) 编译后,可查看TOKEN串、语法分析树、符号表、三地址码表;7) 主要数据结构:产生式表、符号表、语法分析树、三地址码表。 所用文法使用实验2中的文法。附录:语义分析源程序范例int a;int b;int c;a=2;b=1; if (a>b)c=a+b;elsec=a-b;(二)实验报告撰写要求(1) 系统功能分析与设计(包括各个子功能模块的功能说明);首先将待编译程序写入TXT文本,接下来经过词法扫描器的扫描和分析,将程序转化为TOKEN链,接下来语法分析器对TOKEN链进行语法分析,

30、产生语法分析树和符号表。接下来使用语义制导翻译使用语义分析器进行语义分析,生成参数表,函数表,以及四元式的中间代码。(2) 开发平台(开发软硬件环境);Windows C语言(3) 语义翻译中使用的数据结构;/定义结点类template <class Elem> class linkpublic:link* next;Elem element;int sign;link(const Elem& elementValue,link* nextValue = NULL)element = elementValue;next = nextValue;sign = -1;link(

31、link* nextValue = NUll)next = nextValue;sign = -1;/定义堆栈类template <class Elem> class stackprivate:link<Elem> *top;int size;public:stack(int sz = DefaultSize)top = NULL;size = 0;stack()clear();void clear()while(top!=NULL)link<Elem>* temp = top;top = top->next;size = 0;delete temp;

32、/入栈函数bool push(const Elem& item)top = new link<Elem>(item,top);size+;return true;/出栈函数Elem pop()Elem item;if (size = 0)return false;item = top->element;link<Elem>* temp = top->next;delete top;top = temp;size-;return item;/获取栈顶元素的值Elem GetTop() constElem item; if(size = 0)return

33、 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) 程序具体设计实现过程(包括主要功能模块的具体实现)。/定义保存first,Follow的类class FirstFollowpublic:char ch;char first10;char follow10;/ 建立文法分析表类class LRParseprivate:Item * item;Grammar

温馨提示

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

评论

0/150

提交评论