1、 《编译原理》 课程设计性实验报告 课程题目: LR(0)分析法 姓 名: 钟继文 专业班级: 计算机科学与技术(1)班 指导老师: 孙长圣老师 学 号: 110920120019 报告日期: 2015年6月7日 编译原理语法分析实验报告 一、 实验内容 利用C语言编写一个程序,对字符串进行语法分析,了解掌握实验的原理及方法,要求该文法为
2、LR(0)文法。 二、 实验目的 LR(K)分析方法是1965年Knuth提出的,括号中的K表示向右查看输入串符号的个数。对于大多数用无二义性上下文无关文法描述的语言都可以用相应的LR分析器进行识别,而且这种方法还具有分析速度快,能准确、及时地指出出错位置。它的主要缺点是对于一个实用语言文法的分析器的构造工作量相当大,K愈大构造愈复杂,实现相当困难。 LR分析法是一种自底向上分析方法。它的分析过程是一种规范归约过程,规范归约是规范推导的逆过程。规范推导是最右推导,规范归约是其逆过程,则是最左归约。 LR分析法的可归约串是当前句型的句柄,即最左直接短语。 对
3、于大多数用无二义性上下文无关文法描述的语言都可以用相应的LR分析器进行识别,而且这种方法还具有分析速度快,能准确、及时地指出出错位置。
本实验通过设计、调试一个简单的的LR分析器,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。
三、 实验功能
通过定义的文法G,G是一个LR(0)文法,输入源码,能够基本判别出该源码是否是正确的。如果是正确的则接收,反之,如果是错误的则显示错误。
四、 实验步骤
1. 类ALGOLF的文法
4、> -> 5、 6、 T->s;T
9 S->bT
3.项目集规范族:
P’->·P P’->P·
P->·B P->B·
P->·S P->S·
B->·H;T B->H·;T B->H;·T B->H;T·
H->·bd H->b·d H->bd ·
H->·H;d H->H·;d H->H;·d H->H;d·
T->·se T->s·e T->se·
T->·s;T T->s·;T T->s;·T 7、 T->s;T·
S->·bT S->b·T S->bT ·
4.LR(0)的分析表
(s表示移进,r表示归约)
状态
ACTION
GOTO
b
d
s
e
;
#
P
B
S
H
T
0
S12
1
2
3
4
1
acc
2
r2
r2
r2
r2
r2
r2
3
r3
r3
r3
r3
r3
r3
4
S5
5
S7
S8
8、
6
r4
r4
r4
r4
r4
r4
7
r6
r6
r6
r6
r6
r6
8
S9
S10
9
r7
r7
r7
r7
r7
r7
10
S8
11
11
r8
r8
r8
r8
r8
r8
12
S14
S8
13
13
r9
r9
r9
r9
r9
r9
14
r5
r5
9、
r5
r5
r5
r5
6.部分代码
n 界面(为了便于客户体验)
int menu()
{
int n;
printf("=======================\n");
printf("-------欢迎使用--------\n");
printf("1.显示文法信息\n");
printf("2.符号串判定\n");
printf("3.退出\n");
printf("-----------------------\n");
printf("========= 10、\n");
printf("请选择你要执行的内容:\n");
scanf("%d",&n);
getchar();
return n;
}
在main程序中可以直接调用。
void main()
{
int t=1,n;
char ch;
while(t)
{
n=menu();
}
n 分析过程的实现
void ActionTable(int sta, char symb,int col)
{ //statu用于状态栈 11、sym用于符号栈
if(sta == 1 && col == 5) //sta[1] col[5]中存放ACC,即表
//示所输入的源码是该文法的语法。
{
printf("\t接收\n");
IsAccept = 1; //IsAccept为void函数,如果
//源码判断成功,则显示接收,
12、 //将IsAccept赋值为1,方便退出。
return; //ActionTable是void类型的
}
if(act[sta].st[col] != 0) //存放移进操作
{
//如果进行源码判断时,要进行移进操作,则直接将进行相应的栈操作
printf("\t移进\n");
sta[++sta_Index] = act[sta].st[col];
symbol[++mark_Index] = symb;
ex 13、p_top ++;
}else if(act[sta].re[col] != 0) //存放归约操作
{
printf("\t归约\n");
Reduce(sta, symb, col); //Reduce为void函数,用来对进行归
//约的项进行相应操作,使用栈来进行
//处理。
}else
{
printf("\t错误\n");
14、 getchar(); //从stdio流中读字符用
}
}
n 使用到的头文件
#include






