c语言实现算符优先语法分析.doc

上传人:b****1 文档编号:230183 上传时间:2022-10-07 格式:DOC 页数:5 大小:19.50KB
下载 相关 举报
c语言实现算符优先语法分析.doc_第1页
第1页 / 共5页
c语言实现算符优先语法分析.doc_第2页
第2页 / 共5页
c语言实现算符优先语法分析.doc_第3页
第3页 / 共5页
c语言实现算符优先语法分析.doc_第4页
第4页 / 共5页
c语言实现算符优先语法分析.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

c语言实现算符优先语法分析.doc

《c语言实现算符优先语法分析.doc》由会员分享,可在线阅读,更多相关《c语言实现算符优先语法分析.doc(5页珍藏版)》请在冰豆网上搜索。

c语言实现算符优先语法分析.doc

#include

charprog[100],zhongjian[100],shu[500];

charch,zh;

intsyn,p,q,a,b,c,d;//p指向prog,q指向zhongjian

inttable[8][8]={

{1,1,-1,-1,-1,1,-1,1},

{1,1,-1,-1,-1,1,-1,1},

{1,1,1,1,-1,1,-1,1},

{1,1,1,1,-1,1,-1,1},

{-1,-1,-1,-1,-1,-1,-1,0},

{1,1,1,1,0,1,0,1},

{1,1,1,1,0,1,0,1},

{-1,-1,-1,-1,-1,0,-1,-1}};

//存储算符优先关系表,大于为1,小于或等于为-1,其它为0表示出错

charzhan[100];//数组栈

intz,j;//z为栈顶指针,j为zhongjian数组指针

voidpush(charch)//入栈

{

zhan[z++]=ch;

}

voidpop()//出栈

{

z--;

}

voidputzhan()//打印栈内字符

{

for(inti=0;i

{

printf("%c",zhan[i]);

}

printf("\t");

}

intputzhong()//打印数组中剩余字符

{

inti=j;

do

{

printf("%c",zhongjian[i]);

}while(zhongjian[i++]!

='#');

printf("\t");

i-=2;

returni;

}

charding()//获取栈顶元素,无视E

{

chara;

q=z-1;

do

{

a=zhan[q--];

}while(a=='E');

returna;

}

charding2()//获取栈顶元素

{

chara;

q=z-1;

a=zhan[q];

returna;

}

intfindint(charch)/*将字符转为数字,以得到算符优先值*/

{

intt;

switch(ch)

{

case'+':

t=0;break;

case'-':

t=1;break;

case'*':

t=2;break;

case'/':

t=3;break;

case'(':

t=4;break;

case')':

t=5;break;

case'i':

t=6;break;

case'#':

t=7;

}

returnt;

}

voidchu()//初始化

{

zhan[0]='#';

z=1;

c=0;

j=0;

syn=0;

zh=ding();

ch=zhongjian[j];

}

voidanalyse()//分析

{

while(zh!

='#'||ch!

='#')

{

putzhan();

d=putzhong();

a=findint(zh);

b=findint(ch);

if(table[a][b]==-1)

{

push(ch);

j++;

printf("移进\n");

}

elseif(table[a][b]==1)

{

for(intm=d;m>=j;m--)

{

shu[c++]=zhongjian[m];

}

for(inti=z-1;i>0;i--)

{

shu[c++]=zhan[i];

}

zh=ding2();

if(zh=='i')//当前比较为i,出栈一次

pop();

else//当前比较不为i,出栈三次

{

pop();

pop();

pop();

}

push('E');//归约到E

printf("归约\n");

shu[c++]='';

shu[c++]='>';

shu[c++]='-';

shu[c++]='';

}

else

{

syn=-1;

break;

}

zh=ding();

ch=zhongjian[j];

}

}

voidloadch()//读入所有字符串

{

inti=0;

printf("请输入要进行算符优先分析的字符串:

\n");

do

{

ch=getchar();

prog[i++]=ch;

}

while(ch!

='#');

}

voidscaner()

{

syn=1;

ch=prog[p++];

while(ch==''||ch=='\n')

{

ch=prog[p++];

}

switch(ch)

{

case'+':

zhongjian[q++]='+';break;

case'-':

zhongjian[q++]='-';break;

case'*':

zhongjian[q++]='*';break;

case'/':

zhongjian[q++]='/';break;

case'(':

zhongjian[q++]='(';break;

case')':

zhongjian[q++]=')';break;

case'i':

zhongjian[q++]='i';break;

case'#':

zhongjian[q++]='#';syn=0;break;

default:

syn=-1;break;

}

}

voidsaomiao()

{

p=0;q=0;

do

{

scaner();

if(syn==-1)

{

printf("输入符号有误!

\n");

break;

}

}

while(syn!

=0);

}

voidmain()

{

loadch();

saomiao();

if(syn==0)

{

chu();

analyse();

printf("#E\t#\t结束\n");

if(syn==0)

{

printf("该字符串可被文法识别\n");

printf("E");

for(inti=c;i>=0;i--)

{

printf("%c",shu[i]);

}

printf("\n");

}

else

{

printf("该字符串不可被文法识别\n");

}

}

}

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

当前位置:首页 > 考试认证 > IT认证

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

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