编译技术课程设计报告Word文件下载.docx

上传人:b****6 文档编号:17628562 上传时间:2022-12-07 格式:DOCX 页数:47 大小:109.85KB
下载 相关 举报
编译技术课程设计报告Word文件下载.docx_第1页
第1页 / 共47页
编译技术课程设计报告Word文件下载.docx_第2页
第2页 / 共47页
编译技术课程设计报告Word文件下载.docx_第3页
第3页 / 共47页
编译技术课程设计报告Word文件下载.docx_第4页
第4页 / 共47页
编译技术课程设计报告Word文件下载.docx_第5页
第5页 / 共47页
点击查看更多>>
下载资源
资源描述

编译技术课程设计报告Word文件下载.docx

《编译技术课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译技术课程设计报告Word文件下载.docx(47页珍藏版)》请在冰豆网上搜索。

编译技术课程设计报告Word文件下载.docx

1

2

3

4

5

6

7

8

9

10

11

12

13

14

$DIM

$IF

$DO

$STOP

$END

$ID

$INT

$ASSIGN

$PLUS

$STAR

$POWER

$COMMA

$LPAR

$RPAR

-

内部字符串

标准二进形式

对于这个小语言,有几点重要的限制:

首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。

所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。

例如,下面的写法是绝对禁止的:

IF(5)=x

其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。

也就是说,对于关键字不专设对应的转换图。

但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。

当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。

再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。

例如,一个条件语句应写为

 IFi>

0i=1;

而绝对不要写成

             IFi>

0i=1;

因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。

这个小语言的单词符号的状态转换图,如下图:

2.语法分析器能识别由加+减-乘*除/乘方^括号()操作数所组成的算术表达式,其文法如下:

E→E+T|E-T|T

T→T*F|T/F|F

F→P^F|P

p→(E)|i

使用的算法可以是:

预测分析法;

递归下降分析法;

算符优先分析法;

LR分析法等。

3.中间代码生成器产生上述算术表达式的中间代码(四元式序列)

较高要求:

1.扩充上述小语言的单词;

2.增加语法分析器的功能,能识别条件语句和循环语句等;

3.增加中间代码生成器的功能,能产生条件语句和循环语句等的中间代码(四元式序列)

4.增加报错功能;

5.将中间代码翻译成汇编语言。

三、实现过程说明

数据定义清单:

#defineACC-2

/************种别编码************/

#definesy_if0

#definesy_then1

#definesy_else2

#definesy_while3

#definesy_begin4

#definesy_do5

#definesy_end6

#definea7

#definesemicolon8

#definee9

#definejinghao10

#defineS11

#defineL12

#definetempsy15

#defineEA18/*Eand*/

#defineE019/*Eor*/

#defineplus34

#definetimes36

#definebecomes38

#defineop_and39

#defineop_or40

#defineop_not41

#definerop42

#definelparent48

#definerparent49

#defineident56

#defineintconst57

#defineminus58

#definediv59

#definechengfang60

/*********************************/

charch='

\0'

;

/*从字符缓冲区读取当前字符*/

intcount=0;

/*词法分析结果缓冲区计数器*/

staticcharspelling[10]={"

"

};

/*存放识别的字*/

staticcharline[81]={"

/*一行字符缓冲区,最多80个字符*/

char*pline;

/*字符缓冲区指针*/

staticcharntab1[100][10];

/*变量名表,共100项,每项长度10*/

structntab

{

inttc;

/*真值*/

intfc;

/*假值*/

}ntab2[200];

/*在布尔表达式E中保存有关布尔变量的真、假值*/

intlabel=0;

/*指向ntab2的指针*/

structrwords{/*存放临时变量的表的定义*/

charsp[10];

intsy;

};

/*(保留字表)匹配表的结构,用来与输入缓冲区中的单词进行匹配*/

/*匹配表初始化,大小为10*/

structrwordsreswords[10]={{"

if"

sy_if},

{"

do"

sy_do},

{"

else"

sy_else},

while"

sy_while},

then"

sy_then},

begin"

sy_begin},

