C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx

上传人:b****9 文档编号:45648 上传时间:2022-10-01 格式:DOCX 页数:56 大小:175.25KB
下载 相关 举报
C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx_第1页
第1页 / 共56页
C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx_第2页
第2页 / 共56页
C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx_第3页
第3页 / 共56页
C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx_第4页
第4页 / 共56页
C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx_第5页
第5页 / 共56页
点击查看更多>>
下载资源
资源描述

C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx

《C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx》由会员分享,可在线阅读,更多相关《C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx(56页珍藏版)》请在冰豆网上搜索。

C-Minus词法分析和语法分析设计编译器编译原理课程设计.docx

编译原理课程设计报告

课题名称:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1