📄 语义分析-main.c
字号:
#include "stdio.h"
#include "string.h"
#include "malloc.h"
#include "scaner.h"
#include "stack.h" //利用栈将10进制数转化为字符型,存入字符数组中。
int kk=0; //输出错误的标志 错误时,kk=1;
int ll=0; //控制临时变量的下标
void yucu(); //语句串分析程序
void statement(); //语句分析程序
char *expression(); //表达式分析程序
char *term(); //项分析程序
char *factor(); //因子分析程序
char *newtemp(); //回送一个新的临时变量名,且产生的顺序为t1,t2,.....
//回送一个新的临时变量名,且产生的顺序为t1,t2,.....
char *newtemp()
{
char *q;
q=(char *)malloc(8);
*q='t';
ll++;
if(ll<=9)
*(q+1)=(char)(ll+'0');
else
d_c(ll,(q+1));
return q;
}
//语法分析程序
void irparser() //begin<语句串>end
{
if(syn==1) //是否以begin 开头
{
scaner();
yucu(); //是,则分析语句串
if(syn==6) //是否以end结束
{
scaner(); //找到'#'
if(syn==0&&kk==0) //若以'#'结束,则syn=0
printf("success!!!!");
}
else //语句串输入没有错,则只是end输入错误
{
if(kk!=1)
printf("\n没有'end',输入错误");
kk=1;
}
}
else //不是以begin开头
{
printf("\n没有以'begin'开头,或输入'begin'错误");
kk=1;
}
}
//语句串分析程序
void yucu() //<语句>(;<语句>)
{
statement(); //第一个语句
while(syn==26) //识别;
{
scaner();
statement(); //下一个语句
}
}
//语句分析程序
void statement() //赋值语句->标识符=表达式
{
char tt[8],eplace[8]; //tt:存放输入串中结果标识符,eplace每个语句计算的最终结果
/*strcpy(tt,"");
strcpy(eplace,"");*/
if(syn==10) //标识符
{
strcpy(tt,token); //token当前标识符
scaner();
if(syn==18) //:=
{
scaner();
strcpy(eplace,expression()); //expression(); //表达式
/*printf("\n");
puts(tt);
putchar('=');
puts(eplace);*/
printf("\n%s=%s %s %s",tt,eplace);
}
else
{
printf("\n输入'='错误"); //:=没有输入正确
kk=1;
}
}
}
//表达式分析程序
char *expression() //<项>(+<项>|-<项>)
{
char *tp,*ep2,*eplace,tt; //tp:计算结果,ep2:第二项 ,eplace:项首 ,tt:操作符
tp=(char *)malloc(12);
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
/*strcpy(tp,"");
strcpy(ep2,"");
strcpy(eplace,"");*/
strcpy(eplace,term()); //项首
while(syn==13||syn==14)
{
if(syn==13)
tt='+';
else
tt='-';
scaner();
strcpy(ep2,term()); //调用term分析表达式的第二项
strcpy(tp,newtemp()); //调用newtemp存放临时变量
/*printf("\n");
puts(tp);
putchar('=');
puts(eplace);
puts(tt);
puts(ep2);*/
printf("\n%s=%s%c%s",tp,eplace,tt,ep2);
strcpy(eplace,tp); //将临时变量作为下一次计算的第一项。
}
return eplace;
}
//项分析程序
char *term() //<因子>(*<因子>|/<因子>)
{
char *tp1,*ep1,*eplace1,tt1; //tp1:计算结果,ep1:第二个因子 ,eplace1:首因子 ,tt1:操作符
tp1=(char *)malloc(12);
ep1=(char *)malloc(12);
eplace1=(char *)malloc(12);
/*strcpy(tp1,"");
strcpy(ep1,"");
strcpy(eplace1,"");*/
strcpy(eplace1,factor()); //factor(); //首因子
while(syn==15||syn==16) //*,/
{
if(syn==15)
tt1='*';
else
tt1='/';
scaner();
strcpy(ep1,factor()); //下一个因子
strcpy(tp1,newtemp());
/*printf("\n");
puts(tp1);
putchar('=');
puts(eplace1);
puts(tt1);
puts(ep1);*/
printf("\n%s=%s%c%s",tp1,eplace1,tt1,ep1);
strcpy(eplace1,tp1);
}
return eplace1;
}
//因子分析程序
char *factor() //标识符|数字|表达式
{
char *fplace;
fplace=(char *)malloc(12);
strcpy(fplace,"");
if(syn==10) //标识符
{
strcpy(fplace,token); //将标识符的值赋给fplace
scaner();
}
else if(syn==11)
{
//d_c(sum,fplace);
*fplace=(char)(sum+'0');
scaner();
}
else if(syn==27) //(
{
scaner();
fplace=expression();
if(syn==28) //)
scaner();
else
{
printf("\n输入')'时错误");
kk=1;
}
}
else
{
printf("\n表达式错误");
kk=1;
}
return fplace;
}
void main()
{
printf("\n please input string:\n");
do //从键盘接收到prog
{
ch=getchar();
prog[p++]=ch;
}while(ch!='#'); //以#结束
p=0;
scaner(); //识别第一个单词,是否为begin
irparser();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -