编译原理1.docx

上传人:b****5 文档编号:6104116 上传时间:2023-01-03 格式:DOCX 页数:12 大小:53.53KB
下载 相关 举报
编译原理1.docx_第1页
第1页 / 共12页
编译原理1.docx_第2页
第2页 / 共12页
编译原理1.docx_第3页
第3页 / 共12页
编译原理1.docx_第4页
第4页 / 共12页
编译原理1.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

编译原理1.docx

《编译原理1.docx》由会员分享,可在线阅读,更多相关《编译原理1.docx(12页珍藏版)》请在冰豆网上搜索。

编译原理1.docx

编译原理1

枣庄学院

计算机科学系课程设计任务书

 

题目:

简单编译器的实现与分析

 

学号:

200812110156

姓名:

张若男

专业:

计算机科学与技术

课程:

编译原理

指导教师:

王艳秋职称:

讲师

完成时间:

2010年12月----2010年12月

 

枣庄学院计算机科学系制

2010年12月20日

课程设计任务书及成绩评定

课程设计的任务和具体要求

任务:

是设计一个简单的编译器,将C语言的源程序翻译成等价的中间代码。

要求输入C语言写的源程序(以文件形式存储),首先经过词法分析,输出原程序分析后的二元式文件,供语法制导翻译用。

经过语法制导翻译将词法分析器产生的二元式翻译成等价的四元式形式,也就是中间代码的生成。

要求能进行正常的关键字如:

begin,end,if,else等的识别。

具体要求。

 

指导教师签字:

日期:

指导教师评语

 

成绩:

指导教师签字:

日期:

课程设计所需软件、硬件等

软件:

win-tcwindows系统

硬件:

电脑一台

 

课程设计进度计划

起至日期

工作内容

备注

2010年12月12号~2010年12月30号

初步设想、词法分析、语法分析、语义分析、代码生成、调试完善

参考文献、资料索引

序号

文献、资料名称

编著者

出版单位

1.编译原理陈火旺著国防工业出版社

2.

整体框架

 

一.词法分析:

包括两个类:

ClassCTokenizer:

从一个字符串中(这个把一个文件看作是一个字符串,MFC中CFile->CString)分离出一个一个token,配上简单的类型通过NextToken()返回:

#defineTT_EOL'\n'

#defineTT_EOF-1

#defineTT_INTEGER-2

#defineTT_REAL-3

#defineTT_WORD-4

#defineTT_STRING'"'

#defineTT_CHAR'\''

ClassCScaner:

得到具体的的token类型,定义TokenType如下:

enumTokenType

{

//reservedKeyword

_AUTO,_DOUBLE,_INT,_STRUCT,

_BREAK,_ELSE,_LONG,_SWITCH,

_CASE,_ENUM,_REGISTER,_TYPEDEF,

_CHAR,_EXTERN,_RETURN,_UNION,

_CONST,_FLOAT,_SHORT,_UNSIGNED,

_CONTINUE,_FOR,_SIGNED,_VOID,

_DEFAULT,_GOTO,_SIZEOF,_VOLATILE,

_DO,_IF,_STATIC,_WHILE,

_READ,_WRITE,_PRINTF,

//operations

ASSIGN,PLUS,MINUS,TIMES,DIV,MOD,

BITWISE_AND,BITWISE_OR,BITWISE_NOT,LOGICAL_NOT,LT,GT,

//interpunctions

LPARAN,RPARAN,LBRACE,RBRACE,LSQUARE,RSQUARE,COMMA,DOT,SEMI,COLON,

//complexoperations

EQ/*==*/,NEQ/*!

=*/,PLUS_PLUS/*++*/,MINUS_MINUS/*--*/,

PLUS_ASSIGN/*+=*/,MINUS_ASSIGN/*-=*/,TIMES_ASSIGN/**=*/,DIV_ASSIGN/*/=*/,

NGT/*<=*/,NLT/*>=*/,LOGICAL_AND/*&&*/,LOGICAL_OR/*||*/,

//others

_EOF,_ID,_NUM,_STRING,_CHARACTER,_LABEL,_ERROR,_NONE

};

CScaner通过一个CMapm_KeyIndex把CString的关键字和TokenType对应,便于查找和反向查找。

 

C关键字表:

auto

double

int

struct

break

else

long

switch

case

enum

register

typedef

char

extern

return

union

Const

float

short

unsigned

Continue

for

signed

void

Default

goto

sizeof

volatile

Do

if

static

while

标识符词法:

identifier:

nondigit

identifiernondigit

identifierdigit

nondigit:

oneof_

abcdefghijklmnopqrstuvwxyz

ABCDEFGHIJKLMNOPQRSTUVWXYZdigit:

oneof

0123456789

escape:

\n,\r,\b,\0-7

二.语法分析:

ClassCParser:

定义CTreeNode,和Tiny例程类似:

#defineMAX_CHILDREN3

classCTreeNode

{

public:

CTreeNode*child[MAX_CHILDREN];//pointtochildnode

CTreeNode*father;//pointtofathernode

CTreeNode*sibling;//pointtosiblingnode

intlineno;

NodeKindnodekind;

union{

StmtKindstmt;

ExpKindexp;

}kind;

enumTokenTypetype;

CStringszName;

CStringszScope;//nodefunctionscope

BOOLbArray;//isthisanarraydeclaration

intiArraySize;//arraysize

};

通过文法及相应规则建立语法树。

