WHILE循环语句的翻译程序设计(简单优先法、输出四元式)
1 需求说明或问题描述
1.1 问题描述
对C++中while循环语句的理解及分析,通过编译中的词法分析、语法分析、语义分析及中间代码生成等编译过程,用简单优先分析法分析并翻译while语句。
1.2 需求说明
1 写出符合给定的语法分析方法的文法及属性文法
2 完成题目要求的中间代码四元式的描述
3 写出给定的语法分析方法的思想,完成语法分析及语义分析程序设计
4 设计若干用例,上机通过测试
2 文法及语法设计
2.1文法及属性文法:
文法G=(VN ,VT ,P ,S)
其中VN={S , B, E, C, A, B, P, T} VT={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…an#依次逐个存入符号栈S中,直到遇到栈顶符号ai的优先性>下一个待输入符号aj为止。
(2) 栈顶当前符号ai为句柄尾,由此向左在栈中句柄的头符号ak,即到 ak—1〈ak为止.
(3) 由句柄ak.。。 ai在文法的产生式中查右部为ak…ai的产生式,若到则用相应左部代替句柄,若不到则为出错,这时可断定输入串不是该文法的句子。
(4) 重复上述(1)、(2)、(3)步骤直到规约完输入符号串,栈中只剩文法的开始符号为止。
2.2。2 优先关系矩阵:
S | w | ( | B | ) | { | E | } | A | P | i | T | ; | C | # | |
S | > | ||||||||||||||
w | = | ||||||||||||||
( | = | 〈 | |||||||||||||
B | = | ||||||||||||||
) | = | ||||||||||||||
{ | = | 〈 | 〈 | < | |||||||||||
E | = | ||||||||||||||
} | 〉 | ||||||||||||||
A | 〉 | 〈 | 〉 | ||||||||||||
P | = | 〈 | |||||||||||||
i | > | = | = | = | |||||||||||
T | = | ||||||||||||||
; | 〉 | 〉 | > | ||||||||||||
C | > | = | < | ||||||||||||
# | 〈 | < | |||||||||||||
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()输出优先关系矩阵到文件中。
3 对已进行词法分析的while语句进行语法分析,分析函数为JanDan()。其中包含对错误语句的报错处理。同时,对可以进行四元式输出的运算表达式进行输出。
4 通过四元式输出函数Siyuan()将运算表达式表示为四元式的形式,输出到siyuan。txt文件中。
整体框图:
while语句怎么输出词法分析程序框图
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<<”词法分析结果见文件内!”<<endl;
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 简单优先法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论