算符优先语法分析设计原理与实现技术-实验报告-及Word文档格式.doc
《算符优先语法分析设计原理与实现技术-实验报告-及Word文档格式.doc》由会员分享,可在线阅读,更多相关《算符优先语法分析设计原理与实现技术-实验报告-及Word文档格式.doc(13页珍藏版)》请在冰豆网上搜索。
-
*
/
(
)
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,'
+'
b'
(16,'
*'
c'
(20,'
)'
d'
e'
(17,'
/'
在以此分析结果作为本程序实验结果的输入,得到如下分析结果:
该结果显示了详细的分析过程,且表明该表达式是一个符合该文法的表达式
测试用例二:
(a+b*c)+d*-a*c+(a+b
同样调用实验一的词法分析程序,得到如下结果:
(15,'
-'
以此分析结果作为本实验程序的输入,得到如下语法分析结果:
实验结果表明,在分析过程中出现了错误,分析过程未完成,该样例是一个非法的表达式.
学习总结
Ø
按算符优先关系所确定的应被规约的子串恰好是当前举行的最左素短语.
尽管算符优先分析也属于自底向上语法分析的范畴,但却不是严格的从左至右的规范分析,每步所得的句型自然也不是一个规范句型.
采用上述策略进行算符优先分析时,尽管我们也指出了每一最左素短语应规约到的非终结符号,然而每次在查找最左素短语时,起主导作用的是终结符号间的优先关系,两终结符号之间究竟是哪个非终结符号无关宏旨.
//operator_prior.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"
stdafx.h"
#include<
stdio.h>
ctype.h>
map>
vector>
string>
#defineID12
#defineADD14
#defineSUB15
#defineMUL16
#defineDIV17
#defineLP19
#defineRP20
#defineEOI31
#defineSHARP32
#defineEQ0
#defineBT1
#defineLT2
#defineUD3
#defineN_Base1000
usingnamespacestd;
FILE*fp;
intlookahead,yylineno;
boolsuccess;
intToint;
charToint;
intTochar;
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,BT,BT,LT,BT,LT,BT},
{LT,LT,LT,LT,LT,EQ,LT,UD},
{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;
]=MUL;
]=DIV;
]=LP;
]=RP;
i'
]=ID;
intTochar[ADD]='
;
intTochar[SUB]='
intTochar[MUL]='
intTochar[DIV]='
intTochar[LP]='
intTochar[RP]='
intTochar[ID]='
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<
top;
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>
j--){
if(isVt(stack[j])){
if(comp(stack[j],temp)==LT){
break;
}else{
temp=stack[j];
}
}
}
for(k=0;
k<
8;
k++){