语义分析程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 NUM

%token ID

%type expr,term,factor %%

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;

}

相关文档
最新文档