当前位置:文档之家› IF-ELSE条件语句的翻译程序设计(LL(1)法、输出三地址表示) 2

IF-ELSE条件语句的翻译程序设计(LL(1)法、输出三地址表示) 2

id++;
}
else if(opr==-2) //{其他字符判断};
{
arr[d][1]=id-1;
arr[d][0]=' ';
arr[d][2]=arr_i[opd];
arr[d][3]=' ';
arr[d][4]=' ';
}
else if(VT[opr]!='<'&&VT[opr]!='>'&&VT[opr]!='+'&&VT[opr]!='-'&&VT[opr]!='*'&&VT[opr]!='/')//{"#"结束符判断};
else if(n==-1)f=3; //没有找到合适的候选产生式来做进一步推导,转去出错处理
else
{ //用产生式M[tx][ta]来做进一步推导
sp--;
cout<<'\t'<<X<<"->";
if(len(p[n])!=0)
{
for(int i=len(p[n])-1;i>=0;i--)
{
stack[++sp]=p[n][i];
{
if(X==a)
{
sp--;
front++;
if(a!='i') //{"i"是特征字母}
{
if(a!='f'&&a!='t'&&a!='e'&&a!=';'&&a!='#')
{
opr=index(a,VT);
semantic();
}
else if(a==';'||a=='e'||a=='t'||a=='#')
//预测分析表
注:除了-1代表此处有产生式与之对应,具体的产生式在程序中给出。-1代表此处无产生式与之对应。
void syntax()
{
int n;
count++;
print();
X=stack[sp];
a=queue[front];
if(X=='#'&&a=='#')f=4;
if(X<'A'||X>'Z') //{判断字符集不是大写字母集合}
{1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 2, -1},
{4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
}
else
{
int tx=index(X,VN);//{索引选择}
int ta=index(a,VT);//{索引选择}
n=M[tx][ta]; //{产生式选择}
td[t++]=M[tx][ta]; //{产生式选择}
if(ta==-1)
{
f=2;cout<<a<<endl;
} //字符没有出现在产生式终结符集VT中,转去出错处理
queue[j++]='e';i+=3;
}//{判断"else"关键字}
else if(index(ch,VT)<=0)
{
if(ch!='{'&&ch!='}'&&ch!='('&&ch!=')')
{
cout<<ch<<'\t'<<"variable:i["<<d++<<"]"<<'\t'<<"[标示符]"<<endl;
在词法分析结束之后,就应该把分析的结果输出来。输出的格式是【(单词,类型编号) 类型名】
词法分析程序如下:
void lexical()
{ //"if{m>n} theni=i+9 elseb=b/3#"是其一条特殊的例子
int i,j,d;
char ch;
j=d=0;
for(i=0;var[i]!='#';i++)
arr_i[d-1]=ch;
queue[j++]='i';
}
else cout<<ch<<'\t'<<"bound"<<'\t'<<'\t'<<"[括号]"<<endl;
}
else if(index(ch,VT)>0)
{
cout<<ch<<'\t'<<"operator"<<'\t'<<"[运算符]"<<endl;
{-1, -1, -1, -1 , 12, 12, 10, 11, -1, -1, -1, 12, 12, 12},
{14, -1, -1, -1, -1, -1,- 1, -1, 13, -1, -1, -1, -1, -1},
{-1, 15, 16, 17, -1, -1, -1, -1, -1, -1, -1,- 1,- 1, -1},
输入串中,而只是分析if以后的句子。在语法分析之前应该判定该文法是不是一个
LL(1)文法。判别的主要方法是做出文法中所有产生式的select集,对于同一个非终
结符的不同产生式,如果他们的select集合没有交集,则说明这个文法是LL(1)文法。
这个文法的预测分析表也设计的比较简单,如下表所示:
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1},
arr[d][2]=id;
arr[d][3]=' ';
arr[d][4]=' ';
id++;
}
else if(VT[opr]=='/') //{"/"判断};
{
arr[d][1]=arr_i[opd];
arr[d][0]='/';
arr[d][2]=id;
arr[d][3]=' ';
arr[d][4]=' ';
再创建一个结构体,用来存放词法分析的结果,共有两个域,一个关键字域,表明他是什么类型,以及它自身的内容。
这个词法分析程序比较简单,因为本身的程序就局限在if-else语句,所以保留字的类型我就只写了if、then和else三个;碰到数字开头的除了关键字就是标识符;碰到数字开头的就是数字;碰到界限符和操作符(因为引入的类型也很少),所以也很容易区别。
if(ch=='h')
{
ch=var[i+2];
if(ch=='e')
{
ch=var[i+3];
if(ch=='n')
{
ch=var[i+4];
}
}
}
cout<<"then"<<'\t'<<"keyword"<<'\t'<<'\t'<<"[关键字]"<<endl;
queue[j++]='t';i+=3;
IF-ELSE条件语句的翻译程序设计
1 问题描述
要求用LL(1)自顶向下分析方法及三地址中间代码,对IF-THEN-ELSE条件语句完成编译各阶段过程,包括词法、语法、语义等分析。
2问题分析及编译系统的概要设计
编译过程一般分为六个阶段的过程,可以由六个模块完成,它们称为词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序,此外,一个完整编译程序还必须包括“表格管理程序”和“出错处理程序”。
属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)配备若干相关的“值”(与文法符号相关的属性)。
在一个属性文法中,对应于每个产生式A→a都有一套与之相关联的语义规则,每规则的形式为:b:=f(c1,c2,…,ck)其中f是一个函数,而且或者①b是A的一个综合属性并且c1,c2,…,ck是产生式右边文法符号的属性或者②非终结符既可有综合属性也可有继属性,文法开始符号的所有继承属性作为属性计算前的初始值。
queue[j++]=ch;
}
}
queue[j]='#';//{"#"就直接跳出}
相关主题