logo资料库

C--Minus词法分析和语法分析设计.doc

第1页 / 共55页
第2页 / 共55页
第3页 / 共55页
第4页 / 共55页
第5页 / 共55页
第6页 / 共55页
第7页 / 共55页
第8页 / 共55页
资料共55页,剩余部分请下载后查看
编译原理课程设计报告
编译原理课程设计报告 课题名称: C- Minus 词法分析和语法分析设计 提交文档学生姓名: X X X 提交文档学生学号: XXXXXXXXXX 同组 成 员 名 单: 指导 教 师 姓 名: X X X X X 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间:2015 年 6 月 10 日 word 文档 可自由复制编辑
1. 课程设计目标 实验建立 C-编译器。只含有扫描程序(scanner)和语法分析(parser)部分。 2. 分析与设计 C-编译器设计的整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分)。 2.1 、扫描程序 scanner 部分 2.1.1 系统设计思想 设计思想:根据 DFA 图用 switch-case 结构实现状态转换。 惯用词法: word 文档 可自由复制编辑
1 语言的关键字:else if int return void while 2 专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */ 3 其他标记是 ID 和 NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 大写和小写字母是有区别的 4 空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开 ID、NUM 关键字。 5 注释用通常的 C 语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位 置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套 说明:当输入的字符使 DFA 到达接受状态的时候,则可以确定一个单词了。初始状态设置为 word 文档 可自由复制编辑
START,当需要得到下一个 token 时,取得次 token 的第一个字符,并且按照 DFA 与对此字 符的类型分析,转换状态。重复此步骤,直到 DONE 为止,输出 token 类型。当字符为“/” 时,状态转换为 SLAH 再判断下一个字符,如果为“*”则继续转到 INCOMMENT,最后以“*” 时转到 ENDCOMMENT 状态,表明是注释,如果其他的则是字符停滞于当前字符,并且输出“/”。 2.1.2 程序流程图 word 文档 可自由复制编辑
2.1.3 各文件或函数的设计说明 扫描程序用到:scanner.h,scanner.cpp  scanner.h:声明词法状态,词法分析 //DFA 中的状态 typedef enum { START = 1, INNUM, INID, INDBSYM, DONE } DFAState; //定义的 Token 的类型(31 种),分别对应于 else、if、int、return、void、while、+、 -、*、/、<、<=、>、>=、==、!=、=、;、,、(、)、[、]、{、}、/*、*/、num、id、错 误、结束 typedef enum { ELSE = 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 Token { TokenType tokenType; string tokenString; int lineNo; }; //每种 TokenType 对应的串,如 tokenTypeString[ELSE]=="ELSE" const string tokenTypeString[32] = {"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", "ERROR", "ENDFILE"}; class Scanner:定义 scanner.cpp 中函数  scanner.cpp 文件函数说明 void Scanner :: scan():设置输出结果界面以及设置各种输出状态。 word 文档 可自由复制编辑
if(scanSuccess==false) cout<<"词法分析出错!"<
output(gcd(x,y)); } 2.2、语法分析 parse 部分 2.2.1 系统设计思想 设计思想:parser 用递归下降分析方法实现,通过调用词法分析函数 getToken 实 现语法分析。 根据 C-语言的规则,得出 BNF 语法如下: 1.program->declaration-list 2.declaration-list->declaration-list declaration | declaration 3.declaration->var-declaration|fun-declaration 4.var-declaration->type-specifier ID;|type-specfier ID[NUM] 5.type-specifier->int|void 6.fun-specifier ID(parans) compound-stmt 7.params->params-list|void 8.param-list->param-list,param|param 9.param->type-specifier ID|type-specifier ID [] 10.compound-stmt->{local-declarations statement-list} 11.local-declarations->local-declarations var-declaration|empty 12.statement-list->statement-list statement|empty 13.statement->expression-stmt|compound-stmt|selection-stmt|iteration-s tmt|return-stmt 14.expression-stmt->expression;|; 15.selection-stmt->if(expression)statement|if(expression)statement else statement 16.iteration-stmt->while(expression)statement 17.return-stmt->return ;|return expression; 18.expression->var=expression|simple-expression 19.var->ID|ID[expression] 20.simple-expression->additive-expression relop additive-expression|additive-expression 21.relop-><=|<|>|>=|==|!= 22.additive-expression->additive-expression addop term|term 23.addop->+|- word 文档 可自由复制编辑
24.term->term mulop factor|factor 25.mulop->*|/ 26.factor->(expression)|var|call|NUM 27.call->ID(args) 28.args->arg-list|empty 29.arg-list->arg-list,expression|expression 2.1.2 语法分析程序流程图 2.1.3 各文件或函数的设计说明 语法分析程序包括:parser.cpp,parser.h  parser.cpp: Parser :: Parser()//界面设计 Token Parser :: getToken()//获取 scanner 中保存在 TokenList 数组中的 Token,并且 每次获取完之后数组下标指向下一个 void Parser :: syntaxError(string s)//出错处理 void Parser :: match(TokenType ex)//匹配出错 word 文档 可自由复制编辑
分享到:
收藏