当前位置:文档之家› 实验二语法分析算符优先法

实验二语法分析算符优先法


if(Stack[k]=='+'||Stack[k]=='*'||Stack[k]=='i'||Stack[k]=='('||Stack[k
{ printf("错误!该句子不是该文法的合法句子!\n"); break; } p=oppriority[z][n]; 号 if(p=='$') { printf("错误!该句子不是该文法的合法句子!\n"); return; } if(p=='>') { for( ; ; ) { Q=Stack[j]; if(Stack[j-1]=='+'||Stack[j-1]=='*'||Stack[j1]=='i'||Stack[j-1]=='('||Stack[j-1]==')'||Stack[j-1]=='#') j=j-1; else j=j-2; z1=located(Stack[j]); n1=located(Q); p1=oppriority[z1][n1]; if(p1=='<') 归约为N { //把AnalyseStack[j+1]~AnalyseStack[k] //用p存放这个两者比较的有限关系符
华北水利水电学院编译原理实验报告
2013~2014学年 第 一 学期 2012 级 计算机科学与技术 专业 班级: 196 学号: 2012196 姓名: 李明月 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
printf("-----------------------------------------\n"); printf("请输入要进行分析的句子(以#号结束输入):\n"); gets(storage);//将输入的字符串存到数组中 printf("步骤 归约\n"); k=0; Stack[k]='#'; Stack[k+1]='\0'; int length,i; //初始化剩余字符串数组为输入串 length=strlen(storage);// 栈 当前符号 剩余输入串 移进或
printf("错误!该句子不是该文法的合法句子! \n"); break; } } } } } int located(char x) { int m; if(x=='+') m=0; if(x=='*') m=1; if(x=='i') m=2; if(x=='(') m=3; if(x==')') m=4; if(x=='#') m=5; return m; } void change()//将后一个字符往前移动 { //查出某个字符在优先表中的位置
for(i=0;i<length;i++) { remain[i]=storage[i]; } remain[i]='\0'; judge();//对所输入的句子进行算符优先分析过程的函数 } void judge()//对所输入的句子进行算符优先分析过程的函数 { int i,j,f,z,z1,n,n1,z2,n2; int count=0;//操作的步骤数 char a; //用于存放正在分析的字符 char p,Q,p1,p2; f=strlen(storage); for(i=0;i<=f;i++) { a=storage[i]; if(i==0) change(); j=k; else j=k-1; z=located(Stack[j]); if(a=='+'||a=='*'||a=='i'||a=='('||a==')'||a=='#') n=located(a); else //如果句子含有不是终结符集合里的其它字符,不合法 //获得栈中元素的位置 //让a为当前要分析的字符 //第一个元素不做处理,直接往后移动 //测出数组的长度
3、 程序源代码:
#include<stdlib.h> #include<stdio.h> #include<string.h> #include<iostream.h> char oppriority[6][6]={{'>','<','<','<','>','>'}, {'>','>','<','<','>','>'}, {'>','>','$','$','>','>'},{'<','<','<','<','=','$'}, {'>','>','$','$','>','>'},{'<','<','<','<','$','='}}; 优先关系表数组 char storage[100]; input) char remain[100]; char Stack[100]; void judge(); int void change(); 个字符 int k; void main() { printf("文法为:\n"); printf("E'->#E#\n"); printf("E→E+T|T\n"); printf("T→T*F|F\n"); printf("F→(E)|i\n"); printf("文法可拆分为:\n"); printf("(0)E'->#E#\n"); //存放剩余串 //分析栈 //对所输入的句子进行算符优先分析过程的函数 //判断字符X在算符优先关系表中的位置 //移进时处理剩余字符串,即去掉剩余字符串第一 //存放输入的要进行分析的句子(原来是 //算符
else { if(p=='=') { z2=located(Stack[j]); n2=located('#'); p2=oppriority[z2][n2]; if(p2=='=') { count++; printf("(%d) \n",count,Stack,a,remain); printf("该句子是该文法的合法句子。\n"); break; } else { count++; printf("(%d) \n",count,Stack,a,remain); k=k+1; Stack[k]=a; change(); } } else { %s\t%8c%17s\t 移进 %s\t%8c%17s\t 接受
count++; printf("(%d) \n",count,Stack,a,remain); k=j+1; i--; Stack[k]='E'; int r,r1; r=strlen(Stack); for(r1=k+1;r1<r;r1++) Stack[r1]='\0'; break; } else continue; } } else { if(p=='<') { count++; printf("(%d) \n",count,Stack,a,remain); k=k+1; Stack[k]=a; change(); } %s\t%8c%17s\t 移进 //表示移进 %s\t%8c%17s\t 归约
ห้องสมุดไป่ตู้
多。
located(char x);
printf("(1)E->E+T\n"); printf("(2)E->T\n"); printf("(3)T->T*F\n"); printf("(4)T->F\n"); printf("(5)F->(E)\n"); printf("(6)F->i\n"); printf("根据FIRSTVT集和LASTVT集可以得出算符优先分析表。 \n"); printf("-----------------------------------------\n"); printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" + * i ( ) # + > > > < > < 算符优先关系表\n"); * < > > < > < < < < < i < < ( < < ) > > > = > #\n"); >\n"); >\n"); >\n"); \n"); >\n"); =\n");
相关主题