C-Minus词法分析和语法分析设计编译器编译原理课程设计文档格式.docx
《C-Minus词法分析和语法分析设计编译器编译原理课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《C-Minus词法分析和语法分析设计编译器编译原理课程设计文档格式.docx(56页珍藏版)》请在冰豆网上搜索。
![C-Minus词法分析和语法分析设计编译器编译原理课程设计文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/4/d26cd765-c638-4819-af0c-87b315b84b71/d26cd765-c638-4819-af0c-87b315b84b711.gif)
语法分析程序
语法树
语义分析程序
注释树
源代码优化程序
中间代码
代码生成器
目标代码
目标代码优化程序
文字表
记号表
错误处理器
2.1、扫描程序scanner部分
2.1.1系统设计思想
设计思想:
根据DFA图用switch-case结构实现状态转换。
惯用词法:
1 语言的关键字:
else if int return void while
2 专用符号:
+ - * / <
<
= >
>
= == !
= = ;
, ( ) [ ] { }
/* */
3其他标记是ID和NUM,通过下列正则表达式定义:
ID=letterletter*NUM=digitdigit*letter=a|..|z|A|..|Zdigit=0|..|9
大写和小写字母是有区别的
4空格由空白、换行符和制表符组成。
空格通常被忽略,除了它必须分开
ID、NUM关键字。
5注释用通常的C语言符号/*...*/围起来。
注释可以放在任何空白出现
的位置(即注释不能放在标记内)上,且可以超过一行。
注释不能嵌套
scanner的DFA
+-*<
=>
===!
=;
()[]{}
INASSIGN
Whitespace
\t
\n
>
<
=,!
digit
=
NUM
[other]
START
letter
DONE
/ INID
SLAH
*
INCOMMENT
RETURN_INCO
ENDCOMMENT / MMENT
说明:
当输入的字符使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"
const string tokenTypeString[32] = {"
OTHER"
"
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<
<
词法分析出错!
endl;
else
词法分析成功了!
printToken();
/*输出Token到文件Token.txt中*/
//正在删除注释
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.*/
int gcd(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 relop additive-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语法分析程序流程图
符号表文件
获取终结符和
非终结符
构造文法分析
表
分析句型句子
输出结果
语法分析程序包括:
parser.cpp,parser.h
parser.cp