了解编译程序中 LR分析表的作用以及语义加工程序的功能。

1.2实验要求

在掌握编译原理的基础上,对编译程序实例进行分析,通过编译程序的运行,检验编译程序输出结果的正确性。理论联系实际,将所学知识用到实处,进而学会怎么写编译程序。

1.3实验内容

1)验证下述程序输出结果的正确性:

while (a>b) do

begin

if m>=n then a:=a+1

while k=h do x:=x+2;

m:=n+x*(m+y)

end#~

2)自行设计一程序进行正确性验证,并按二元式序列的注释及状态栈STACK加工分析对应的符号栈内容。

实验 2 算数表达式的扩充

2.1实验目的

掌握 LR分析表的设计方法和语义加工程序的扩充。

2.2实验要求

参照表达式 LR分析表的设计方法,设计扩充后的算术表达式LR分析表,并对原语义加工程序进行修改,加入新添加的内容。

2.3实验内容

(1)算术表达式文法扩充如下:

E->E+E|E-E|E*E|E/E|(E)|i

试根据该文法添加单词 “-”,“/”的内部定义以及重新设计LR分析表,并修改语义加工程序,最后验证修改的结果。

(2)待验证程序:

begin

a:=a+b-c*d/e;

while a<c do

while b<d do

while d<e do

if a<e then m:=n else m:=q;

end#~

2.4算法设计

在实验一中已给出编译程序的全部代码,且能识别加、乘算数表达式。而本实验只需根据识别加、乘算数表达式的设计方法来对算数表达式进行扩充以实现对减、除算数表达式的识别及分析。

(1)添加关键字减、除运算符的种别代码

#define sub 35 /*  -  */

#define div 37 /*  /  */

(2)重新构造算数表达式的LR分析表

static int action1[14][9]={

{3,-1,-1,-1,-1,2,-1,-1,1},

{-1,4,10,5,11,-1,-1,ACC,-1},

{3,-1,-1,-1,-1,2,-1,-1,6},

{-1,104,104,104,104,-1,104,104,-1},

{3,-1,-1,-1,-1,2,-1,-1,7},

{3,-1,-1,-1,-1,2,-1,-1,8},

{-1,4,10,5,11,-1,9,-1,-1},

{-1,101,101,5,11,-1,101,101,-1},

{-1,102,102,102,102,-1,102,102,-1},

{-1,103,103,103,103,-1,103,103,-1},

{3,-1,-1,-1,-1,2,-1,-1,12},

{3,-1,-1,-1,-1,2,-1,-1,13},

{-1,105,105,5,11,-1,105,105,-1},

{-1,106,106,106,106,-1,106,106,-1}

(3)在扫描算法scan中增加对减、除运算符的识别

case '-':   buf[count].sy1=sub; /* - */

count++;

break;

case '/': buf[count].sy1=div; /* / */

count++;

break;

(4)实现对减、除算术表达式的规约

case 105: E.pos=newtemp();

gen("-",sstack[ssp-2],sstack[ssp],E.pos+100);

ssp=ssp-2;

sstack[ssp].sy1=tempsy;

sstack[ssp].pos=E.pos;

sp1=sp1-3;

break;

case 106: E.pos=newtemp();

gen("/",sstack[ssp-2],sstack[ssp],E.pos+100);

ssp=ssp-2;

sstack[ssp].sy1=tempsy;

sstack[ssp].pos=E.pos;

sp1=sp1-3;

break;

(5) 在测试字符是否是表达式中的值的 test算法中增加对减、除运算符的识别

case sub:

case div:

return 1;

default:

return 0;

实验 3 添加新的程序语句

3.1实验目的

通过添加新的程序语句,全面了解一个语句的编译程序设计过程。

3.2实验要求

对添加的语句设计 LR分析表及相应的处理程序,并将其添加到程序语句处理语句中。

3.3实验内容

(1)将计数循环for语句的功能添加到编译程序中。For语句的文法及每个产生式相应的语义子程序如下:

F1→for i:=E(1)   {GEN(:=,E(1).PLACE,_,ENTRY(i);

F1.PLACE:=ENTRY(i);

F1.CHAIN:=NXQ;

GEN(j,_,_,0);

F1·QUAD:=NXQ}

F2→F1 step E(2)  {F2.QUAD:=F1.QUAD;

F2.PLACE:=F1.PLACE;

GEN(+,F1.PLACE,E(2).PLACE,F1.PLACE);

BACKPATCH(F1.CHAIN,NXQ)}

F3→F2 until E(3)  {F3.QUAD:=F2.QUAD;

q:=NXQ;

GEN(j≤,F2.PLACE,E(3).PLACE,q+2);

F3.CHAIN:=NXQ;

GEN(j,_,_,0)}

S→F3 do S(1)      {先形成S(1)相应的四元式序列;

GEN(j,_,_,F3.QUAD);

BACKPATCH(S(1).CHAIN,F3.QUAD);

S.CHAIN:=F3.CHAIN}

(2)待验证程序:

begin

for a:=1 to 8 do

begin

if m>=n then a:=a-1

while k=h do x:=x+2;

m:=n+x/(m-y);

end#~

3.4实验说明

1)实现时可将for语句的文法设计为一个LR分析表,然后将该文法的开始符看作程序语句LR分析表中的一个终结符,即像赋值语句一样处理(当然仍要重新设计程序语句的LR分析表)。另一种方法就是直接将for语句的文法纳入到程序语句文法中(即像if和while语句一样处理),并重新设计程序语言的LR分析表。

2)for语句中产生式的语义动作需要参考编译程序中对if和while语句的处理部分做相应修改。

一、实验目的 通过编写和调试一个词法 分析 程序,掌握在对程序 设计 语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词构成的序列的词法 分析 方法。 二、基本实验内容与要求 假定一种高级程序 设计 语言中的单词主要包括关键字 begin、end、if、then、else、while、do;标识符;浮点常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法 分析 程序(各类单词的分类码可参见表1)。 输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。 输出:把所识别出 〖1.实验目的〗加深对词法 分析 器的工作过程的理解;加强对词法 分析 方法的掌握;能够采用一种编程语言实现简单的词法 分析 程序;能够使用自己编写的 分析 程序对简单的程序段进行词法 分析 。〖2.实验内容〗 类C语言的手工词法 分析 设计 〖3.实验要求〗(1)C语言子集(最好能对实际的C源代码进行词法 分析 ,从而省去样例 设计 )(2)一符一种(3)单字符单词(算符、界符)的种码等于其ASCII码,不必 设计 ; 关键字和双字符运算符,种码... (1) 编制一个语义 分析 程序 (2) 语义 分析 程序是在语法 分析 程序的基础上进行编写的,主要任务是根据语法 分析 来插入中间代码、语义规则以及生成四元式。 (3) 通过语义 分析 的练习,能够进一步了解 编译原理 。 (4) 通过了解语义 分析 程序的 设计 原则、语义规则的描述技术、识别机制及语... 语法 分析 一、实验目的算术表达式的文法可以是(你可以根据需要适当改变):E→E+E|E-E|E*E|E/E|(E)|i根据算符优先 分析 法,将表达式进行语法 分析 ,判断一个表达式是否正确。二、实验环境操作系统:windowxp编写环境:visualc++编写语言:c语言三、实验内容程序输入/输出示例:如参考C语言的运算符。输入如下表达式(以分号为结束)和输出结果:(1)10;输出:正确(2)1...