WHILE循环语句的翻译程序设计课设报告

WHILE循环语句的翻译程序设计课设报告
WHILE循环语句的翻译程序设计课设报告

1.题目:将WHILE语句转换成四元式的程序实现

设计内容及要求:设计一个语法制导翻译器,将WHILE语句翻译成四元式。要求:先确定一个定义WHILE语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的WHILE语句,程序将其转换成四元式输出(可按一定格式输出到指定文件中)。

1、系统描述

通过设计、编制、调试一个WHILE循环语句的语法及语义分析程序,

加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词

法检查和分析。用语法制导完成语义分析,并将形成的中间代码以四元式

的形式输出。

2 、文法及属性文法的描述

2.1 文法的描述

该文法的产生式如下所示:

(1)S->while(B){E}

(2)E->AE

(3)E->A

(4)A->iPA

(5)A->i

(6)B->iTi

(7)B->i

其中while、( 、) 、{ 、} 、P、T 、;和i均为终结符,而S、A、B、E这些大写字母均为非终结符。T表示比较运算符,P表示算术运算符,i表示合法标识符。

2.2 属性文法的描述

对该文法的属性文法描述如下:

(1) S->while(B){E} prinf(if B goto E else goto next)

(2) E->AE print = ·

(3) E->A print =

(4) A->i P A print(A= P

(5) A->i; = i;

(6) B->i T i print(B = T

(7) B->i = i

3 、语法分析方法描述及语法分析表设计3.1 语法分析表设计

3.1.1 文法的DFA

3.1.2 LR(0)分析表

3.1.2 LR(0)分析方法描述说明

LR分析法的规约过程是规范推到的逆过程,所以LR分析过程是一种规范规约的过程。其分析过程为:由文法构造出该文法项目集,再根据项目集构造该文法的DFA,再判断是否有移进-规约和规约-规约冲突,若没有冲突则该文法为LR(0)的,若有冲突则该文法是SLR(1)的,最后可以构造出LR(0)分析表。然后根据LR(0)分析表进行语法分析,分析过程就是进栈和规约的过

程。若能规约出开始符S,则语法正确。反之,语法错误。

4 、中间代码形式的描述及中间代码序列的结构设计

本系统中所采用的中间代码形式是四元式,是一种比较普遍采用的形式。四元式的四个组成成分是:算符op,第一和第二运算对象ARG1和ARG2及运算结果RESULT。运算对象和运算结果有时指用户自己定义的变量,有时指编译程序引进的临时变量。例如a:=b*c+b*d的四元式表示如下:

1)(*,b,c,t1)

2)(*,b,d,t2)

3)(+,t1,t2,t3)

4)(:=,t3,-,a)

四元式对中间结果的引用必须通过给定的名字,也就是说,四元式的联系是通过临时变量实现的。

将while( B rop C )goto L写成(jrop,B,C,L)

本程序中所用到的四元式语句如下:

1)形如(op,arg1,arg2,result)的赋值语句

2)形如(jrop,B,C,L)的条件转移语句

3)形如(=,arg1,-,result)的复写语句

5、编译系统的概要设计

5.1词法分析

词法分析程序要做的工作是:从源程序的第一个字符开始,顺序读字符,一次读一个,

根据所读进的字符识别各类单词,同时去掉源程序中的空白和注释。词法分析检查的错误

主要是挑出源程序中出现的非法符号。所谓非法符号是指不是程序设计语言中允许出现的

符号,就像自然语句中的错字。

语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。

流程图如下:

其中SP 为栈顶指针,S[i]为状态栈,X[i]为文法符号栈。状态转换表内容按关系GOTO[Si,X]=Sj 确定,改关系式是指当前栈顶状态为Si 遇到当前文法符号为X 时应转向状态Sj 。X 为终结符或非终结符。

ACTION[Si,a]规定了栈顶状态为Sj 时遇到输入符号c[i]应该执行的动作。动作有以下四种可能:

(1) 移进:当Sj=GOTO[Si ,a]成立,则把Sj 移入到文法符号栈。其中i ,j

表示状态号。

(2) 规约:当在栈顶形成句柄为b 时,则用b 归约为相应的非终结符A ,即

