编译原理及实现附录C语法分析程序代码包含词法分析代码Word文档格式.docx
《编译原理及实现附录C语法分析程序代码包含词法分析代码Word文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理及实现附录C语法分析程序代码包含词法分析代码Word文档格式.docx(22页珍藏版)》请在冰点文库上搜索。
printf("
\n打开文件%s错误!
\n"
Scanout);
es=10;
}
if(es==0)es=program();
printf("
=====语法分析结果!
========\n"
);
switch(es)
case0:
语法分析成功!
\n"
break;
case10:
printf("
打开文件%s失败!
Scanout);
case1:
缺少{!
break;
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;
return(es);
=<
声明语句>
1<
//<
=
declaration_stat>
|e//3tJ^l<
*{<
intdeclaration_list()
intes=0;
while(strcmp(token,"
int"
)==0)
es=declaration_stat();
if(es>
0)return(es);
=ID<
变量>
;
=intID;
intdeclaration_stat()
printf("
token,token1);
if(strcmp(token,"
ID"
))return(es*3);
//不是标识符
fscanf(fp,"
&
token,&
token,token1);
if(strcmp(token,"
?
"
))return(es=4);
fscanf(fp,"
=<
语句>
|e
statement_list>
=<
statement>
|e//改成<
8={<
intstatement_list()
while(strcmp(token,"
))
es=statement();
if(es>
0)return(es);
if语句>
|<
while參语句>
for语句>
丨<
write语句>
resd语句>
丨<
复合语句>
表达式语句>
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();
while语句^>
for"
)==0)es=for_stat();
for语句>
resd"
)==0)es=read_stat();
readS^J>
write"
)==0)es=write_stat();
writeS^I>
)==0)es=compound_stat();
(strcmp(token,"
)==0||strcmp(token,"
NUM"
("
)==0))es=expression_stat();
=if(<
表达式>
)<
4136<
]
=if{<
expression>
)<
statement>
[else<
]
intif_stat()
//if
("
))if(es>
0)return(es=5);
//少左括号
es=expression();
0)return(es=4);
//少分号
)"
0)return(es=6);
//少右括号
es=statement();
else"
)==0)//else部分处理
fscanf(fp,"
return(es);
while语句>
=while(<
=while(<
expr>
)<
intwhile_stat()
if(strcmp(token,"
0)return(es=5);
//少左括号
token1);
es=expression();
if(es>
)"
0)return(es=6);
es=statement();
for语句>
=for(<
;
=for(<
intfor_stat()
%s.%s\n"
write_语句>
=write<
write_stat>
=write<
intwrite_stat()
token,&
token1);
if(es>
0)return(es);
}
resci_j5^>
^找日化变量>
resd_stat>
=resdID;
intread_stat()
0)return(es=3);
//例示识符
0)return(es=4);
//少分号
fscanf(fp,"
-(<
compound_stat>
={<
}一:
i>
-,:
-^-1
intcompound_stat()//复合语句函数
es=statement_list();
人:
丨;
expressgLon_stat>
|;
intexpression_stat()
fscanf(fp,"
printf("
token,token1);
if(es==0&
strcmp(token,"
fscanf(fp,"
printf("
return(es);
else
es=4;
标识符>
布尔表达式>
=ID==<
bool_expr>
intexpression()
intes=0,filesdd;
chartoken2[20],token3[40];
)==0)
filesdd=ftell(fp);
//记住当前文件位置
%s%sVi"
token2,&
token3);
token2,token3);
if(strcmp(token2,"
="
)==0)//'
='
{
fscanf(fp,"
printf("
es=bool_expr();
if(es>
0)return(es);
}
else
fseek(fp,filesdd,0);
//若非^=’,则文件指针回到'
==前的标识符
token,token1);
elsees=bool_expr();
return(es);
—〈算术表达式>
算术表达式>
(>
彳>
=丨<
=|==f:
!
=)
^-m.c'
.j
additive_expr>
additive_expr>
f>
=|<
=|==|!
*)<
intbool_expr()
es=additive_expr();
>
)==0||strcmp(token,"
)==0||strcmp(token,"
)==0||strcmp(token,"
)==0||strcmp(token,"
=="
)==0||strcmp(token,"
="
es=additive_expr();
项>
{(+|-)<
term>
{(+|-)<
intadditive_expr()
es=term();
+"
-"
es=term();
//<
项>
48<
因子>
|(*|/)<
)>
*<
factor>
{(*(/)<
factor>
intterm()
es=factor();
while(strcmp(token,"
*"
)==0||strcmp(token,"
/"
es=factor();
if(es>
因子>
(<
无符号整数>
=(<
)丨ID|NUM
intfactor()
es=expression();
if(strcmp(token,"
))return(es=6);
if(strcmp(token,"
token1)