编译原算符优先分析实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学号E10714103专业计算机科学与技术姓名万学进
实验日期2010-5-25教师签字成绩
实验报告
【实验名称】算符优先文法分析
【实验目的】
掌握算符优先分析法的原理,利用算符优先分析法将赋值语句进行语法分析,翻译成等价的四元式表示。
【实验内容】
1.算术表达式的文法可以是:
(1)S->#E# (2)E->E+T (3)E->T (4)T->T*F (5)T->F (6)F->P^F (7)F->P (8)P->(E) (9)P->i
2.根据算符优先分析法,将表达式进行语法分析,判断一个表达式是否正确。
【设计思想】
(1)定义部分:定义常量、变量、数据结构。
(2)初始化:设立算符优先关系表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);
(3)控制部分:从键盘输入一个表达式符号串;
(4)利用算符优先文法分析算法进行表达式处理:根据优先关系表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。
【流程图】
【源代码】
#include
#include
#include
char Grammar[20][10]; char VN[10],VT[10];
char BoolArray[10][10]; char FirstBoolArray[10][10]; char LastBoolArray[10][10]; char RelationShip[10][10]; #define StackSize 100;
int vtNum,vnNum;
int grammarNum;
int scount=0;
int VNum[20];
int GF[2][10];
typedef struct {
char vt;
char vn;
}array;
typedef struct {
array *base;
array *top;
int stacksize;
}SqStack;
typedef struct{
char s[20];
int step;
char curInVt;
}CharType;
typedef struct{
CharType *base;
CharType *top; }Stack;
typedef struct
{
int x;
int y;
}Position;
SqStack S;
Stack CS;
SqStack InitStack()
{
int i,j;
S.base=(array
*)malloc(100*sizeof(array));
if(!S.base)exit(1);
S.top=S.base;
S.stacksize=StackSize;
array temp;
printf("初始化栈:\n");
for(i=1;i<=vnNum;i++)
{
for(j=1;j<=vtNum;j++)
{
if(BoolArray[i][j]=='1')
{
temp.vt=BoolArray[0][j];
temp.vn=BoolArray[i][0];
*S.top=temp;
S.top++;
printf("%c,%c\n",temp.vn,temp.vt);
}
}
}
return S;
}
int vNumCount()
{
for(int i=0;i<=grammarNum;i++)
{
int j=1;
while(Grammar[i][j]!='\0')
{
j++;
}
VNum[i]=j;
printf("%d ",VNum[i]);
}
printf("\n");
return 0;
}
int ScanGrammar()
{
FILE *fp=fopen("算符优先文法.txt","r");
FILE *tp;
char singleChar,nextChar;
int i=0,j=0,k,count;
while(!feof(fp))
{
fscanf(fp,"%c",&singleChar);
if(singleChar=='?')
{
Grammar[i][j]='\0';
break;
}
if(singleChar=='\n')
{
Grammar[i][j]='\0';
i++;
j=0;
continue;
}
if(singleChar=='-')
{
tp=fp;
fscanf(tp,"%c",&nextChar);
if(nextChar=='>')
{
fp=tp;
continue;
}
}
if(singleChar=='|')
{