test语法分析程序Word文档下载推荐.docx
《test语法分析程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《test语法分析程序Word文档下载推荐.docx(12页珍藏版)》请在冰点文库上搜索。
//token保存单词符号,token1保存单词值
externcharScanout[300];
//保存词法分析输出文件名
FILE*fp;
//用于指向输入文件的指
intTESTparse()
{
intes=0;
if((fp=fopen(Scanout,"
r"
))==NULL)
{
printf("
\n打开%s错误!
\n"
Scanout);
es=10;
}
if(es==0)es=program();
printf("
=====语法分析结果!
=====\n"
);
switch(es)
case0:
printf("
语法分析成功!
break;
case10:
打开文件%s失败!
case1:
缺少{!
case2:
缺少}!
case3:
缺少标识符!
case4:
少分号!
case5:
缺少(!
case6:
缺少)!
case7:
缺少操作数!
fclose(fp);
return(es);
}
//program:
:
={<
declaration_list>
<
statement_list>
intprogram()
fscanf(fp,"
%s%s\n"
token,token1);
if(strcmp(token,"
{"
))//判断是否为'
{'
es=1;
return(es);
&
token,&
token1);
es=declaration_list();
if(es>
0)return(es);
es=statement_list();
}"
}'
es=2;
//<
声明序列>
=<
声明语句>
|$
delaration_list>
=
declaration_stat>
//改成<
intdeclaration_list()
while(strcmp(token,"
int"
)==0)
es=declaration_stat();
if(es>
=int<
变量>
;
=intID;
intdeclaration_stat()
ID"
))return(es=3);
//不是标识符
"
))return(es=4);
fscanf(fp,"
语句序列>
语句>
statement>
intstatement_list()
))
es=statement();
0)return(es);
if语句>
|<
while语句>
for语句>
read语句>
write语句>
复合语句>
表达式语句>
if_stat>
while_stat>
for_stat>
compound_stat>
expression_stat>
intstatement()
if(es==0&
&
strcmp(token,"
if"
)==0)es=if_stat();
//<
while"
)==0)es=while_stat();
//<
for"
)==0)es=for_stat();
//<
read"
)==0)es=read_stat();
//<
write"
)==0)es=write_stat();
)==0)es=compound_stat();
//<
)==0||strcmp(token,"
NUM"
)==0||strcmp(token,"
("
)==0)
es=expression_stat();
//<
=if(<
表达式>
)<
[else<
]
expression>
intif_stat()
//if
))return(es=5);
//少左括号
es=expression();
)"
))return(es=6);
//少右括号
es=statement();
else"
)==0)//else部分处理
fscanf(fp,"
printf("
=while(<
expr>
intwhile_stat()
//少左括号
//少右括号
=for(<
intfor_stat()
))return(es=4);
//少分号
))return(es=6);
write_语句>
=write<
write_stat>
intwrite_stat()
read_语句>
=read<
read_stat>
=readID;
intread_stat()
))return(es=3);
//少标识符
intcompound_stat()//复合语句函数
|;
intexpression_stat()
printf("
}else
es=4;
//少分号
标识符>
布尔表达式>
=ID=<
bool_expr>
intexpression()
intes=0,fileadd;
chartoken2[20],token3[40];
fileadd=ftell(fp);
//记住当前文件位置
token2,&
token3);
token2,token3);
if(strcmp(token2,"
="
)==0)//'
='
{
fscanf(fp,"
printf("
es=bool_expr();
if(es>
}else
fseek(fp,fileadd,0);
//若非'
则文件指针回到'
前的标识符
}
}elsees=bool_expr();
算术表达式>
(>
|>
=|<
=|==|!
=)
//<
additive_expr>
//|<
=)<
intbool_expr()
es=additive_expr();
>
)==0
||strcmp(token,"
=="
!
es=additive_expr();
项>
{(+|-)<
term>
intadditive_expr()
es=term();
+"
-"
es=term();
因子>
{(*|/)<
factor>
intterm()
es=factor();
*"
/"
es=factor();
=(<
)|<
无符号整数>
)|ID|NUM
intfactor()
es=expression();
if(strcmp(token,"
))return(es=6);
return(es);
es=7;
//缺少操作数
externintTESTscan();
externintTESTparse();
voidmain()
es=TESTscan();
//调词法分析
if(es>
0)printf("
词法分析有错,编译停止!
elseprintf("
词法分析成功!
if(es==0)
{
es=TESTparse();
//调语法分析
if(es==0)printf("
elseprintf("
语法分析错误\n"
}
//下面定义保留字表,为简化程序,使用字符指针数组保存所有的保留字
//如果想增加保留字,可继续添加,并修改保存保留字数目keywordSum
#definekeywordSum8
char*keyword[keyw