编译原理_实验报告实验二__语法分析(算符优先) 2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华北水利水电学院编译原理实验报告
一、实验题目:语法分析(算符优先分析程序)
(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
#include
#include
#include
#define SIZE 128
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[0][3]='<';
priority[0][4]='>';
priority[0][5]='>';
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][4]='$';
priority[5][5]='=';
}
void analyse()//对所输入的句子进行算符优先分析过程的函数
{
FILE *fp;
fp=fopen("li","a");
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++)
{
a=input[i];
if(i==0)
remainString();
if(AnalyseStack[k]=='+'||AnalyseStack[k]=='*'||AnalyseStack[k]=='i'||Analy seStack[k]=='('||AnalyseStack[k]==')'||AnalyseStack[k]=='#')
j=k;
else
j=k-1;
z=testchar(AnalyseStack[j]);//从优先关系表中查出s[j]和a的优先关系
if(a=='+'||a=='*'||a=='i'||a=='('||a==')'||a=='#')
n=testchar(a);
else //如果句子含有不是终结符集合里的其它字符,不合法
{
printf("错误!该句子不是该文法的合法句子!\n");
break;
}
if(p=='$')
{
printf("错误!该句子不是该文法的合法句子!\n");
return;
}
if(p=='>')
{ for( ; ; )
{
Q=AnalyseStack[j];
if(AnalyseStack[j-1]=='+'||AnalyseStack[j-1]=='*'||AnalyseStack[j-1]=='i'||Ana lyseStack[j-1]=='('||AnalyseStack[j-1]==')'||AnalyseStack[j-1]=='#')
j=j-1;
else
j=j-2;
z1=testchar(AnalyseStack[j]);
n1=testchar(Q);
p1=priority[z1][n1];
if(p1=='<') //把AnalyseStack[j+1]~AnalyseStack[k]归约为N
{
count++;
printf("(%d) %s\t%10c\t%5c%17s\t 归约\n",count,AnalyseStack,p,a,remain);
fprintf(fp,"(%d) %s\t%17s\t %s\n",count,AnalyseStack,remain,"归约");
k=j+1;
i--;
AnalyseStack[k]='N';
int r,r1;
r=strlen(AnalyseStack);
for(r1=k+1;r1 AnalyseStack[r1]='\0'; break; } else