end"

sy_end},

and"

op_and},

or"

op_or},

not"

op_not}};

structaa{

intsy1;

/*存放名字*/

intpos;

/*存放名字所对应的地址*/

}buf[1000],/*词法分析结果缓冲区*/

n,/*读取二元式的当前字符*/

n1,/*当前表达式中的字符*/

E,/*非终结符*/

sstack[100],/*算术或布尔表达式加工处理使用的符号栈*/

ibuf[100],/*算术或布尔表达式使用的缓冲区*/

stack[1000];

/*语法分析加工处理使用的符号栈*/

structaaoth;

/*四元式中空白位置*/

structfourexp{

charop[10];

structaaarg1;

structaaarg2;

intresult;

}fexp[200];

/*四元式的结构定义*/

intssp=0;

/*指向sstack栈指针*/

structaa*pbuf=buf;

/*指向词法分析缓冲区的指针*/

intnlength=0;

/*词法分析中记录单词的长度*/

intlnum=0;

/*源程序行数记数,源程序长度*/

inttt1=0;

/*变量名表指针*/

FILE*cfile;

/*源程序文件,~为结束符*/

intnewt=0;

/*临时变量计数器*/

intnxq=100;

/*nxq指向下一个形成的四元式的地址*/

/*每次执行gen()时,地址自动增1*/

intlr;

/*扫描LR分析表1过程中保存的当前状态值*/

intlr1;

/*扫描LR分析表2或表3所保存的当前状态值*/

intsp=0;

/*查找LR分析表时状态栈的栈顶指针*/

intstack1[100];

/*状态栈1的定义*/

intsp1=0;

/*状态栈1的栈顶指针*/

intnum=0;

/*算术或布尔表达式缓冲区指针*/

structll{

intnxq1;

/*记录下一条四元式的地址*/

inttc1;

/*真值链*/

intfc1;

/*假值链*/

}labelmark[10];

/*记录语句嵌套层次的数组,*/

/*即记录嵌套中每层的布尔表达式E的首地址*/

intlabeltemp[10];

/*记录语句嵌套层次的数组,*/

/*即记录每层else之前的四元式地址*/

intpointmark=-1,/*labelmark数组指针*/

pointtemp=-1;

/*labeltemp数组指针*/

intsign=0;

/*sign=1,为赋值语句;

sign=2,为布尔表达式。

*/

/**************程序语句LR分析表*********************/

staticintaction[19][13]=

