1 / 56
文档名称:

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

格式:doc   页数:56
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

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

上传人:追风少年 2014/11/22 文件大小:0 KB

下载得到文件列表

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

文档介绍

文档介绍:编译原理课程设计报告
课题名称: C- Minus词法分析和语法分析设计



课程设计目标
实验建立C-编译器。只含有扫描程序(scanner)和语法分析(parser)部分。
分析与设计
C-编译器设计的整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分)。
、扫描程序scanner部分

设计思想:根据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语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套
说明:当输入的字符使DFA到达接受状态的时候,则可以确定一个单词了。初始状态设置为START,当需要得到下一个token时,取得次token的第一个字符,并且按照DFA与对此字符的类型分析,转换状态。重复此步骤,直到DONE为止,输出token类型。当字符为“/”时,状态转换为SLAH再判断下一个字符,如果为“*”MENT,最后以“*”MENT状态,表明是注释,如果其他的则是字符停滞于当前字符,并且输出“/”。

各文件或函数的设计说明
扫描程序用到:,
:声明词法状态,词法分析
//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,MA,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:

void Scanner :: scan():设置输出结果界面以及设置各种输出状态。
if(ess==false)
cout<<"词法分析出错!"<<endl;
else
cout<<"词法分析成功了!"<<endl;
printToken();/**/
//正在删除注释
void Scanner :: ments()