编译原理1Word文件下载.docx
《编译原理1Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理1Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
软件:
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通过一个CMap<
CString,LPCSTR,enumTokenType,enumTokenType>
m_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语言的运用。