语法分析程序

Posted 029

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了语法分析程序相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char prog[100],ch,token[8];
int p=0,syn,n,i;
char *keyword[6]={"begin","then","if","while","do","end"};
void scaner();
void Irparse();
void statement();
void expression_r();
void term();
void factor();


void main()
{
int select=-1;
p=0;
printf("please input sentence, end of \'#\' !\\n");
do
{
ch=getchar();
prog[p++]=ch;
}while(ch!=\'#\');
p=0;

printf("请输入1 或 2 \\n 1.词法分析\\n 2.语法分析\\n");
scanf("%d",&select);
if(select==1)
{ 
do
{
scaner();
switch(syn)
{

case -1:printf("词法分析 出错\\n");break;
default :printf("<%d,%s>\\n",syn,token);break;
} 
}while(syn!=0);
printf("词法分析 成功\\n");
}
else if(select==2) 
{
scaner();
if(syn==1)
{Irparse();}//begin
else
{printf("语法分析出错! 请检查begin关键字\\n");return;}
if(syn==6)//end
{
scaner();
if(syn==0)
{
printf("恭喜 语法分析 成功\\n");
}
else
{printf("语法分析出错! 请检查是否缺少\'#\'\\n");}
}
else{printf("语法分析出错! 请检查是否缺少\'end\'\\n");}


}
getchar();

}
void scaner()
{


for(n=0;n<8;n++)
{token[n]=\'\\0\';}
n=0;
ch=prog[p++];
while(ch==\' \'){ch=prog[p++];}

if((ch>=\'a\'&&ch<=\'z\')||(ch>=\'A\'&&ch<=\'Z\'))
{
do{
token[n++]=ch;
ch=prog[p++];
}while((ch>=\'a\'&&ch<=\'z\')||(ch>=\'a\'&&ch<=\'z\')||(ch>=\'0\'&&ch<=\'9\'));
syn=10;

for(n=0;n<6;n++)
{if(strcmp(token,keyword[n])==0)
{
syn=n+1;

}
}
p--;
//return;
}
else if(ch>=\'0\'&&ch<=\'9\')
{
p--;
do
{
token[n++]=prog[p++];
ch=prog[p];
}while(ch>=\'0\'&&ch<=\'9\');
syn=11;


return;
}
else
{

//ch=prog[p++];
switch(ch)
{
case \'+\':syn=13;token[0]=ch;break;
case \'-\':syn=14;token[0]=ch;break;
case \'*\':syn=15;token[0]=ch;break;
case \'/\':syn=16;token[0]=ch;break;
case \':\':syn=17;token[0]=ch;
ch=prog[p++];
if(ch==\'=\'){token[1]=ch;syn++;}
else p--;
break;
case \'<\':syn=20;token[0]=ch;
ch=prog[p++];
if(ch==\'>\'){token[1]=ch;syn++;}
else if(ch==\'=\'){token[1]=ch;syn=syn+2;}
else p--;
break;
case \'>\':syn=23;token[0]=ch;
ch=prog[p++];
if(ch==\'=\'){token[1]=ch;syn++;}
else p--;
break;
case \'=\':syn=25;token[0]=ch;break;
case \';\':syn=26;token[0]=ch;break;
case \'(\':syn=27;token[0]=ch;break;
case \')\':syn=28;token[0]=ch;break;
case \'#\':syn=0;token[0]=ch;break;

default: printf("词法分析出错! 请检查是否输入非法字符\\n");syn=-1;break;

}

//return;
}

}


void Irparse()
{
scaner();
statement();
while(syn==26)//;
{
scaner();
statement();
}

}
void statement()
{
if(syn==10)
{
scaner();
if(syn==18)
{
scaner();
expression_r();
}
else
{
printf("语法分析出错! 请检查表达式是否正确\\n");return;
}
}
else
{
printf("语法分析出错! 请检查语句是否正确\\n");return;
}
}

void expression_r()
{
term();
while(syn==13||syn==14)//+ -
{
scaner();
term();
}
}

void term()
{
factor();
while(syn==15||syn==16)//* /
{
scaner();
factor();
}
}
void factor()
{
if(syn==10||syn==11)
{
scaner();
}
else if(syn==27)
{
scaner();
expression_r();
if(syn==28)
{
scaner();
}
else {printf("语法分析出错! 请检查是否缺少\')\'\\n");return;}
}
else {printf("语法分析出错! 请检查是否输入非法字符\\n");return;}

 


}

以上是关于语法分析程序的主要内容,如果未能解决你的问题,请参考以下文章

JSP语法

JSP开发中的基础语法

在下面的代码片段中的剩余 ='passthrough' 处的代码中出现语法错误

编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译

微信小程序第七天WXML语法之模板用法

微信小程序第七天WXML语法之模板用法