发布时间 : 星期六 文章编译原理 实验报告实验二 语法分析(算符优先)更新完毕开始阅读
华北水利水电学院 编译原理 实验报告
2012~2013学年 第 一 学期 2011 级 计算机科学与技术 专业
班级: 2011179 学号: 2011179 姓名:
一、 实验题目:语法分析(算符优先分析程序)
(1)选择最有代表性的语法分析方法算符优先法;
(2)选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。
二、 实验内容
(1)根据给定文法,先求出FirstVt和LastVt集合,构造算符优先关系表(要求算符优先关系表输出到屏幕或者输出到文件);
(2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)
(3)给定表达式文法为:
G(E’): E’→#E# E→E+T | T T→T*F |F F→(E)|i
(4) 分析的句子为:
(i+i)*i和i+i)*i
三、程序源代
#include
char priority[6][6]; //算符优先关系表数组
char input[SIZE]; //存放输入的要进行分析的句子 char remain[SIZE]; //存放剩余串 char AnalyseStack[SIZE]; //分析栈 void analyse();
int testchar(char x); //判断字符X在算符优先关系表中的位置
void remainString(); //移进时处理剩余字符串,即去掉剩余字符串第一
个字符 int k;
void init()//构造算符优先关系表,并将其存入数组中 {
priority[1][0]='>'; priority[1][1]='>'; priority[1][2]='<'; priority[1][3]='<'; priority[1][4]='>'; priority[1][5]='>';
priority[2][0]='>'; priority[2][1]='>';
priority[2][2]='$';//无优先关系的用$表示 priority[2][3]='$'; priority[2][4]='>'; priority[2][5]='>';
priority[3][0]='<'; priority[3][1]='<'; priority[3][2]='<'; priority[3][3]='<'; priority[3][4]='='; priority[3][5]='$';
priority[4][0]='>'; priority[4][1]='>'; priority[4][2]='$'; priority[4][3]='$'; priority[4][4]='>'; priority[4][5]='>';
priority[5][0]='<'; priority[5][1]='<';
priority[5][2]='<'; priority[5][3]='<'; priority[5][4]='$'; priority[5][5]='='; }
void analyse()//对所输入的句子进行算符优先分析过程的函数 {
int i,j,f,z,z1,n,n1,z2,n2; int count=0;//操作的步骤数 char a; //用于存放正在分析的字符 char p,Q,p1,p2;
f=strlen(input); //测出数组的长度 for(i=0;i<=f;i++) {
if(AnalyseStack[k]=='+'||AnalyseStack[k]=='*'||AnalyseStack[k]=='i'||AnalyseStack[k]=='('||AnalyseStack[k]==')'||AnalyseStack[k]=='#')
j=k; j=k-1; else
z=testchar(AnalyseStack[j]);//从优先关系表中查出s[j]和a的优先关系 if(a=='+'||a=='*'||a=='i'||a=='('||a==')'||a=='#') { }
p=priority[z][n]; if(p=='$') {
printf(\错误!该句子不是该文法的合法句子!\\n\break; n=testchar(a);
else //如果句子含有不是终结符集合里的其它字符,不合法 a=input[i]; if(i==0)
remainString();
}
printf(\错误!该句子不是该文法的合法句子!\\n\return;
if(p=='>') {
{ for( ; ; )
Q=AnalyseStack[j];
if(AnalyseStack[j-1]=='+'||AnalyseStack[j-1]=='*'||AnalyseStack[j-1]=='i'||AnalyseStack[j-1]=='('||AnalyseStack[j-1]==')'||AnalyseStack[j-1]=='#') }
}
j=j-1; j=j-2; else
z1=testchar(AnalyseStack[j]); n1=testchar(Q); p1=priority[z1][n1];
if(p1=='<') //把AnalyseStack[j+1]~AnalyseStack[k]归约为N { } else continue;
count++;
printf(\ %s\\tc\\t\s\\t 归约 k=j+1; i--;
AnalyseStack[k]='N'; int r,r1;
r=strlen(AnalyseStack); for(r1=k+1;r1 AnalyseStack[r1]='\\0'; \\n\ break;