编译原理课程设计报告
课题名称: 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 文档 可自由复制编辑