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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

1 需求说明或问题描述

1.1 问题描述

对C++中while循环语句的理解及分析,通过编译中的词法分析、语法分析、语义分析及中间代码生成等编译过程,用简单优先分析法分析并翻译while语句。

1.2 需求说明

1 写出符合给定的语法分析方法的文法及属性文法

2 完成题目要求的中间代码四元式的描述

3 写出给定的语法分析方法的思想,完成语法分析及语义分析程序设计

4 设计若干用例,上机通过测试

2 文法及语法设计

2.1文法及属性文法:

文法G=(V N ,V T ,P ,S)

其中V N={S , B, E, C, A, B, P, T} V T={w, (, ), { ,}, i, ;}

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 语法分析方法描述:

简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。

基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将

文法的产生式保存,设置符号栈S,步骤如下:

(1)将输入符号串a1a2…a n#依次逐个存入符号栈S中,直到遇到栈顶符号a i的优先性>下一个待输入符号a j为止。

(2)栈顶当前符号a i为句柄尾,由此向左在栈中找句柄的头符号a k,即找到a k-1

(3)由句柄a k...a i在文法的产生式中查找右部为a k…a i的产生式,若找到则用相应左部代替句柄,若找不到则为出错,这时可断定输入串不是该文法的句子。

(4)重复上述(1)、(2)、(3)步骤直到规约完输入符号串,栈中只剩文法的开始符号为止。

2.2.2 优先关系矩阵:

3 中间代码

3.1中间代码形式的描述

中间代码通过四元式给出。四元式的四个组成成分是:算符op,第一和第二运算对象ARG1和ARG2及运算结果RESULT。运算对象和运算结果有时指用户自己定义的变量,有时指编译程序引进的临时变量。

3.2 中间代码序列的结构设计

通过词法分析及语法分析之后,取出其中的运算表达式。对表达式进行分析。其中,先乘除后加减,先运算括号内的。如a=b*c+b*d 的四元式表示如下:

1) (*,b, c, t1)

2) (*, b, d, t2)

3) (+, t2, t3, t3)

4) (=, t3, -, a)

4 编译系统的概要设计及部分流程图

1 通过程序,在1.txt文本中输入while语句。对文本进行扫描,通过词法分析函数cifa()对输入的while语句进行词法分析。

2 将已算好的优先关系矩阵放至程序中,通过函数Guanxi()输出优先关系矩阵到guanxi.txt文件中。

3 对已进行词法分析的while语句进行语法分析,分析函数为JanDan()。其中包含对错误语句的报错处理。同时,对可以进行四元式输出的运算表达式进行输出。

4 通过四元式输出函数Siyuan()将运算表达式表示为四元式的形式,输出到siyuan.txt文件中。

整体框图:

词法分析程序框图

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;}

}

i=0;

int m;

cout<<"词法分析结果见cifa.txt文件内!"<

while(i<100)

{

m=Judge(a[i]);//第一个字符的形式

if(m==1) i=Keyword(i,a);//关键字

else if (m==2) i=Numb(i,a);//数字

else if (m==3) i=YunSuan(i,a);//运算符

else if (m==4) i=JieFu(i,a);//界符

else if (m==5) i++;//空格

else if (m==6) i++;//回车

else if (m==7) return;//“#”号

else break;

}

}

5.1.2 简单优先法

void JanDan(int Q)

{

cout<<"简单优先法部分步骤输出到jiandan.txt文件中!"<

coutj<<"简单优先法,部分步骤:"<

S1="w(B){E}";//产生式

E1="C";

C1="CA";

C2="A";

A1="iPA";

A2="i;";

B1="iTi";

B2="i";

string str2;

for(t=0;t

{

if(JD[t]=="while")

R[t]='w';

else if(JD[t]=="(")

R[t]='(';

else if(JD[t]==")")

R[t]=')';

else if(JD[t]=="{")

R[t]='{';

else if(JD[t]=="}")

R[t]='}';

else if(JD[t]==";")

R[t]=';';

else

if(JD[t]=="+"||JD[t]=="-"||JD[t]=="*"||J D[t]=="/"||JD[t]=="=")

R[t]='P';

else

if(JD[t]==">"||JD[t]=="<"||JD[t]==">="|| JD[t]=="<="||JD[t]=="==")

R[t]='T';

相关文档
最新文档