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

更新时间:2024-05-03 23:59:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

编译原理实验报告

——算符优先文法分析

指导教师:师智斌 学号:1006034137

姓名:张越

【实验名称】 算符优先文法分析

【实验目的】

掌握算符优先分析法的原理,利用算符优先分析法将赋值语句进行语法分析,翻译成等价的四元式表示。

【实验内容】

1.算术表达式的文法可以是: (1)S->#E# (2)E->E+T (3)E->T (4)T->T*F (5)T->F

2.根据算符优先分析法,将表达式进行语法分析,判断一个表达式是否正确。

(6)F->P^F (7)F->P (8)P->(E) (9)P->i

【设计思想】

(1)定义部分:定义常量、变量、数据结构。

(2)初始化:设立算符优先关系表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);

(3)控制部分:从键盘输入一个表达式符号串;

(4)利用算符优先文法分析算法进行表达式处理:根据优先关系表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。

【流程图】

1

【源码】

#include #include #include #include #include using namespace std; struct Node1 {

char vn; char vt; char s[10];

}MAP[20];//存储分析预测表每个位置对应的终结符,非终结符,产生式 int k;

//用R代表E',W代表T',e代表空

1

char G[10][10]={\存储文法中的产生式

char VN[6]={'E','R','T','W','F'};//存储非终结符 char VT[6]={'i','+','*','(',')','#'};//存储终结符

char SELECT[10][10]={\存储文法中每个产生式对应的SELECT集

char Right[10][8]={\stack stak,stak1,stak2; bool compare(char *a,char *b) {

int i,la=strlen(a),j,lb=strlen(b); for(i=0;i

if(a[i]==b[j]) return 1; } return 0; }

char *Find(char vn,char vt) { int i;

for(i=0;i

if(MAP[i].vn==vn && MAP[i].vt==vt) return MAP[i].s; }

return \}

char * Analyse(char * word)

2

{

char p,action[10],output[10]; int i=1,j,l=strlen(word),k=0,l_act,m; while(!stak.empty()) stak.pop(); stak.push('#'); stak.push('E');

printf(\_______\\n\

printf(\ 对符号串%s的分析过程\\n\

printf(\ 步骤 栈顶元素 剩余输入串 推到所用产生式或匹配\\n\

p=stak.top(); while(p!='#') {

printf(\ \ p=stak.top(); stak.pop();

printf(\ \ for(j=k,m=0;j

if(p=='#') {

printf(\ 接受\\n\ return \

3

}

printf(\ “%c”匹配\\n\ k++; } else {

strcpy(action,Find(p,word[k])); if(strcmp(action,\ {

printf(\ 没有可用的产生式\\n\ return \ }

printf(\ %c%s\\n\ int l_act=strlen(action); if(action[l_act-1]=='e') continue; for(j=l_act-1;j>1;j--) stak.push(action[j]); } }

if(strcmp(output,\ return \} int main () {

freopen(\ //freopen(\ char source[100]; int i,j,flag,l,m;

printf(\为了方便编写程序,用R代表E',W代表T',e代表空\\n\\n\

4

printf(\该文法的产生式如下:\\n\ for(i=0;i<8;i++)

printf(\ %s\\n\

printf(\该文法的SELECT集如下:\\n\ for(i=0;i<8;i++) {

printf(\ SELECT(%s) = { %s }\\n\ }

//判断是否是LL(1)文法 flag=1; for(i=0;i<8;i++) {

for(j=i+1;j<8;j++) {

if(G[i][0]==G[j][0]) {

if(compare(SELECT[i],SELECT[j])) {

flag=0;break; } } } if(j!=8) break; } if(flag)

printf(\有相同左部产生式的SELECT集合的交集为空,所以文法是LL(1)文法。\\n\

5

else

printf(\有相同左部产生式的SELECT集合的交集不为空,所以文法不是LL(1)文法。\\n\ //预测分析表 for(i=0,k=0;i<8;i++) {

l=strlen(SELECT[i]); for(j=0;j

MAP[k].vn=G[i][0]; MAP[k].vt=SELECT[i][j]; strcpy(MAP[k].s,Right[i]); k++; } }

printf(\表达式文法的预测分析表如下:\\n\\n\ printf(\ \ for(i=0;i<6;i++)

printf(\ printf(\ for(i=0;i<5;i++) {

printf(\ for(j=0;j<6;j++) {

for(m=0;m

if(VN[i]==MAP[m].vn && VT[j]==MAP[m].vt) {

printf(\

6

break; } } if(m==k)

printf(\ \ }

printf(\ }

/*预测分析程序 Analyse函数*/ //输入源文件串 while(cin>>source) {

printf(\分析结果:%s\\n\\n\ } while(1); return 0; }

【运行结果】

7

8

本文来源:https://www.bwwdw.com/article/ahig.html

Top