资源描述:
《c-编译器设计文档》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、C-编译器设计文档CS01063011112192陆晓春C-编译器设计文档CS01063011112192陆晓春-10-C-编译器设计文档CS01063011112192陆晓春目录Ø整体框架…………………………………………………………………………………….3Ø词法分析…………………………………………………………………………………….3üClassCTokenizer……………………………………………………………………3üClassCScaner………………………………………………………………………..3üC关键字表……………………………………………………………………………..4ü标识符词法
2、……………………………………………………………………………..4Ø语法分析……………………………………………………………………………………..5üClassCParser………………………………………………………………………..5üGrammar……………………………………………………………………………..5ü基本树形结构..……………………………………………………………………….6ü支持的语句及运算..………………………………………………………………….7Ø建立符号表………………………………………………………………………………….7üClassLineListRec……………………………
3、……………………………………..7üClassBucketListRec……………………………………………………………….7üClassCSymbolTable……………………………………………………………….8üClassCFunArgsCheck……………………………………………………………..8Ø类型检测……………………………………………………………………………………8üClassCAnalyzer..…………………………………………………………………..8ü类型匹配………………………………………………………………………………8ü函数调用参数检测…………………………………………………
4、…………………8Ø代码生成……………………………………………………………………………………8üPCode…………………………………………………………………………………8ü80X86ASM………………………………………………………………….……….9Ø总结…………………………………………………………………………………………9-10-C-编译器设计文档CS01063011112192陆晓春Ø整体框架:输入文件开始词法分析语法分析建立符号表类型检查代码生成结束语法树符号表Ø词法分析:包括两个类:üClassCTokenizer:从一个字符串中(这个把一个文件看作是一个字符串,MFC中CFile-
5、>CString)分离出一个一个token,配上简单的类型通过NextToken()返回:#defineTT_EOL''#defineTT_EOF-1#defineTT_INTEGER-2#defineTT_REAL-3#defineTT_WORD-4#defineTT_STRING'"'#defineTT_CHAR'''üClassCScaner:得到具体的的token类型,定义TokenType如下:enumTokenType-10-C-编译器设计文档CS01063011112192陆晓春{//reservedKeyword_AUTO,_DOUBLE,_INT,_STRUCT,_
6、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,//operationsASSIGN,PLUS,MINUS,TIMES,DIV,MOD,BITWISE_AND,BITWISE_OR,BITWISE_
7、NOT,LOGICAL_NOT,LT,GT,//interpunctionsLPARAN,RPARAN,LBRACE,RBRACE,LSQUARE,RSQUARE,COMMA,DOT,SEMI,COLON,//complexoperationsEQ/*==*/,NEQ/*!=*/,PLUS_PLUS/*++*/,MINUS_MINUS/*--*/,PLUS_ASSIGN/*+=*/,MINUS_ASSIGN/*-=*/,