编译原理实验报告yacc的使用 本文关键词:编译,原理,实验,报告,yacc
编译原理实验报告yacc的使用 本文简介:1.1错误信息统计1.2正确运行及结果:2yacc脚本%{#include#include%}%tokenNUMBER%%command:exp{printf(“%d/n“,$1);};/*printtheresult/exp:exp+term{$$=$1+$3;}|exp-term{$$=$1-$
编译原理实验报告yacc的使用 本文内容:
1.1错误信息统计
1.2正确运行及结果:
2
yacc脚本
%{
#include
#include
%}
%token
NUMBER
%%
command:
exp
{printf(“%d/n“,$1);}
;/*
the
result/
exp:exp
+
term
{$$
=
$1
+
$3;}
|exp
-
term
{$$
=
$1
-
$3;}
|term
{$$
=
$1;}
;
term:term
factor
{$$
=
$1
$3;}
|factor{$$
=
$1;}
;
factor:NUMBER{$$
=
$1;}
|
(
exp
)
{$$
=
$2;}
%%
main()
{
return
yyparse();
}
int
yylex(void)
{
int
ch;
ch
=
getchar();
if(isdigit(ch))
{yylval
=
ch
-
0
;
return
NUMBER;};/*
数字/
if(ch
==
/n
)
return
0;
return
ch;
}
void
yyerror(chars)
{
fprintf(stderr,“%s/n“,s);/*
error
message/
}
3.
Yacc脚本中,%token是定义的终结符还是非终结符?
NUMBER又是属于什么性质的符号?
%token是定义的是终结符,NUMBER属于宏定义常量,是由yacc内部决定的终结符编号常量。
4.指出上面的Yacc脚本中,其定义部分、规则部分和辅助程序(用户程序)部分各是什么?
定义部分:
%{
#include
#include
%}
%token
NUMBER
规则部分:
%%
command:
exp
{printf(“%d/n“,$1);}
;/*
the
result/
exp:exp
+
term
{$$
=
$1
+
$3;}
|exp
-
term
{$$
=
$1
-
$3;}
|term
{$$
=
$1;}
;
term:term
factor
{$$
=
$1
$3;}
|factor{$$
=
$1;}
;
factor:NUMBER{$$
=
$1;}
|
(
exp
)
{$$
=
$2;}
%%
辅助程序部分:
main()
{
return
yyparse();
}
int
yylex(void)
{
int
ch;
ch
=
getchar();
if(isdigit(ch))
{yylval
=
ch
-
0
;
return
NUMBER;};/*
数字/
if(ch
==
/n
)
return
0;
return
ch;
}
void
yyerror(chars)
{
fprintf(stderr,“%s/n“,s);/*
error
message/
}
5.规则部分定义了几个非终结符成分,各是什么?其中,开始符是哪一个?如何从Yacc脚本中快速寻找开始符?
规则定义了3个非终结符,分别是exp,term,factor;其中exp时开始符,寻找最初输入变量接收值的非终结符。
6.这个Yacc脚本实现了几条规则,试根据Yacc的规则部分,写出实现的这几条规则。
实现了三条规则,分别是加法,减法和乘法。
7.在这个Yacc脚本中,哪一部分代码实现了数字的输入?
command:
exp
{printf(“%d/n“,$1);