/*0*/{{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,-1,-1},

/*1*/{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,ACC,-1,-1},

/*2*/{-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1},

/*3*/{-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1},

/*4*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,8},

/*5*/{-1,-1,104,-1,-1,-1,104,-1,104,-1,104,-1,-1,},

/*6*/{-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

/*7*/{-1,-1,-1,-1,-1,11,-1,-1,-1,-1,-1,-1,-1},

/*8*/{-1,-1,-1,-1,-1,-1,12,-1,-1,-1,-1,-1,-1},

/*9*/{-1,-1,-1,-1,-1,-1,105,-1,13,-1,-1,-1,-1},

/*10*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,14,-1},

/*11*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,15,-1},

/*12*/{-1,-1,103,-1,-1,-1,103,-1,103,-1,103,-1,-1},

/*13*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,16},

/*14*/{-1,-1,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

/*15*/{-1,-1,102,-1,-1,-1,102,-1,102,-1,102,-1,-1},

/*16*/{-1,-1,-1,-1,-1,-1,106,-1,-1,-1,-1,-1,-1},

/*17*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,18,-1},

/*18*/{-1,-1,101,-1,-1,-1,101,-1,101,-1,101,-1,-1}};

/**************算术表示式的LR分析表************************/

staticintaction1[16][10]=

/*0*/{{12,-1,-1,-1,-1,-1,14,-1,-1,1},

/*1*/{-1,2,3,4,5,6,-1,-1,ACC,-1},

/*2*/{12,-1,-1,-1,-1,-1,13,-1,-1,7},

/*3*/{12,-1,-1,-1,-1,-1,13,-1,-1,8},

/*4*/{12,-1,-1,-1,-1,-1,13,-1,-1,9},

/*5*/{12,-1,-1,-1,-1,-1,13,-1,-1,10},

/*6*/{12,-1,-1,-1,-1,-1,13,-1,-1,11},

/*7*/{-1,101,101,4,5,6,-1,101,101,-1},

/*8*/{-1,102,102,4,5,6,-1,102,102,-1},

/*9*/{-1,103,103,103,103,6,-1,103,103,-1},

/*10*/{-1,104,104,104,104,6,-1,104,104,-1},

/*11*/{-1,105,105,105,105,105,-1,105,105,-1},

/*12*/{-1,107,107,107,107,107,-1,107,107,-1},

/*13*/{12,-1,-1,-1,-1,-1,13,-1,-1,-14},

/*14*/{-1,2,3,4,5,6,-1,15,-1,-1},

/*15*/{-1,106,106,106,106,106,-1,106,106,-1}};

/*************布尔表示式的LR分析表********************/

staticintaction2[16][11]=

/*0*/{{1,-1,4,-1,5,-1,-1,-1,13,7,8},

/*1*/{-1,2,-1,101,-1,101,101,101,-1,-1,-1},

/*2*/{3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

/*3*/{-1,-1,-1,102,-1,102,102,102,-1,-1,-1},

/*4*/{1,-1,4,-1,5,-1,-1,-1,11,7,8},

/*5*/{1,-1,4,-1,5,-1,-1,-1,6,7,8},

/*6*/{-1,-1,-1,104,-1,9,10,104,-1,-1,-1},

/*7*/{1,-1,4,-1,5,-1,-1,-1,14,7,8},

/*8*/{1,-1,4,-1,5,-1,-1,-1,15,7,8},

/*9*/{105,-1,105,-1,105,-1,-1,-1,-1,-1,-1},

/*10*/{107,-1,107,-1,107,-1,-1,-1,-1,-1,-1},

/*11*/{-1,-1,-1,12,-1,9,10,-1,-1,-1,-1},

/*12*/{-1,-1,-1,103,-1,103,103,103,-1,-1,-1},

/*13*/{-1,-1,-1,-1,-1,9,10,ACC,-1,-1,-1},

/*14*/{-1,-1,-1,106,-1,9,10,106,-1,-1,-1},

/*15*/{-1,-1,-1,108,-1,9,10,108,-1,-1,-1}};

函数清单:

voidmain();

/*主程序*/

voidreadline();

/*从文件读一行到缓冲区*/

voidreadch();

/*从缓冲区读取一个字符*/

intfind(charspel[]);

/*标识符和关键字的识别*/

voididentifier();

/*字符串的识别*/

voidnumber();

/*数字的识别*/

voidscan();

/*扫描主函数*/

voidreadnu();

/*读取二元式的一个字符*/

intnewtemp();

/*中间变量的生成*/

intgen(charop1[],structaaarg11,structaaarg22,intresult1);

/*生成四元式*/

intmerg(intp1,intp2);

/*布尔表示式的匹配*/

voidlrparse1(intnum);

/*赋值语句的分析*/

intlrparse2(intnum);

/*布尔表达式的分析*/

inttest(intvalue);

/*测试字符是否为表达式中的值(不包括"

)*/

intlrparse();

/*程序语句处理*/

voiddisp1();

/*显示词法分析结果*/

voiddisp2();

/*四元式分析结果*/

voiddisp3();

/*变量名表显示*/

主要函数流程图:

主函数:

四、源程序清单

//ht.cpp:

定义控制台应用程序的入口点。

//

//小型编译程序:

高级语言到四元式的编译

#include"

stdio.h"

/*如果使用TC的话,需要配置头文件路径*/

string.h"

/************************/

/*指向词法分析缓冲区的指针*/

/*源程序行数记数,源程序长度*/

/*源程序文件,~为结束符*/

/*FILE*mfile;

intpointmark=-1,/*labelmark数组指针*/

pointtemp=-1;

/*1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1