当文法中有A->b 的产生式,而b 的长度为r ,则从状态栈和文法符号栈中自栈顶向下去掉r 个符号。并把A 移入文法符号栈内,再把满足Sj=GOTO[Si ,A]的状态移进状态栈,其中Si 为修改指针后的栈顶状态。

(3) 接受acc :当归约到文法符号栈中只剩下文法的开始符号S 时,并且输

入符号串已结束即当前输入符是‘#’,则为分析成功。

(4) 报错:当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报

错,说明输入串不是该分发能接受的句子。

5.3 语法制导翻译

Sp → #

X[i S[i

在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或

语义规则描述的语义动作)进行翻译。属性文法的每个符号有属性,所以每个符号入栈时,

必须连属性一起入栈,这样,栈符号就由文法符号及存放该符号属性的域所组成。由于属性类型不同,属性域存放的内容就要根据属性的类型来定。有的可能直接存放属性值,也有的存放的是指向属性值的指针。对于综合属性,其属性域不存放其属性值,而是存放一个指针,指向存贮该属性值的单元。对于继承属性,其属性域直接保存其属性值。继承属性的属性域刚入栈时为空,但是在该栈符号变成栈顶符号之前的某一时刻,它们必须接受相应的属性值,即在成为栈顶时,继承属性的属性域必须有值。

6 、详细的算法描述

Main() ame[k]='\0'; //初始化t[]

initlab(); //初始化LR(0)分析表

get(sym); //取一个字符

while(sym!=结束)

{

chr=Getsymbol(); //词法分析

if(chr为空格) continue;

else

{

S[num]=chr; //保存词法分析结果

num++;

}

}

S[num++]='#';

print("The while sentence is:");

LR(); //语法分析

if(over==-1||Check!=1)

{

print("Your input does not tally with the grammar!");

close(文件);

return -1;

}

if(Check==1)

{

print("Parsing completed!");

close(文件);

return -1;

}

close(文件);

return 0;

}

LR() //语法分析算法{

i=0;

int k=0;

(0);

('#');

a=输入串队列队首元素;

b=结束符号;

c=符号栈栈顶元素;

d=状态栈栈顶元素;

s=开始符号;

while(a!=b&&c!=s)

{

if(k==0)

{

k=meet(d,a);

continue;

}

if(k==1)

{

k=meet(d,c);

continue;

}

if(k==-1)

{

出错

break;

}

if(k==2)

{

成功

break;

}

}

k=0;

while(a==b) //分析结束

{

if(c==s)

{

if(meet(d,a)==2)

{

ONE(); //语法正确,输出四元式

成功

break;

}

}

if(c!=s&&(meet(d,c)==1||meet(d,c))==0) continue;

else

if(meet(d,c)==-1)

{

出错

break;

}

}

}

meet(int c,char s) //进栈规约算法{

if(s==错误) return -1;

int m,k=0;

if(规约标志为1)

{

规约

return 1; //规约成功}

else

进栈

}

char Getsymbol() //词法分析算法

{

i=0;

while(sym!=结束)

{

if(sym==合法标识符的开头)

{

int h1=0,h2=0,h3=0;

while(sym==字母/数字/下划线)

{

保存sym到token[]中;

get(sym); //取下一字符

}

判断token[]中的字符串是否为关键字while/rop/op

if(是while)

return 'w'; //返回while给主程序else

if(是rop) return 'r'; //返回rop给主程序

else

if(是op) return 'o'; //返回op给主程序

else

return 'i';

} //已经取了下一个字符else

if(sym==数字)

{

while(sym==数字)

{

保存sym到token[]中;

get(sym); //取下一字符

}

return 'i'; //数字

}

else

if(sym=='(')

{

保存sym到token[]中;

get(sym); //取下一字符

return '(';

}

else

if(sym==')')

{

保存sym到token[]中;

get(sym); //取下一字符 return ')';

}

else

if(sym=='=')

{

保存sym到token[]中;

get(sym);

return '=';

}

else

if(sym==' ')

{

get(sym);

return ' ';

}

else

{

get(sym);

return 'X'; //错误

}

}

return 0;

}

7 软件的测试方法和测试结果

运行正确时的情况如下:

词法分析的结果保存在中:语法分析的过程保存在中:

四元式形式的中间代码输出在中:当文法分析出错时的情况如下:

相关主题
相关文档
最新文档