1、编译原理课程设计报告课题名称:C- Minus词法分析和语法分析设计1. 课程设计目标实验建立C-编译器。只含有扫描程序(scanner)和语法分析(parser)部分。2. 分析与设计C-编译器设计的整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分)。打开源代码文件source.txt扫描处理(词法分析)记号语法分析程序语法树语义分析程序错误处理器注释树记号表源代码优化程序文字表中间代码代码生成器目标代码目标代码优化程序目标代码2.1 、扫描程序scanner部分2.1.1 系统设计思想设计思想:根据DFA 图用switch-case结构实现状态转换。惯用词法: 语言的关键字:els
2、eifintreturnvoidwhile 专用符号:+-*/=!=;,()/*/ 其他标记是ID 和NUM,通过下列正则表达式定义: ID = letter letter*NUM = digit digit* letter = a|.|z|A|.|Z digit = 0|.|9大写和小写字母是有区别的 空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM 关键字。 注释用通常的C 语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套scanner的DFA+ - * = = != ; , ( )
3、INASSIGNWhite space t n,=,!digit=NUMotherdigitotherSTARTletterDONEletterother/INIDZHUother*/otherINCOMMENT*otherZZHU*说明:当输入的字符使DFA 到达接受状态的时候,则可以确定一个单词了。初始状态设置为START,当需要得到下一个token时,取得次token的第一个字符,并且按照DFA 与对此字符的类型分析,转换状态。重复此步骤,直到DONE为止,输出token类型。当字符为“/” 时,状态转换为SLAH再判断下一个字符,如果为“*”则继续转到INCOMMENT,最后以“*”
4、时转到ENDCOMMENT状态,表明是注释,如果其他的则是字符停滞于当前字符,并且输出“/”。2.1.2 程序流程图源文件读取源文件一行输出读取一个字符否是否到达终态是赋值token输出token2.1.3 各文件或函数的设计说明扫描程序用到:scanner.h,scanner.cpp scanner.h :声明词法状态,词法分析/DFA中的状态typedef enumSTART = 1, INNUM, INID, INDBSYM, DONE DFAState;/定义的Token的类型(31 种),分别对应于else、if、int、return、void、while、+、-、*、/、=、=、!
5、=、=、;、,、(、)、/*、*/、num、id、错误、结束typedef enumELSE = 1,IF,INT,RETURN,VOID,WHILE, PLUS,MINUS,TIMES,OVER,LT,LEQ,GT,GEQ,EQ,NEQ,ASSIGN,SEMI,COMMA,LPAREN,RPAREN, LMBRACKET,RMBRACKET,LBBRACKET,RBBRACKET,LCOMMENT,RCOMMENT, NUM,ID,ERROR,ENDFILE TokenType;/定义的Token结构体,包括类型、对应的串、所在代码的行号struct TokenTokenType token
6、Type; string tokenString; int lineNo;/每种 TokenType对应的串,如tokenTypeStringELSE=ELSEconst string tokenTypeString32 = OTHER, ELSE, IF, INT, RETURN, VOID,WHILE,PLUS,MINUS,TIMES,OVER,LT,LEQ,GT, GEQ,EQ,NEQ,ASSIGN,SEMI,COMMA,LPAREN,RPAREN,LMBRACKET,RMBRACKET,LBBRACKET, RBBRACKET, LCOMMENT, RCOMMENT, NUM, ID,
7、 ERROR, ENDFILE;class Scanner定: 义scanner.cpp中函数 scanner.cpp文件函数说明void Scanner : scan(:) 设置输出结果界面以及设置各种输出状态。 if(scanSuccess=false)cout词法分析出错!endl; elsecout词法分析成功了!endl;printToken();/输* 出Token到文件Token.txt中*/正在删除注释void Scanner : deleteComments()TokenType Scanner :returnTokenType(string s返)/回/Token的类型DF
8、AState Scanner :charType(char c)返/回字符的类型typedef enum ENDFILE,ERROR, IF,ELSE,INT,RETURN,VOID,WHILE,/关键字ID,NUM, ASSIGN,PLUS,MINUS,TIMES,OVER,EQ,UEQ,LT,LPAREN,RPAREN,SEMI,BT,LQ,BQ,DOU,LZGH,RZGH,LDGH,RDGH,/特殊字符:= + - * / = != declaration-list2. declaration-list-declaration-list declaration | declaration
9、 3.declaration-var-declaration|fun-declaration4.var-declaration-type-specifier ID;|type-specfier IDNUM 5.type-specifier-int|void6.fun-specifier ID(parans) compound-stmt 7.params-params-list|void8.param-list-param-list,param|param9.param-type-specifier ID|type-specifier ID pound-stmt-local-declaratio
10、ns statement-list11.local-declarations-local-declarations var-declaration|empty 12.statement-list-statement-list statement|empty13.statement-expression-stmt|compound-stmt|selection-stmt|iteration-s tmt|return-stmt14.expression-stmt-expression;|;15.selection-stmt-if(expression)statement|if(expression
11、)statement else statement16.iteration-stmt-while(expression)statement 17.return-stmt-return ;|return expression; 18.expression-var=expression|simple-expression 19.var-ID|IDexpression20.simple-expression-additive-expressionrelop additive-expression|additive-expression21.relop-=|=|=|!=22.additive-expr
12、ession-additive-expression addop term|term 23.addop-+|-24.term-term mulop factor|factor 25.mulop-*|/26.factor-(expression)|var|call|NUM 27.call-ID(args)28.args-arg-list|empty29.arg-list-arg-list,expression|expression2.1.2 语法分析程序流程图符号表文件获取终结符和非终结符构造文法分析表分析句型句子输出结果2.1.3 各文件或函数的设计说明语法分析程序包括:parser.cpp,
13、parser.h parser.cpp:Parser : Parser()/ 界面设计Token Parser : getToken()/获取scanner中保存在TokenList数组中的Token,并且每次获取完之后数组下标指向下一个void Parser : syntaxError(string s)出/错处理 void Parser : match(TokenType ex)匹/配出错TreeNode * Parser : declaration(void)类/型/ 匹配错误TreeNode * Parser : param_list(TreeNode * k)可/能k 是已经被取出来的VoidK,但又不是(void)类型的参数列表,所以一直传到par