1.program->declaration_list

2.declaration_list->declaration_listdeclaration|declaration

3.declaration->var_declaration|fun_declaration

4.var_declaration->type_specifierID(,...)`;`|type_specifierID`[`NUM`]`(,...)`;`

5.type_specifier->`int`|`void`|`char`,actuallythisstepisindeclaration_list()

6.fun_declaration->type_specifierID`(`params`)`compound_stmt

7.params->param_list|`void`|empty,`void`isthoughtasempty

8.param_list->param_list`,`param|param

9.param->type_specifierID|type_specifierID`[``]`

10.compound_stmt->`{`loal_declarationsstatement_list`}`|expression_stmt

11.local_declarations->local_declarationsvar_declaration|var_declaration

12.`read``(`var`)``;`

13.`write``(`expression`)``;`

14.`printf``(``"`STRING`"``)``;`

15.expression_stmt->expression`;`|`;`

16.expression->var`=`expression|logic1_expression

17.logic1_expression->logic1_expression`||`logic2_expression|logic2_expression

18.logic2_expression->logic2_expression`&&`simple_expression|simple_expression

19.simple_expression->additive_expressionrelopadditive_expression|additive_expression

20.relop->`<=`|`<`|`>`|`>=`|`==`|`!

=`

21.additive_expression->additive_expressionaddopterm|term

22.addop->`+`|`-`

23.term->termmuloplogic3_expression|logic3_expression

24.mulop->`*`|`/`|`%`

25.logic3_expression->`!

`logic3_expression|factor

26.factor->`(`expression`)`|var|call|NUM

27.var->ID|ID`[`expression`]`

28.call->ID`(`args`)`

29.args->args_list|empty

30.args_list->args_list`,`expression|expression

31.sub_compoundstmt->ID`:

`|call`;`|expression_stmt

32.if_stmt->`if``(`expression`)`compound_stmt

|`if``(`expression`)`compound_stmt`else`compound_stmt

33.while_stmt->`while``(`expression`)`compound_stmt

34.for_stmt->`for``(`var`=`expression`;`expression`;`var`=`expression`)`compound_stmt

35.goto_stmt->`goto`ID`;`

36.break_stmt->`break``;`

37.continue_stmt->`continue``;`

38.return_stmt->`return``;`|`return`expression`;`

 

基本树形结构:

if语句:

 

while语句:

 

for循环语句:

 

复合语句:

 

支持的语句及运算:

1)数据类型:

int,charvoid,PCode里支持float

2)语句:

赋值(=),if,while,for,return,break,continue

3)数学运算:

+,-,*,/

4)关系运算:

==,>,<,>=,<=,!

=

5)逻辑运算:

&&,||,!

6)支持函数的定义、调用

7)支持复合语句

8)注释语句:

C类型的/**/和C++类型的//

三.建立符号表:

辅助类:

a)ClassLineListRec:

主要成员是lineno,记录某个Token(变量或函数名)声明或使用时的行数。

b)ClassBucketListRec:

主要成员变量:

CStringname;//variablename

CStringscope;//functionscope

enumTokenTypetype;

intmemloc;//memorylocationforvariable

BOOLbArray;//forarraychecking

LineListRec*lineno;

BucketListRec*next;

记录每一个变量或函数名的具体情况。

主要的类,建立符号表:

ClassCSymbolTable:

主要成员变量:

BucketListRec*hashTable[SIZE],把ClassBucketListRec类的对象通过hash函数找到位置后插入。

函数PrintSynbalTable(LPCTSTRlpszPathName),输入文件名,通过一个递归函数输出符号表到文件lpszPathName。

ClassCFunArgsCheck:

插入函数参数的类型,以备在下一个步骤中做匹配检测。

四.类型检测:

c)ClassCAnalyzer:

包括两个部分:

d)类型匹配:

函数或变量声明时检测是否已声明,如已声明则抛出错误;函数调用或变量使用时检测是否已声明,如未声明则抛出错误。

e)函数调用参数检测:

检测函数调用时传入参数的类型与函数声明时参数的类型是否匹配。

五.代码生成:

PCode:

支持的p-code语句:

lda取变量地址

lod取变量值

ldci取int类型常数

ldcf取float类型常数

ldcc取char类型常数

ldc取bool类型常数

fjp错误跳跃

tjp正确跳跃

ujp无条件跳跃

stn存储并保留值

sto存储不保留值

ind根据堆栈上的地址取值

ixa根据堆栈上的地址取地址

adiint类型加法

adrfloat类型加法

sbiint类型减法

sbrfloat类型减法

mpiint类型乘法

mprfloat类型乘法

dviint类型除法

dvrfloat类型除法

mod%运算

grt>运算

les<运算

geq>=运算

leq<=运算

equ==运算

not!

运算

neq!

=运算

and位与运算

or位或运算

mst标志函数调用的参数的开始

ent函数定义开始

ret函数返回

cup调用函数

lab标号

rdc从屏幕读取一个字符

rdi从屏幕读取一个整数

rdf从屏幕读取一个浮点数

wrc输出一个字符到屏幕

wri输出一个整数到屏幕

wrf输出一个浮点数到屏幕

部分p-code为自定义,没有解释器。

六.心得体会:

通过本次为期两周的课程设计,巩固和复习了编译原理的五大步,对程序的变异有了更进一步的了解。

同时也更加深了对C语言的运用。

 

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

当前位置:首页 > 求职职场 > 简历

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

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