编译原理LR语法分析器的控制程序实验报告(整理).pptx
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
wenku.baidu.com
{ 6, 0, 0, 0, 0,99},
//Acc 用 99 表示
{-2, 7, 0,-2, 0,-2},
//r2 用-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},
};
const char TNT[ ]="+*()i#ETF";
//LR 分析表列的字符
const int M[][9]={
//LR 分析表数字化,列字符+*()i#ETF 用数字 012345678 标识。
{ 0, 0, 4, 0, 5,0, 1, 2, 3},
//0 表示出错,s4 用 4 表示。
学海无 涯
编译原理 实验报告
学号
姓名
专业
班级
实验题目: LR 语法分析器的控制程序
时间
实验目的: 手工模拟控制程序计算,对源程序进行 LR 语法分析 主要是分析表的构造
实验内容与步骤:
1. 将要进行 LR 语法分析的源程序和 LR 语法分析器控制程序放在同一文件夹 中。
2. 用 C 语言编写 LR 语法分析器控制程序,程序代码如下:
{ 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}
};
1
学海无 涯
int col(char); void main()
//列定位函数原型
{
int state[50]={0};
11) 0163 #E+F #
12) 0169 #E+T #
13) 01 #E #
Acc
分析与体会: 此通过上下文无关文法作为语法分析的基础,配合实例,探讨了编译原
理构造中的自上而下语法分析法,并初步完成了语法分析器的实现。
手工模拟控制程序计算,对源程序进行 LR 语法分析 通过本次实验,进一步对 C 语言的知识进行了复习,并编写代码对源 程序进行 LR 语法分析,把其分析后的结果输入并保存到文件 par_r.tx 中。对 LR 分析有了更深的理解。LR(0)分析表构造的思想和方法是构造其他 LR 分 析表的基础。
cout<<'\t'<<t.code<<endl;
//输出当前输入符号(单词种别),并非必要。
action=M[state[top]][col(t.code)];
if(action>0 && action!=99){
//移进
state[++top]=action;
symbol[top]=t.code; cin>>t.code>>t.val;
过程。
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#
//读一单词
}
else if(action < 0){
//归约
if(strcmp(p[-action]+3,"ε")) //ε产生式的右部符号串长度为 0,无需退栈。 top=top-(strlen(p[-action])-3); //"→"为汉字,占二字节,故减 3。
state[top+1]=M[state[top]][col(p[-action][0])]; //产生式左部符号
3
#include <fstream.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
struct code_val{
char code;char val[20];
};
const char *p[]={
//产生式
"S→E","E→E+T","E→T","T→T*F","T→F","F→(E)","F→i"
symbol[++top]=p[-action][0];
} else if(action==99){
cout<<'\t'<<"Acc"<<endl;
//接受
break;
}
else{
//出错
cout<<"Err in main()>"<<action<<endl;
break;
}
}while(1);
} int col(char c) //将字符+* ()i#ETF 分别转换为数字 012345678
必要。
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]; //输出符号栈内容,并非必要。
struct code_val t;
//结构变量,存放单词二元式。
cin>>t.code>>t.val;
//读一单词
int action;
int i,j=0;
//输出时使用的计数器,并非必要。
cout<<"step"<<'\t'<<"状态栈"<<'\t'<<"符号栈"<<'\t'<<"输入符号"<<endl;//输出标题并非
//状态栈初值
char symbol[50]={'#'};
//符号栈初值
int top=0;
//栈顶指针初值
ofstream cout("par_r.txt");
//语法分析结果输出至文件 par_r.txt
ifstream cin("lex_r.txt"); // lex_r.txt 存放词法分析结果,语法分析器从该文件输入数据。
{ for(int i=0;i<(int)strlen(TNT);i++)
2
学海无 涯
if(c==TNT[i])return i;
cout<<"Err in col char>"<<c<<endl;
exit(0);
//终止程序运行
} 3. 查看生成的 par_r.txt 文件,对文件中的内容进行分析,更深刻理解 LR 语法分析的分析
{ 6, 0, 0, 0, 0,99},
//Acc 用 99 表示
{-2, 7, 0,-2, 0,-2},
//r2 用-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},
};
const char TNT[ ]="+*()i#ETF";
//LR 分析表列的字符
const int M[][9]={
//LR 分析表数字化,列字符+*()i#ETF 用数字 012345678 标识。
{ 0, 0, 4, 0, 5,0, 1, 2, 3},
//0 表示出错,s4 用 4 表示。
学海无 涯
编译原理 实验报告
学号
姓名
专业
班级
实验题目: LR 语法分析器的控制程序
时间
实验目的: 手工模拟控制程序计算,对源程序进行 LR 语法分析 主要是分析表的构造
实验内容与步骤:
1. 将要进行 LR 语法分析的源程序和 LR 语法分析器控制程序放在同一文件夹 中。
2. 用 C 语言编写 LR 语法分析器控制程序,程序代码如下:
{ 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}
};
1
学海无 涯
int col(char); void main()
//列定位函数原型
{
int state[50]={0};
11) 0163 #E+F #
12) 0169 #E+T #
13) 01 #E #
Acc
分析与体会: 此通过上下文无关文法作为语法分析的基础,配合实例,探讨了编译原
理构造中的自上而下语法分析法,并初步完成了语法分析器的实现。
手工模拟控制程序计算,对源程序进行 LR 语法分析 通过本次实验,进一步对 C 语言的知识进行了复习,并编写代码对源 程序进行 LR 语法分析,把其分析后的结果输入并保存到文件 par_r.tx 中。对 LR 分析有了更深的理解。LR(0)分析表构造的思想和方法是构造其他 LR 分 析表的基础。
cout<<'\t'<<t.code<<endl;
//输出当前输入符号(单词种别),并非必要。
action=M[state[top]][col(t.code)];
if(action>0 && action!=99){
//移进
state[++top]=action;
symbol[top]=t.code; cin>>t.code>>t.val;
过程。
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#
//读一单词
}
else if(action < 0){
//归约
if(strcmp(p[-action]+3,"ε")) //ε产生式的右部符号串长度为 0,无需退栈。 top=top-(strlen(p[-action])-3); //"→"为汉字,占二字节,故减 3。
state[top+1]=M[state[top]][col(p[-action][0])]; //产生式左部符号
3
#include <fstream.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
struct code_val{
char code;char val[20];
};
const char *p[]={
//产生式
"S→E","E→E+T","E→T","T→T*F","T→F","F→(E)","F→i"
symbol[++top]=p[-action][0];
} else if(action==99){
cout<<'\t'<<"Acc"<<endl;
//接受
break;
}
else{
//出错
cout<<"Err in main()>"<<action<<endl;
break;
}
}while(1);
} int col(char c) //将字符+* ()i#ETF 分别转换为数字 012345678
必要。
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]; //输出符号栈内容,并非必要。
struct code_val t;
//结构变量,存放单词二元式。
cin>>t.code>>t.val;
//读一单词
int action;
int i,j=0;
//输出时使用的计数器,并非必要。
cout<<"step"<<'\t'<<"状态栈"<<'\t'<<"符号栈"<<'\t'<<"输入符号"<<endl;//输出标题并非
//状态栈初值
char symbol[50]={'#'};
//符号栈初值
int top=0;
//栈顶指针初值
ofstream cout("par_r.txt");
//语法分析结果输出至文件 par_r.txt
ifstream cin("lex_r.txt"); // lex_r.txt 存放词法分析结果,语法分析器从该文件输入数据。
{ for(int i=0;i<(int)strlen(TNT);i++)
2
学海无 涯
if(c==TNT[i])return i;
cout<<"Err in col char>"<<c<<endl;
exit(0);
//终止程序运行
} 3. 查看生成的 par_r.txt 文件,对文件中的内容进行分析,更深刻理解 LR 语法分析的分析