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—1ak为止.
(3) 由句柄ak.。。 ai在文法的产生式中查右部为akai的产生式,若到则用相应左部代替句柄,若不到则为出错,这时可断定输入串不是该文法的句子。
(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小时内删除。