CMinus词法分析和语法分析设计编译器编译原理课程设计报告书

  • 格式:doc
  • 大小:656.00 KB
  • 文档页数:56

下载文档原格式

  / 56
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理课程设计报告

课题名称:C- Minus词法分析和语法分析设计

提交文档学生姓名:X X X

提交文档学生学号:XXXXXXXXXX

同组成员名单:X X X

指导教师姓名:X X

指导教师评阅成绩:

指导教师评阅意见:

.

.

提交报告时间:2015年6月10日

1.课程设计目标

实验建立C-编译器。只含有扫描程序(scanner)和语法分析(parser)部分。

2.分析与设计

C-编译器设计的整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分)。

2.1 、扫描程序scanner部分

2.1.1系统设计思想

设计思想:根据DFA图用switch-case结构实现状态转换。

惯用词法:

①语言的关键字:else if int return void while

②专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */

③其他标记是ID和NUM,通过下列正则表达式定义:

ID = letter letter*

NUM = digit digit*

letter = a|..|z|A|..|Z

digit = 0|..|9

大写和小写字母是有区别的

④空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM 关键字。

⑤注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套

scanner的DFA

说明:当输入的字符使DFA到达接受状态的时候,则可以确定一个单词了。初始状态设置为START,当需要得到下一个token时,取得次token的第一个字符,并且按照DFA与对此字符的类型分析,转换状态。重复此步骤,直到DONE为止,输出token类型。当字符为“/”时,状态转换为SLAH再判断下一个字符,如果为“*”则继续转到INCOMMENT,最后以“*”时转到ENDCOMMENT状态,表明是注释,如果其他的则是字符停滞于当前字符,并且输出“/”。

2.1.2程序流程图

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,COMM A,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():设置输出结果界面以及设置各种输出状态。

if(scanSuccess==false)

cout<<"词法分析出错!"<

else

cout<<"词法分析成功了!"<

printToken();/*输出Token到文件Token.txt中*/

//正在删除注释

void Scanner :: deleteComments()

TokenType Scanner :: returnTokenType(string s)//返回Token的类型

DFAState Scanner :: charType(char c)//返回字符的类型

typedef enum

{ 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。

/* A program to perform Eucild's

Algorithm to compute gcd. */

int gcd (int u, int v)

{

if (v==0)

return u;

else return

gcd(v,u-u/v*v); /* u-u/v*v== u mod v */

}

void main(void)

{

int x;

int y;

x=input();

y=input();

output(gcd(x,y));

}

2.2、语法分析parse部分

2.2.1系统设计思想