算符优先语法分析设计原理与实现技术-实验报告-及.doc

上传人:b****9 文档编号:93746 上传时间:2022-10-02 格式:DOC 页数:13 大小:366KB
下载 相关 举报
算符优先语法分析设计原理与实现技术-实验报告-及.doc_第1页
第1页 / 共13页
算符优先语法分析设计原理与实现技术-实验报告-及.doc_第2页
第2页 / 共13页
算符优先语法分析设计原理与实现技术-实验报告-及.doc_第3页
第3页 / 共13页
算符优先语法分析设计原理与实现技术-实验报告-及.doc_第4页
第4页 / 共13页
算符优先语法分析设计原理与实现技术-实验报告-及.doc_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

算符优先语法分析设计原理与实现技术-实验报告-及.doc

《算符优先语法分析设计原理与实现技术-实验报告-及.doc》由会员分享,可在线阅读,更多相关《算符优先语法分析设计原理与实现技术-实验报告-及.doc(13页珍藏版)》请在冰豆网上搜索。

算符优先语法分析设计原理与实现技术-实验报告-及.doc

算符优先语法分析设计原理与实现技术

XXX1028XXX计科1XXX班

功能描述

能够有效识别以下算符优先文法

E→E+T|E-T

T→T*F|T/F|F

F→(E)|i

所描述算术表达式.

主要数据结构描述

数据结构

功能描述

string[]

存储该算符优先文法,对栈顶元素进行规约时要用到

map

符号表中的元素映射成整数

map

将用整数表示的符号映射到响应的行或列

map

将整数映射成相应的字母表中的符号

int[]

分析栈

程序结构描述

n设计方法

1.由文法构造算符优先矩阵

+

-

*

/

i

#

+

>

>

<

<

<

>

<

>

-

>

>

<

<

<

>

<

>

*

>

>

>

>

<

>

<

>

/

>

>

>

>

<

>

<

>

<

<

<

<

<

=

<

>

>

>

>

>

>

i

>

>

>

>

>

>

#

<

<

<

<

<

<

=

2.根据算符优先矩阵算数表达式的词法分析结果进行语法分析,分析算法为:

数据结构:

符号栈S---存放所有读进的符号(计数i)

K---符号栈使用深度

a---工作单元

R,Q---变量

分析算法:

先找最左素短语的尾部(>)

再找最左素短语的头部(<)

以分析表达式i+i*i为例,详细过程如下:

n函数定义

函数原型

功能描述

void init()

各种初始化操作,主要是建立符号与整数、整数与行列号、整数与符号之间的映射,也包括各全局变量的初始化

voidisVt(int)

判断某整数所代表的符号是否是终结符号或’#’

voidcomp(inta,intb)

比较两整数所代表的字符的优先关系

voidadvance()

从输入文件中读入一个词

boolparser()

算符优先分析函数,根据算符优先矩阵进行语法分析

intmain(intargc,char*argv[])

主函数,参数argv[1]代表输入文件

n函数调用关系

main

init

isVt

advance

parser

comp

n程序执行图

程序测试

测试用例一:

(a+b*c)+d+e+a*c/b

首先调用实验一的词法分析程序,得到如下分析结果:

(19,'(')

(12,'a')

(14,'+')

(12,'b')

(16,'*')

(12,'c')

(20,')')

(14,'+')

(12,'d')

(14,'+')

(12,'e')

(14,'+')

(12,'a')

(16,'*')

(12,'c')

(17,'/')

(12,'b')

在以此分析结果作为本程序实验结果的输入,得到如下分析结果:

该结果显示了详细的分析过程,且表明该表达式是一个符合该文法的表达式

测试用例二:

