编译原理1.docx
《编译原理1.docx》由会员分享,可在线阅读,更多相关《编译原理1.docx(12页珍藏版)》请在冰豆网上搜索。
![编译原理1.docx](https://file1.bdocx.com/fileroot1/2023-1/3/b91c52d3-cc54-4010-b9a8-b5d24eab5fe9/b91c52d3-cc54-4010-b9a8-b5d24eab5fe91.gif)
编译原理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语言的运用。