语法分析实验语法分析(LR).doc
文本预览下载声明
实 验 报 告
课程名称 编译原理
实验名称 语法分析(LR)
班 级 计科1203
学 号 201207010321
姓 名 马万里
指导教师 黄 全 舟
实验日期 2015.5.21
一、实验目的
构造LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。?
二、实验原理
(1)总控程序,也可以称为驱动程序。对所有的LR分析器总控程序都是相同的。?
(2)分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作(ACTION)和状态转(GOTO)表两个部分,它们都可用二维数组示。?
(3)分析栈,包括文法符号栈和相应的状态栈,它们均是先进后栈。分析器的 动 作就是由栈顶状态和当前输入符号所决定。
LR分析器由三个部分组成:
INCLUDEPICTURE \d /docconvert2785-nj//wk/f3bcd63db6d7686314686f669fbbf32b/0.png?sign=MBOT:y1jXjmMD4FchJHFHIGN4z:HzQkbGyNFp8pplDA1dlp8VPpjq0=time=1432469065range=0-8128response-cache-control=max-age=3888000response-expires=Wed, 08 Jul 2015 19:04:25 +0800 \* MERGEFORMATINET
其中:SP为栈指针,S[i]为状态栈,X[i]为文法符号栈。状态转换表用GOTO[i,X]=j表示,规定当栈顶状态为i,遇到当前文法符号为X时应转向状态j,X为终结符或非终结符。?ACTION[i,a]规定了栈顶状态为i时遇到输入符号a应执行。
主要仪器设备
Pc机一台(装有vs2012)
四、主要代码及其说明
#include stdio.h
#include string.h
#include vector
#include iostream
using namespace std;
#define N 10
char *Action[][4]=
{ //此处三维也可以
{S3, S4, ERROR,ERROR},
{ERROR,ERROR,ERROR,acc},
{ERROR,ERROR,S5, R2},
{ERROR,ERROR,R3, R3},
{ERROR,ERROR,R4, R4},
{S3, S4, ERROR,ERROR},
{ERROR,ERROR,ERROR,R1}};
Int GoTo[][2]={{1,2},{0,0},{0,0},{0,0},{0,0},{6,2},{0,0}};
char *GL[]={L-E,L,L-E,E-a,E-b };
int _Push(vector int State,vector char InChar,int a,char b)
{
State.push_back(a);
InChar.push_back(b);
return a;
}
void _Pop(vector int State,vector char InChar,int cout)
{
while(cout)
{
State.pop_back();
InChar.pop_back();
cout--;
}
}
void PrinStack(vector int State,vector char InChar)//状态栈 和栈中符号输出
{
vector int::iterator iter_s =State.begin();
vector char::iterator iter_i=InChar.begin();
for(;iter_s !=State.end();iter_s++)
{
cout*iter_s;
}
printf(\t);
for(;iter_i !=InChar.end();iter_i++)
{
cout*iter_i;
}
printf(\t\t);
}
void printInCh
显示全部