编译原算符优先分析实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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=='|')

{

相关文档
最新文档