编译原理-LR语法分析器的控制程序实验报告

  • 格式:docx
  • 大小:13.52 KB
  • 文档页数:3

编译原理实验报告
实验目的:
手工模拟控制程序计算,对源程序进行LR 语法分析 主要是分析表的构造
实验内容与步骤:
1•将要进行LR 语法分析的源程序和LR 语法分析器控制程序放在同一文件夹 中。

2.用C 语言编写LR 语法分析器控制程序,程序代码如下:
#in elude <fstream.h> #in clude <iostream.h> #i nclude <stdlib.h> #in clude <stri ng.h> struct code_val{
char code;char val[20]; };
con st char *p[]={
// 产生式
"S T E","E T E+T","E T T","T T T*F","T T F","F T (E)","F T i };
const char TNT[ ]="+*()i#ETF"; con st int M[][9]={
{ 0, 0, 4, 0, 5,0, 1,2, 3}, { 6, 0, 0, 0, 0,99}, {-2, 7, 0,-2, 0,-2}, {-4,-4, 0,-4, 0,-4}, { 0, 0, 4, 0, 5, 0, 8, 2, 3}, {-6,-6, 0,-6, 0,-6},
{ 0, 0, 4, 0, 5, 0, 0, 9, 3}, { 0, 0, 4, 0, 5, 0, 0, 0,10}, { 6, 0, 0,11}, {-1,7, 0,-1,0,-1}, {-3,-3, 0,-3, 0,-3}, {-5,-5, 0,-5, 0,-5} };
//LR 分析表列的字符
//LR 分析表数字化,列字符 +*()i#ETF 用数字012345678标识。

〃0
表示出错,s4用4表示。

//Acc 用99表示
〃r2用-2表示
int col(char); void mai n() {
int state[50]={0}; char symbol[50]={ '#'}; int top=0;
ofstream cout("par_r.txt");
ifstream ci n("lex_r.txt"); // lex_r.txt struct code_val t; cin> >t.code»t.val; int action; int i,j=0;
cout<<"step"<<'\t'<<"状态栈"<<'\t'<<"
必要。

do{
cout<<j++<<')'<<'\t';
〃输出 step ,并非必要。

for(i=0;i<=top;i++)cout<<state[i];cout<<'\t';〃 输出状态栈内容,并非必要。

for(i=0;i<=top;i++)cout<<symbol[i]; II cout<<'\t'<<t.code<<e ndl; actio n=M[state[top]][col(t.code)]; if(action>0 && action!=99){
state[++top]=actio n; symbol[top]=t.code; cin> >t.code»t.val; }
else if(actio n < 0){
if(strcmp(p[-action]+3," £ "))
top=top-(strle n( p[-actio n])-3);
state[top+1]=M[state[top]][col(p[-actio n][0])]; II symbol[++top]=p[-acti on][ 0]; }
else if(actio n==99){
II 接受
cout<<'\t'<<"Acc"<<e ndl; break; } else{
〃出错
cout<<"Err in main()> "<<acti on<<en dl;
break;
} }while(1); }
int col(char c) II 将字符 +* ()i#ETF 分别转换为数字 012345678 {
for(int i=0;i<(int)strlen(TNT);i++)
if(c==TNT[i])return i;
〃列定位函数原型
//状态栈初值
〃符号栈初值
//栈顶指针初值
//语法分析结果输出至文件
par_r.txt
存放词法分析结果,语法分析器从该文件输入数据。

//结构变量,存放单词二元式。

//读一单词
//输出时使用的计数器,并非必要。

符号栈"<<'\t'<<"输入符号"<<endl;〃输出标题并非
输出符号栈内容,并非必要。

〃输出当前输入符号(单词种别),并非必要。

//移进
II 读一单词
II 归约
II £产生式的右部符号串长度为
0,无需退栈。

II" "为汉字,占二字节,故减 3。

产生式左部符号
cout<<"Err in col char>"<<c<<e ndl;
exit(0); //终止程序运行
}
3.查看生成的par_r.txt文件,对文件中的内容进行分析,更深刻理解LR语法分析的分析
过程。

par_r.txt 文件:
step 状态栈符号栈输入符号
0) 0 # i
1) 05 #i *
2) 03 #F *
3) 02 #T *
4) 027 #T* i
5) 0275 #T*i +
6) 02710 #T*F +
7) 02 #T +
8) 01 #E +
9) 016 #E+ i
10) 0165 #E+i #
11) 0163 #E+F #
12) 0169 #E+T #
13) 01 #E #
Acc
分析与体会:
此通过上下文无关文法作为语法分析的基础,配合实例,探讨了编译原理构造中的自上而下语法分析法,并初步完成了语法分析器的实现。

手工模拟控制程序计算,对源程序进行LR语法分析
通过本次实验,进一步对C语言的知识进行了复习,并编写代码对源程序进行LR语法分析,把其分析后的结果输入并保存到文件par_r.tx中。

对LR分析有了更深的理解。

LR(0)分析表构造的思想和方法是构造其他LR分析表的基础。