C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx
- 文档编号:45648
- 上传时间:2022-10-01
- 格式:DOCX
- 页数:56
- 大小:175.25KB
C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx
《C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx》由会员分享,可在线阅读,更多相关《C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx(56页珍藏版)》请在冰豆网上搜索。
编译原理课程设计报告
课题名称:
C-Minus词法分析和语法分析设计
1.课程设计目标
实验建立C-编译器。
只含有扫描程序(scanner)和语法分析(parser)部分。
2.分析与设计
C-编译器设计的整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分)。
打开源代码文件
source.txt
扫描处理
(词法分析)
记号
语法分析程序
语法树
语义分析程序
错误处理器
注释树
记号表
源代码优化程序
文字表
中间代码
代码生成器
目标代码
目标代码优化程序
目标代码
2.1、扫描程序scanner部分
2.1.1系统设计思想
设计思想:
根据DFA图用switch-case结构实现状态转换。
惯用词法:
①语言的关键字:
else if int return void while
②专用符号:
+ - * / < <= > >= == !
= = ; , ( ) [ ] { } /*
*/
③其他标记是ID和NUM,通过下列正则表达式定义:
ID=letterletter*
NUM=digitdigit*letter=a|..|z|A|..|Zdigit=0|..|9
大写和小写字母是有区别的
④空格由空白、换行符和制表符组成。
空格通常被忽略,除了它必须分开ID、NUM关
键字。
⑤注释用通常的C语言符号/*...*/围起来。
注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。
注释不能嵌套
scanner的DFA
+-*<=>===!
=;,()[]{}
INASSIGN
Whitespace
\t
\n
>,<,=,!
digit
=
NUM
[other]
digit
[other]
START
letter
DONE
letter
[other]
/
INID
ZHU
[other]
*
/
[other]
INCOMMENT
*
[other]
ZZHU
*
说明:
当输入的字符使DFA到达接受状态的时候,则可以确定一个单词了。
初始状态设置为
START,当需要得到下一个token时,取得次token的第一个字符,并且按照DFA与对此字符的类型分析,转换状态。
重复此步骤,直到DONE为止,输出token类型。
当字符为“/”时,状态转换为SLAH再判断下一个字符,如果为“*”则继续转到INCOMMENT,最后以“*”时转到ENDCOMMENT状态,表明是注释,如果其他的则是字符停滞于当前字符,并且输出“/”。
2.1.2程序流程图
源文件
读取源文件一
行输出
读取一个字符
否
是否到达终态
是
赋值token
输出token
2.1.3各文件或函数的设计说明
扫描程序用到:
scanner.h,scanner.cpp
Øscanner.h:
声明词法状态,词法分析
//DFA中的状态typedefenum
{
START=1,INNUM,INID,INDBSYM,DONE
}DFAState;
//定义的Token的类型(31种),分别对应于else、if、int、return、void、while、+、
-、*、/、<、<=、>、>=、==、!
=、=、;、,、(、)、[、]、{、}、/*、*/、num、id、错误、结束
typedefenum
{
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结构体,包括类型、对应的串、所在代码的行号structToken
{
TokenTypetokenType;stringtokenString;intlineNo;
};
//每种TokenType对应的串,如tokenTypeString[ELSE]=="ELSE"
conststringtokenTypeString[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"};
classScanner定:
义scanner.cpp中函数
Øscanner.cpp文件函数说明
voidScanner:
:
scan(:
)设置输出结果界面以及设置各种输出状态。
if(scanSuccess==false)
cout<<"词法分析出错!
"< cout<<"词法分析成功了! "< printToken();/输*出Token到文件Token.txt中*/ //正在删除注释 voidScanner: : deleteComments() TokenTypeScanner: : returnTokenType(strings返)/回/Token的类型DFAStateScanner: : charType(charc)返//回字符的类型 typedefenum {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,//特殊字符: =+-*/==! =<等 } TokenType; 2.1.4测试程序说明 根据附录A后面的例子,程序输入两个整数,计算并打印出它们的最大公因子,保存为 a.txt。 /*AprogramtoperformEucild'sAlgorithmtocomputegcd.*/ intgcd(intu,intv) { if(v==0) returnu;elsereturn gcd(v,u-u/v*v);/*u-u/v*v==umodv*/ } voidmain(void) { intx;inty; x=input();y=input();output(gcd(x,y)); } 2.2、语法分析parse部分 2.2.1系统设计思想 设计思想: parser用递归下降分析方法实现,通过调用词法分析函数getToken实现语法分析。 根据C-语言的规则,得出BNF语法如下: 1.program->declaration-list 2.declaration-list->declaration-listdeclaration|declaration3.declaration->var-declaration|fun-declaration 4.var-declaration->type-specifierID;|type-specfierID[NUM]5.type-specifier->int|void 6.fun-specifierID(parans)compound-stmt7.params->params-list|void 8.param-list->param-list,param|param 9.param->type-specifierID|type-specifierID[]pound-stmt->{local-declarationsstatement-list} 11.local-declarations->local-declarationsvar-declaration|empty12.statement-list->statement-liststatement|empty 13.statement->expression-stmt|compound-stmt|selection-stmt|iteration-stmt|return-stmt 14.expression-stmt->expression;|; 15.selection-stmt->if(expression)statement|if(expression)statementelsestatement 16.iteration-stmt->while(expression)statement17.return-stmt->return;|returnexpression;18.expression->var=expression|simple-expression19.var->ID|ID[expression] 20.simple-expression->additive-expression relopadditive-expression|additive-expression 21.relop-><=|<|>|>=|==|! = 22.additive-expression->additive-expressionaddopterm|term23.addop->+|- 24.term->termmulopfactor|factor25.mulop->*|/ 26.factor->(expression)|var|call|NUM27.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()//界面设计 TokenParser: : getToken()//获取scanner中保存在TokenList数组中的Token,并且每次获取完之后数组下标指向下一个 voidParser: : syntaxError(strings)出//错处理voidParser: : match(TokenTypeex)匹//配出错 TreeNode*Parser: : declaration(void)类/型/匹配错误 TreeNode*Parser: : param_list(TreeNode*k)可//能k是已经被取出来的VoidK,但又不是(void)类型的参数列表,所以一直传到par
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Minus 词法 分析 语法分析 设计 编译器 编译 原理 课程设计