📄 wawawa.c
字号:
{
nul(l);printf("call ");
getsym();
if(strcmp(sym,"ident")==0)
{
printf("%s\n",id);
getsym();
}
else error(14);//call后应为标识符.
}
nul(l);printf("过程调用语句结束 ");
}
//读语句处理
//<读语句>::=READ'('<标识符>{,<标识符>}')'
void Read()
{
nul(l);printf("读语句开始 ");
if(strcmp(sym,"readsym")==0)
{
printf("read");
getsym();
if(strcmp(sym,"lparen")!=0)
error(34);//read后应跟的是括号
else
{
do
{
nul(l);printf("%s\n",sym);
getsym();
if(strcmp(sym,"ident")==0)
{
nul(l);printf("%s",id);
getsym();
}
}while(strcmp(sym,"comma")==0);
}
if(strcmp(sym,"rparen")!=0)
error(33);//读语句应以右括号结束
else
{
nul(l);printf("%s\n",sym);
getsym();
}
}
nul(l);printf("读语句结束 ");
}
//写语句处理
//<写语句>::=WRITE'('<表达式>{,<表达式>}')'
void Write()
{
nul(l);printf("写语句开始 ");
if(strcmp(sym,"writesym")==0)
{
nul(l);printf("%s\n",sym);
getsym();
if(strcmp(sym,"lparen")!=0)
error(34);//write后应是左括号
else
{
do
{
nul(l);printf("%s",sym);
getsym();
expression();
}while(strcmp(sym,"comma")==0);
}
if(strcmp(sym,"rparen")!=0)
error(33);//写语句应以右括号结束
else
{
nul(l);printf("%s\n",sym);
getsym();
}
}
nul(l);printf("写语句结束 ");
}
//复合语句处理
//<复合语句>::=BEGIN<语句>{;<语句>}END
void FuHe()
{
void statement();
if(strcmp(sym,"beginsym")==0)
{
nul(l);printf("%s复合语句开始\n",sym);
getsym();
statement();
while(strcmp(sym,"semicolon")==0||strcmp(sym,"beginsym")==0||strcmp(sym,"callsym")==0||strcmp(sym,"ifsym")==0||strcmp(sym,"whilesym")==0)
{
if(strcmp(sym,"semicolon")==0)
{
nul(l);printf("%s\n",sym);
getsym();
}
else error(10);//语句之间漏了';'.
statement();
}
if(strcmp(sym,"endsym")==0)
{
nul(l);printf("%s",sym);
getsym();
}
else error(17);//丢了'end'或';'
}
printf("复合语句结束\n");
}
//语句处理
//<语句>::=<赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<空>
void statement()
{
// nul(l);printf("语句开始!");
if(strcmp(sym,"ident")==0)
FuZhi();//赋值语句处理
else if(strcmp(sym,"ifsym")==0)
{
TiaoJian();//条件语句处理
}
else if(strcmp(sym,"whilesym")==0)
DangXingXunHuan();//当型循环语句处理
else if(strcmp(sym,"callsym")==0)
GuoChengDiaoYong();//过程调用语句处理
else if(strcmp(sym,"readsym")==0)
Read();//读语句处理
else if(strcmp(sym,"writesym")==0)
Write();//写语句处理
else if(strcmp(sym,"beginsym")==0)
FuHe();//复合语句处理
//else getsym();//空语句处理
//nul(l);printf("%s\n",sym);
// nul(l);printf("语句结束!");
}
//常量说明部分处理
//<常量说明部分>::=CONST<常量定义>{,<常量定义>};
//<常量定义>::=<标识符>=<无符号整数>
void constdeclaration()
{
//nul(l);printf("常量说明部分开始\n");
if(strcmp(sym,"ident")==0)
{
nul(l);printf(" %s ",id);
getsym();
if(strcmp(sym,"eql")==0||strcmp(sym,"becomes")==0)
{
if(strcmp(sym,"becomes")==0)
error(1);
else
{
nul(l);printf(" %s ",sym);
getsym();
}
if(strcmp(sym,"number")==0)
{
nul(l);printf("%d ",num);
nul(l);printf("(进入符号表)\n");
getsym();
}
else error(2);
}
else error(3);
}
else error(4);
//nul(l);printf("常量说明部分结束\n");
}
//变量说明部分处理
//<变量说明部分>::=VAR<标识符>{,<标识符>};
void vardeclaration()
{
//nul(l);printf("变量说明部分开始\n");
if(strcmp(sym,"ident")==0)
{
nul(l);printf(" %s",id);
printf("(进入符号表)");
getsym();
}
else error(4);
//nul(l);printf("变量说明部分结束\n");
}
//过程说明部分处理
//<过程说明部分>::=<过程首部><分程序>{;<过程说明部分>};
//<过程首部>::=PROCEDURE<标识符>;
void procdeclaration()
{
void block();
//nul(l);printf("过程说明部分开始\n");
while(strcmp(sym,"procsym")==0||strcmp(sym,"constsym")==0||strcmp(sym,"varsym")==0)
{
if(strcmp(sym,"procsym")==0)
{
fengexian(20);
nul(l);printf("(过程说明部分开始)%s ",sym);
}
getsym();
if(strcmp(sym,"ident")==0)
{
printf("%s ",id);
//nul(l);printf("(进入符号表)");
getsym();
}
else error(4);
if(strcmp(sym,"semicolon")==0)
{
printf(";\n");
getsym();
}
else
{
nul(l);printf("aaa %s\n",sym);
error(5);
}
block();
if(strcmp(sym,"semicolon")==0)
{
nul(l);printf("(过程说明部分结束)%s\n",sym);
fengexian(20);
getsym();
procdeclaration();
}
else if(strcmp(sym,"period")==0)
{;}
else
{
nul(l);printf("ssss %s\n",sym);
error(5);
}
}
}
//分程序处理
//<分程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>
void block()
{
printf("\n");
nul(l);printf("%d层调用 分程序开始\n",l);
l++;
while(strcmp(sym,"procsym")==0||strcmp(sym,"constsym")==0||strcmp(sym,"varsym")==0)
{
if(strcmp(sym,"constsym")==0)
{
fengexian(10);
nul(l);printf("(常量说明部分开始)%s\n",sym);
getsym();
constdeclaration();
while(strcmp(sym,"comma")==0)
{
nul(l);printf(" %s(多个常量说明间的间隔符)\n",sym);
getsym();
constdeclaration();
}
if(strcmp(sym,"semicolon")==0)
{
nul(l);printf("(常量说明部分结束);\n");
fengexian(10);
getsym();
}
else error(5);
}
else if(strcmp(sym,"varsym")==0)
{
fengexian(10);
nul(l);printf("(变量说明部分开始)%s\n",sym);
getsym();
vardeclaration();
while(strcmp(sym,"comma")==0)
{
printf(";");
getsym();
vardeclaration();
}
if(strcmp(sym,"semicolon")==0)
{
printf("\n");
nul(l);printf("(变量说明部分结束);\n");
fengexian(10);
getsym();
}
else error(5);
}
else if(strcmp(sym,"procsym")==0)
{
procdeclaration();
//nul(l);printf("过程说明部分结束\n");
}
}
{statement();
l=l-1;
nul(l);printf("%d层调用 分程序结束\n",l);
printf("\n");}
}
//程序处理
//<程序>::=<分程序>.
void main()
{
//char fname[20];
char c[2];
//int ifone;
show();
do
{
//ifone=1;
printf("请输入您要进行语法分析的文件:");
fp=openfile("r");
//if(ifone)fp1=freopen("b.txt","w",stdout);
//fp=fopen("a.txt","r");
getsym();
fengexian(45);
printf("程序开始\n");
block();
if(strcmp(sym,"period")!=0)
error(9);
printf("程序结束\n");
if(count!=0) printf("本程序中有错误\n");
fengexian(45);
//fclose(fp1);
printf("您还要分析下一个文件吗?(y继续,其他退出):");
scanf("%s",c);
getchar();
if(tolower(c[0])!='y')break;
}while(1);
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -