1、5理解并处理语义分析中的异常和错误。实验要求:1在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;2要求详细描述所选分析方法进行制导翻译的设计过程;3完成对所设计分析器的功能测试,并给出测试数据和实验结果;4为增加程序可读性,请在程序中进行适当注释说明;5整理上机步骤,总结经验和体会;6认真完成并按时提交实验报告。【实验过程记录(源程序、测试用例、测试结果及心得体会等)】#includecstring#define size 1024using namespace std;int step=0;typedef struct variable_T char operate;/操作
2、符 string var1;/变量 1 string var2;/变量 2 int num;/第几个变量 variable_T;variable_T tsize;/记录四元式变量的变量 int tsize=-1;/表示是第tsize+1个变量typedef struct char_stack char content;/当前字符 string endchar;/这个符号代表的中间变量 可以是 i, 也可以是 t1, t2, 等等 /和该字符相关的中间变量的序号 char_stack;string table1913=/ + - * / ) # ( i E T F P /* 0 */ err,
3、s5s61234, /* 1 */ s7s8acc /* 2 */ r3s9s10 /* 3 */ r6 /* 4 */ r8s11 /* 5 */ c /* 6 */ r10 /* 7 */ d /* 8 */ e /* 9 */ f /* 10*/ g, /* 11*/ h /* 12*/ s18 /* 13*/ r1 /* 14*/ r2 /* 15*/ r4 /* 16*/ r5 /* 17*/ r7 /* 18*/ r9;int getLength(char strsize) int i=0; while(stri!=0) i+; return i; int getLengthc(c
4、har_stack strsize) while(stri.content!int getstringLength(string str)char gettop(char stacksize,int top) if(stacktop! return stacktop; else return #;void popstack(char *stack,int *pointer,int times) int p; for(int i=1;i=times;i+) p=*pointer; stackp= (*pointer)-; void popstackc(char_stack *stack,int
5、*pointer,int times) stackp.content=void pushstack(char_stack *stack,int *pointer,char *stack_state,int *pointer_state,char str,char sx,int x) if(x=0) coutttt状态 sx 进状态栈 else if(x=1) 状态 if(str!str 进字符栈 (*pointer)+; stack(*pointer).content=str; (*pointer_state)+; stack_state(*pointer_state)=sx;int getc
6、ol(char top) switch(top) case +: return 0;- return 1;* return 2;/ return 3; return 4;) return 5; return 6;( return 7;i return 8;E return 9;T return 10;F return 11;P return 12; default: coutError! This character string is not this grammers sentence.endl; return -1;int getraw(char raw) switch(raw)0123
7、456789abcd return 13;e return 14;f return 15;g return 16;h return 17; return 18;char getraw_content(string str) if(str= else if(str=istring get_tx(int num) switch(num) case 1: return t1 case 2:t2 case 3:t3 case 4:t4 case 5:t5 case 6:t6 case 7:t7 case 8:t8 case 9:t9 case 10:t10 case 11:t11 case 12:t1
8、2 case 13:t13 case 14:t14 case 15:t15 case 16:t16 /.本程序暂时用到这么多,等有时间编写合适的可以将数字转换为字符串的函数时,即可更改本函数 void show(char strsize,int index) int length=getLength(str); if(index!=-1)t for(int i=index+1;length;stri;void showc(char_stack strsize,int index) int length=getLengthc(str);stri.content;void switch_metho
9、d(char_stack *stack,int *pointer,char *state_stack,int *pointer_state,string production,char *str,int *index) step+; coutnstep/显示步骤 show(state_stack,-1);/显示状态栈 showc(stack,-1);/显示符号站 str(*index)/显示当前字符 show(str,(*index);/显示输入串 char c=str(*index); if(production= return ; else if(production= char sx=
10、(*index)+; pushstack(stack,pointer,state_stack,pointer_state,c,sx,0);) int po=(*pointer);/用P规约该表达式,有效变量在E的endchar中,需要找到E的位置,即下面的操作 string st=stackpo.endchar;/对应 F po-=2; string se=stackpo.endchar;/在规约之前记录下要规约的字符所代表的变量。对应 T tsize+;/新增临时变量 ttsize.num=tsize+1;/下面四个表达式是按照上面的规约式进行的赋值 ttsize.operate= ttsi
11、ze.var1=se; ttsize.var2=st;t(ttsize.operatettsize.var1ttsize.var2,tttsize.numE+T规约且 popstack(state_stack,pointer_state,3); popstackc(stack,pointer,3); char c=/str(*index); pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1); string s=get_tx(ttsize.num); stack(*pointer).endchar=s;/把保存E+T规约的结果的变量保存至当前字符的终结符 /对应 T 对应 E tr2:E-T规约且/把保存E-T规约的结果的变量保存至当前字符的终结符 string s=stack(*pointer).endchar;/在规约之前记录下要规约的字符所代表的变量 p-; char second=state_s
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1