logo资料库

WHILE循环语句的翻译程序设计(简单优先法、输出四元式).doc

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
武汉理工大学《编译原理》课程设计说明书 WHILE 循环语句的翻译程序设计(简 单优先法、输出四元式) 1 需求说明或问题描述 1.1 问题描述 对 C++中 while 循环语句的理解及分析,通过编译中的词法分析、语法分析、 语义分析及中间代码生成等编译过程,用简单优先分析法分析并翻译 while 语 句。 1.2 需求说明 1 写出符合给定的语法分析方法的文法及属性文法 2 完成题目要求的中间代码四元式的描述 3 写出给定的语法分析方法的思想,完成语法分析及语义分析程序设计 4 设计若干用例,上机通过测试 2 文法及语法设计 VT={w, (, ), { ,}, i, ;} 2.1 文法及属性文法: 文法 G=(VN ,VT ,P ,S) 其中 VN={S , B, E, C, A, B, P, T} P={ S -> w(B){E} E -> C C -> CA C -> A A -> iPA A -> i; P -> +|-|*|/ B -> iTi B-> i T -> >|<|>=|<=|== } 2.2 语法分析方法描述及语法分析表设计 2.2.1 语法分析方法描述: 简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄 的。 基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将 1
武汉理工大学《编译原理》课程设计说明书 文法的产生式保存,设置符号栈 S,步骤如下: (1) 将输入符号串 a1a2…an#依次逐个存入符号栈 S 中,直到遇到栈顶符号 ai 的优先性>下一个待输入符号 aj 为止。 (2) 栈顶当前符号 ai 为句柄尾,由此向左在栈中找句柄的头符号 ak,即找 到 ak-1 < < = > = = > > > < = # > > T ; C < = = i < < > < = > < 3.1 中间代码形式的描述 中间代码通过四元式给出。四元式的四个组成成分是:算符 op,第一和第 二运算对象 ARG1 和 ARG2 及运算结果 RESULT。运算对象和运算结果有时指用户 自己定义的变量,有时指编译程序引进的临时变量。 3.2 中间代码序列的结构设计 通过词法分析及语法分析之后,取出其中的运算表达式。对表达式进行分 析。其中,先乘除后加减,先运算括号内的。如 a=b*c+b*d 的四元式表示如下: 1) 2) 3) 4) (*,b, c, t1) (*, b, d, t2) (+, t2, t3, t3) (=, t3, -, a) 2
武汉理工大学《编译原理》课程设计说明书 4 编译系统的概要设计及部分流程图 1 通过程序,在 1.txt 文本中输入 while 语句。对文本进行扫描,通过词法 分析函数 cifa()对输入的 while 语句进行词法分析。 2 将已算好的优先关系矩阵放至程序中,通过函数 Guanxi()输出优先关系矩 阵到 guanxi.txt 文件中。 3 对已进行词法分析的 while 语句进行语法分析,分析函数为 JanDan()。其 中包含对错误语句的报错处理。同时,对可以进行四元式输出的运算表达式进行 输出。 4 通过四元式输出函数 Siyuan()将运算表达式表示为四元式的形式,输出到 siyuan.txt 文件中。 整体框图: 词法分析程序框图 3
武汉理工大学《编译原理》课程设计说明书 5 源程序与执行结果(含测试方法和测试结果) 5.1 源程序 5.1.1 词法分析函数 void cifa()//词法分析程序 { char a[100]; char ch; ifstream infile("1.txt",ios::in); for(int i=0;i<100;i++) { infile.get(ch); if(ch!='#') a[i]=ch; else {a[i]=ch;break;} } cout<<"词法分析结果见 cifa.txt 文 件内!"<"||JD[t]=="<"||JD[t]==">="|| JD[t]=="<="||JD[t]=="==") R[t]='T'; 4
武汉理工大学《编译原理》课程设计说明书 Panduan(a[a1-m-1],a[a1-m]); z= } else z=-1; if(z==2) { 的句子"<=0;m--) { str2="\0"; str2=a[a1-m]; str=str+str2; a[a1-m]='\0'; } if(str==S1) { a[n]='S'; x=t; coutj<<" while(R[x]) "; // else R[t]='i'; } R[t]='#'; cout<<"R="<=0) { return; } else if(str==E1) { a[n]='E'; a1=n; a1++; 5
武汉理工大学《编译原理》课程设计说明书 coutj<
武汉理工大学《编译原理》课程设计说明书 { if(S[t-3]==0&&S[t-1]!=0) { couts<<"B"<
武汉理工大学《编译原理》课程设计说明书 结果 2: (1)在 1.txt 中输入 while(a>=3) { a=1+2; }# (2)词法分析输出到 cifa.txt 中 关键字 while 界符为 ( 标识符 a 运算符 >= 数字为 3 (3)优先分析法的规约过程 界符为 ) 界符为 { 标识符 a 运算符 = 数字为 1 运算符 + 数字为 2 界符为 ; 界符为 } (4)四元式输出 0:(>=,a,3,B0) 1:(+,1,2,T1) 2:(=,T1,-,a) 结果 2: (1)在 1.txt 中输入 while(i>=1.112) { i=a; 8
分享到:
收藏