1、C编译器设计文档CS0106 3011112192 陆晓春- 1 -C-编译器设计文档CS01063011112192陆晓春C编译器设计文档CS0106 3011112192 陆晓春- 2 -目 录 整体框架. 3 词法分析. 3 Class CTokenizer 3 Class CScaner. 3 C 关键字表. 4 标识符词法. 4 语法分析. 5 Class CParser . 5 Grammar . 5 基本树形结构 . 6 支持的语句及运算 . 7 建立符号表. 7 Class LineListRec . 7 Class BucketListRec . 7 Class CSymbo
2、lTable . 8 Class CFunArgsCheck . 8 类型检测 8 Class CAnalyzer . 8 类型匹配 8 函数调用参数检测 8 代码生成 8 PCode 8 80X86 ASM . 9 总结 9C编译器设计文档CS0106 3011112192 陆晓春- 3 - 整体框架: 词法分析:包括两个类: Class CTokenizer:从一个字符串中(这个把一个文件看作是一个字符串,MFC 中 CFile-CString)分离出一个一个 token,配上简单的类型通过 NextToken()返回:#define TT_EOL n#define TT_EOF -1#d
3、efine TT_INTEGER -2#define TT_REAL -3#define TT_WORD -4#define TT_STRING “#define TT_CHAR 输入文件开始词法分析语法分析建立符号表类型检查代码生成结束语法树符号表C编译器设计文档CS0106 3011112192 陆晓春- 4 - Class CScaner:得到具体的的 token 类型,定义 TokenType 如下:enum TokenType/ reserved Keyword_AUTO, _DOUBLE, _INT, _STRUCT,_BREAK, _ELSE, _LONG, _SWITCH, _
4、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_NO
5、T, LOGICAL_NOT, LT, GT,/ interpunctionsLPARAN, RPARAN, LBRACE, RBRACE, LSQUARE, RSQUARE, COMMA, DOT, SEMI, COLON,/ complex operationsEQ/* = */, NEQ/* != */, PLUS_PLUS/* + */, MINUS_MINUS/* - */,PLUS_ASSIGN/* += */, MINUS_ASSIGN/* -= */, TIMES_ASSIGN/* *= */, DIV_ASSIGN/* /= */,NGT/* = */, LOGICAL_AN
6、D/* CScaner 通过一个 CMap m_KeyIndex 把 CString 的关键字和 TokenType 对应,便于查找和反向查找。 C 关键字表:auto double int structbreak else long switchcase enum register typedefchar extern return unionConst float short unsignedContinue for signed voidDefault goto sizeof volatileDo if static whileC编译器设计文档CS0106 3011112192 陆晓春-
7、 5 - 标识符词法:identifier :nondigitidentifier nondigitidentifier digitnondigit : one of_ a b c d e f g h i j k l m n o p q r s t u v w x y zA B C D E F G H I J K L M N O P Q R S T U V W X Y Zdigit : one of0 1 2 3 4 5 6 7 8 9escape:n, r, b, 0-7 语法分析: Class CParser:定义 CTreeNode,和 Tiny 例程类似:#define MAX_CHI
8、LDREN 3class CTreeNodepublic:CTreeNode* child MAX_CHILDREN ; / point to child nodeCTreeNode* father; / point to father nodeCTreeNode* sibling; / point to sibling nodeint lineno;NodeKind nodekind;union StmtKind stmt;ExpKind exp; kind;enum TokenType type;CString szName;CString szScope; / node function
9、 scopeBOOL bArray; / is this an array declarationint iArraySize; / array size;通过文法及相应规则建立语法树。C编译器设计文档CS0106 3011112192 陆晓春- 6 - Grammar:1. program-declaration_list2. declaration_list-declaration_list declaration | declaration3. declaration-var_declaration | fun_declaration4. var_declaration-type_spe
10、cifier ID(, .); | type_specifier ID NUM (, .);5. type_specifier-int | void | char, actually this step is in declaration_list()6. fun_declaration-type_specifier ID ( params ) compound_stmt7. params-param_list | void | empty, void is thought as empty8. param_list-param_list , param | param9. param-typ
11、e_specifier ID | type_specifier ID 10. compound_stmt- loal_declarations statement_list | expression_stmt11. local_declarations-local_declarations var_declaration | var_declaration12. read ( var ) ;13. write ( expression ) ;14. printf ( “ STRING “ ) ;15. expression_stmt-expression ; | ;16. expression
12、-var = expression | logic1_expression17. logic1_expression-logic1_expression | logic2_expression | logic2_expression18. logic2_expression- logic2_expression | expression_stmt32. if_stmt-if ( expression ) compound_stmt| if ( expression ) compound_stmt else compound_stmt33. while_stmt-while ( expressi
13、on ) compound_stmt34. for_stmt-for ( var = expression ; expression ; var = expression ) compound_stmt35. goto_stmt-goto ID ;36. break_stmt-break ;37. continue_stmt-continue ;38. return_stmt-return ; | return expression ; 基本树形结构:C编译器设计文档CS0106 3011112192 陆晓春- 7 -if 语句: while 语句:for 循环语句:复合语句: 支持的语句及运
14、算:1) 数据类型:int,char void,PCode 里支持 float,在 80x86 ASM 里不支持2) 语句:赋值(=) ,if, while,for ,return,break,continue3) 数学运算:+,*,/4) 关系运算:= = ,=,运算les =运算leq =运算equ =运算not !运算neq !=运算and 位与运算or 位或运算mst 标志函数调用的参数的开始ent 函数定义开始ret 函数返回cup 调用函数lab 标号rdc 从屏幕读取一个字符rdi 从屏幕读取一个整数rdf 从屏幕读取一个浮点数wrc 输出一个字符到屏幕wri 输出一个整数到屏幕
15、wrf 输出一个浮点数到屏幕部分 p-code 为自定义,没有解释器。 80X86 ASM:支持 80x86 asm 代码,因此数据多位 16 位,但支持递归调用,使用较多伪操作,需要MASM 6.0 以上版本才能编译通过。 总结:这个程序使用了界面库 CJLIB6.0,自己修改了 CrystalView 的高亮显示方式,仿照C编译器设计文档CS0106 3011112192 陆晓春- 10 -emacs,代码生成先使用了 PCode,但因为苦于手中没有解释器,编写一个时间不够,所以后来又编写了 80x86 汇编代码的生成,有一定突破。自我认为整个程序界面比较友好,功能(基于所要求的)也计较完善。VC+源代码下载:http:/ END