(a+b*c)+d*-a*c+(a+b

同样调用实验一的词法分析程序,得到如下结果:

(19,'(')

(12,'a')

(14,'+')

(12,'b')

(16,'*')

(12,'c')

(20,')')

(14,'+')

(12,'d')

(16,'*')

(15,'-')

(12,'a')

(16,'*')

(12,'c')

(14,'+')

(19,'(')

(12,'a')

(14,'+')

(12,'b')

以此分析结果作为本实验程序的输入,得到如下语法分析结果:

实验结果表明,在分析过程中出现了错误,分析过程未完成,该样例是一个非法的表达式.

学习总结

Ø按算符优先关系所确定的应被规约的子串恰好是当前举行的最左素短语.

Ø尽管算符优先分析也属于自底向上语法分析的范畴,但却不是严格的从左至右的规范分析,每步所得的句型自然也不是一个规范句型.

Ø采用上述策略进行算符优先分析时,尽管我们也指出了每一最左素短语应规约到的非终结符号,然而每次在查找最左素短语时,起主导作用的是终结符号间的优先关系,两终结符号之间究竟是哪个非终结符号无关宏旨.

//operator_prior.cpp:

Definestheentrypointfortheconsoleapplication.

//

#include"stdafx.h"

#include

#include

#include

#include

#include

#defineID12

#defineADD14

#defineSUB15

#defineMUL16

#defineDIV17

#defineLP19

#defineRP20

#defineEOI31

#defineSHARP32

#defineEQ0

#defineBT1

#defineLT2

#defineUD3

#defineN_Base1000

usingnamespacestd;

FILE*fp;

intlookahead,yylineno;

boolsuccess;

mapintToint;

mapcharToint;

mapintTochar;

stringgrammer[8]={

"E+T","E-T","T",

"T*F","T/F","F",

"(E)","i"

};

intprior_matrix[9][9]={

{BT,BT,LT,LT,LT,BT,LT,BT},

{BT,BT,LT,LT,LT,BT,LT,BT},

{BT,BT,BT,BT,LT,BT,LT,BT},

{BT,BT,BT,BT,LT,BT,LT,BT},

{LT,LT,LT,LT,LT,EQ,LT,UD},

{BT,BT,BT,BT,UD,BT,UD,BT},

{BT,BT,BT,BT,UD,BT,UD,BT},

{LT,LT,LT,LT,LT,UD,LT,EQ}

};

voidinit(){

success=true;

yylineno=0;

intToint[ADD]=0;intToint[SUB]=1;

intToint[MUL]=2;intToint[DIV]=3;

intToint[LP]=4;intToint[RP]=5;

intToint[ID]=6;intToint[SHARP]=7;

charToint['+']=ADD;charToint['-']=SUB;

charToint['*']=MUL;charToint['/']=DIV;

charToint['(']=LP;charToint[')']=RP;

charToint['i']=ID;

intTochar[ADD]='+';intTochar[SUB]='-';

intTochar[MUL]='*';intTochar[DIV]='/';

intTochar[LP]='(';intTochar[RP]=')';

intTochar[ID]='i';intTochar[SHARP]='#';

intTochar[N_Base]='N';

}

boolisVt(inta){

if(a>=N_Base)returnfalse;

elsereturntrue;

}

intcomp(inta,intb){

intx=intToint[a];

inty=intToint[b];

returnprior_matrix[x][y];

}

voidadvance(){

if(fscanf(fp,"(%d",&lookahead)==EOF){

lookahead=SHARP;

}else{

charch;

do{

ch=fgetc(fp);

if(ch=='\n'||ch==EOF)break;

}while(true);

}

yylineno++;

}

voidparser(){

intstack[100],top=0;

inti,j,k,ii,jj;

stack[top++]=SHARP;

advance();

do{

for(i=0;i

printf("%c",intTochar[stack[i]]);

}

printf("\t%c\n",intTochar[lookahead]);

for(i=top-1;i>=0;i--){

if(isVt(stack[i]))break;

}

intres=comp(stack[i],lookahead);

if(res==LT||res==EQ){

stack[top++]=lookahead;

advance();

}elseif(res==BT){

inttemp=stack[i];

for(j=i-1;j>=0;j--){

if(isVt(stack[j])){

if(comp(stack[j],temp)==LT){

break;

}else{

temp=stack[j];

}

}

}

for(k=0;k<8;k++){

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1