算符优先分析方法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

1.课程设计的目的与原理 (1)

1.1设计目的 (1)

1.2设计原理 (1)

2.课程设计环境 (1)

3.课程设计内容 (2)

3.1算符优先分析流程图 (2)

3.2算符优先总流程图 (3)

3.3算符优先文法 (4)

3.4 程序调试 (5)

4.总结 (6)

附录 (6)

算符优先分析方法

1.课程设计目的与原理

1.1设计目的

1.了解利用算符优先算法进行移进规约分析的方法。

2. 锻炼和提高自己的编程能力。

3. 熟悉编译原理语法分析的方法,加深对算符优先基本方法的了解。

4. 进一步理解编译原理,更好的的学习它的思路,掌握编译原理的理论基

础。

5. 了解算符优先分析和规范规约的不同以及优缺点。

1.2设计原理

算符优先分析方法是根据算符之间的优先关系而设计的一种自底向上的语法分析方法。算符优先分析的基本思想是只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。由于算符优先分析不考虑非终结符之间的优先关系,在归约过程中只要找到可归约串就归约,并不考虑归约到哪个非终结符,因而算符优先归约不是规范归约。

2.课程设计环境

1.硬件运行环境:Windows XP

2.软件运行环境:VC++ 6.0版本

3.课程设计内容

3.1算符优先分析流程图

流程图说明:k:表示的是符号栈S的使用深度

S:用来存放终结符和非终结符的符号栈

Vt:存放该文法中的所有终结符

3.2算符优先总流程图

3.3算符优先文法

例已知表达式文法为:

E->E+T

E->T

T->T*F

T->F

F->(E)

F->i

⑴计算FIRSTVE和LASTVT集合

FirstVT(E)={+,*,(,i} LastVT(E)={+,*,),i} FirstVT(T)={*,(,i} LastVT(T)={*,),i} FirstVT(F)={(,i} LastVT(F)={),i} FirstVT(Q)={#} LastVT(Q)={#}

见附录

3.4程序调试

例:

1、输入产生式的个数:

2、输入文法:

3、判断文法

4、生成非终结符的FIRSTVT集和LASTVT集:

5、生成算符优先分析表:

5、输入字符串进行分析:

输出结果与自己做的结果一模一样,说明设计成功。

4.总结

经过此次编译课程设计,使我对算符优先分析有了更深更进一步的理解,而且也锻炼了自己的程序编码能力,对自己今后的道路影响不小。当然还有不足之处以后会慢慢改进。在试验过程中,我忘记在程序最后面加上一句getchar();,导致我试验时,直接运行.exe文件,当运行到最后输入归约字符串时,执行完后界面自动关闭,导致我不能截图,经过不屑的努力,有两种解决方法,第一可以用VC软件运行,界面就不会关闭。第二种是在程序里加上getchar();,.exe文件运行到最后就不会自动关闭。

附录

#include

#include

#include

typedef struct

{

char R;

char r;

int flag;

}array;

typedef struct

{

char E;

char e;

}charLode;

typedef struct

{

charLode *base;

int top;

}charstack;

char str[80][80],arr[80][80],brr[80][80]; array F[20];

int m,kk,p,ppp,FF=1;

char r[10];

int crr[20][20],FLAG=0;

char ccrr1[1][20],ccrr2[20][1];

void Initstack(charstack &s)//定义栈{

s.base=new charLode[20];

s.top=-1;

}

void push(charstack &s,charLode w) {

s.top++;

s.base[s.top].E=w.E;

s.base[s.top].e=w.e;

}

void pop(charstack &s,charLode &w)

{

w.E=s.base[s.top].E;

w.e=s.base[s.top].e;

s.top--;

}

int IsEmpty(charstack s)

{

if(s.top==-1)

return 1;

else return 0;

}

int IsLetter(char ch)

{

if(ch>='A'&&ch<='Z')

return 1;

else return 0;

}

//judge1是判断是否是算符文法:若产生式中含有两个相继的非终结符则不是算符文法int judge1(int n)

{

int j=3,flag=0;

for(int i=0;i<=n;i++)

while(str[i][j]!='\0')

{

char a=str[i][j];

char b=str[i][j+1];

if(IsLetter(a)&&IsLetter(b))

{flag=1;break;}

else j++;

}

相关文档
最新文档