语义分析程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语义分析程序的设计与实现
实验内容:
编写语义分析程序,实现对算术表达式的类型检查和求值。要求所分析算术表达式由如下的文法产生。E→E+T|E-T|T
T→T*F|T/F|F
F→id|(E)|num
实验要求:
用自底向上的语法制导翻译技术实现对表达式的分析和翻译。
(1)写出满足要求的语法制导定义或翻译方案。
(2)编写分析程序,实现对表达式的类型进行检查和求值,并输出:
①分析过程中所有产生式。
②识别出的表达式的类型。
③识别出的表达式的值。
(3)实验方法:利用YACC自动生成工具。
编译环境:YACC
翻译方案:
E ::= T{E'.i:=T.nptr}
E' {E.nptr:=E'.s}
E'::=+T{E'1.i:=mknode(‘+’,E'.i,T.nptr)} E'1 {E'.s:=E1.s}
E'::=-T{E'1.i:=mknode(‘-’,E'.i,T.nptr)} E'1 {E'.s:=E1.s}
E'::=ε{E'.s:= E'.i}
T ::= F{T'.i:=F.nptr} T' {T.nptr:=T'.s}
T'::=*F{T'1.i:=mknode(‘*’,T'.i,F.nptr)}
T'1 {T'.s:=T1.s}
T'::=/F{T'1.i:=mknode(‘/’,T'.i,F.nptr)}
T'1 {T'.s:=T1.s}
T'::=ε{T'.s:= T'.i}
F ::=(E){F.nptr:=E.nptr}
F ::= num{F.nptr:=mkleaf(num,num.val)}
YACC程序:
%{
#include
#include
#include
typedef struct x{int i;int c;} type; %union{
int num;
char* id;
type c;
}
%token
%token
%type
line:expr’\n’
{
if($1.i>=0)
printf(“%d num\n”,$1,i);
else
printf(“id\n”);
}
;
expr:expr’+’term
{
if($1.c==0&&($3.c==0))
{
$$.i=$1.i+$3.i;
$$.c=0;
printf(“E->E+T E.type:num\n”);
}
else
{
$$.c=1;
$$.i=-1;
printf(“E->E+T E.type:id\n”);
}
}
|expr’-’term
{
if($1.c==0&&($3.c==0))
{
$$.i=$1.i-$3.i;
$$.c=0;
printf(“E->E-T E.type:num\n”);
}
else
{
$$.c=1;
$$.i=-1;
printf(“E->E-T E.type:id\n”);
}
}
|term
{
$$.i=$1.i;
$$.c=$1.c;
if($$.c==0)
printf(“E->T E.type:num\n”);
else
printf(“E->T E.type:id\n”);
}
;
term:term’*’factor
{
if($1.c==0&&($3.c==0))
{
$$.i=$1.i*$3.i;
$$.c=0;
printf(“T->T*F T.type:num\n”);
}
else
{
$$.c=1;
$$.i=-1;
printf(“T->T*F T.type:id\n”);
}
}
|term’/’factor
{
if($1.c==0&&($3.c==0))
{
$$.i=$1.i/$3.i;
$$.c=0;
printf(“T->T/F T.type:num\n”);
}
else
{
$$.c=1;
$$.i=-1;
printf(“T->T/F T.type:id\n”);
}
}
|factor
{
$$.c=$1.c;
$$.i=$1.i;
if($$.c==0)
printf(“T->F T.type:num\n”);
else
printf(“T->F T.type:id\n”);
}
;
factor:ID
{
$$.c=1;
$$.i=-1;
}
|’(’expr’)’
{
$$.c=$2.c;
$$.i=$2.i;
if($$.c==0)
printf(“F->(E) F.type:num\n”);
else
printf(“F->(E) F.type:id\n”);
}
|NUM
{
$$.i=$1;
$$.c==0;
}