CMinus词法分析和语法分析设计编译器编译原理课程设计报告书
编译原理课程设计说明书--词法分析,语法分析,语义分析
编译原理课程设计说明书题目:编译器原型设计与开发院(系):计算机科学与工程学院专业:计算机科学与技术目录1 引言 (1)1.1 设计概述 (1)1.2 设计目标 (2)1.3 小组分工 (3)2 开发过程 (3)2.1 词法分析 (3)2.1.1 消除白空格以及注释 (3)2.1.2 词法分析 (6)2.2 .语法分析 (8)2.2.1 递归下降手工编码 (8)2.2.2 first集合的计算 (8)2.2.3 左递归消除 (9)2.2.4 selection表自动生成 (10)2.2.5 LL(1)手工编码 (11)2.3 语义分析 (11)2.3.1 表达式求值LR(1) (11)2.3.2 四元式 (13)3 测试过程 (14)4 总结 (19)5 参考文献 (20)6 代码附录 (20)1引言编译程序是现代计算机系统的基本组成部分之一,而且多数计算机系统都配有不止一个高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序。
从功能上看,一个编译程序就是一个语言翻译程序。
语言翻译程序把一种语言(称作源语言)书写的程序翻译成另一种语言(称作目标语言)的等价程序。
一个编译程序的重要性体现在它使得多数计算机用户不必考虑与机器有关的繁琐细节,使程序员和程序设计专家独立于机器,这对于当今机器的数量和种类持续不断地增长的年代尤为重要。
编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。
将编译过程划分成词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成六个阶段。
1.1设计概述编译原理程序结构框图词法分析词法分析是编译过程的第一个阶段。
这个阶段的任务是从左到右有一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。
这里所谓的单词是指逻辑上紧密相连的一组字符,这些字符基友具体含义。
比如标识符是由字母字符开头,后跟字母、数字字符的字符序列组成的一种单词。
编译原理课程设计-C-词法扫描器及语法分析器实现
编译原理课程设计报告课题名称: C-词法扫描器及语法分析器实现提交文档学生姓名:提交文档学生学号:同组成员名单:无指导教师姓名:金军指导教师评阅成绩:指导教师评阅意见:..提交报告时间:2014年 6月 xx日目录目录 (2)1 课程设计目标 (3)2 分析与设计 (4)2.1 程序结构 (4)3 程序代码实现 (8)3.1 代码结构 (8)3.2.1 globals.h (8)3.2.2 scan.c (10)3.2.3 parser.c (17)3.4 util.c (29)3.5 test.cpp (36)4 测试结果 (37)4.1.给出标准测试程序的词法和语法分析结果: (37)4.1.1 词法分析结果 (37)4.1.2 语法分析结果 (40)4.2.修改代码后的结果: (41)4.2.1修改 (41)5. 本课程设计我的独创工作 (43)6.总结 (43)1 课程设计目标学生在学习《编译原理》课程过程中,结合各章节的构造编译程序的基本理论,要求用C或C++语言描述及上机调试,实现一个C-Minus 小编译程序(包括词法分析,语法分析等重要子程序),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。
要求:(1)设计词法分析器设计各单词的状态转换图,并为不同的单词设计种别码。
将词法分析器设计成供语法分析器调用的子程序。
功能包括:a. 具备预处理功能。
将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;b. 能够拼出语言中的各个单词;c. 返回(种别码,属性值)。
(2)语法分析要求用学习过的自底向上或自顶向下的分析方法等,实现对表达式、各种说明语句、控制语句进行语法分析。
若语法正确,则用语法制导翻译法进行语义翻译;生成并打印出语法树;若语法错误,要求指出出错性质和出错位置(行号)。
2 分析与设计2.1 程序结构本程序采用C++语言以面向对象的思想编写,程序分为两部分:词法分析(Scanner)和语法分析(Parser)。
C-Minus词法分析报告四川大学编译原理
内层CASE判断getNextChar()获取的下一个字符使当前状态转换为其他状态。
关键代码分析
TokenType getToken(void)
} TokenType;
//定义状态类型
typedef enum { START,LBUFFER,RBUFFER,INCOMMENT,INNUM,INID,INEQ,INLE,INGE,INNEQ,DONE }StateType;
//结构定义
static struct
{ char *str;
TokenType tok;
}
实验结果截图
总结
词法分析程序的输出和输入:词法分析程序的功能是读入源程序,输出单词符号。单词符号是程序设计语言的本语法符号,程序设计语言的单词符号一般分为如下几种:关键字,标示符,常数,运算符,界符,单词的输出是二元式的形式,需要知道二元式的表示方法,把得到的二元式写入输出文件。
实验注意事项:
1.试验中在设计注释部分的解析时,因为C-Minus的注释符是四个字符组成,设计DFA时设计了两个中间态,用来判断状态转换;在代码中,如果由中间态转换为INCOMMENT状态,注意字符回退和save置false
currentToken=ENDFILE;
}
else
state=INCOMMENT;
break;
}
case INNUM:{
if(!isdigit(c))
{
ungetNextChar();
save=FALSE;
编译原理课程设计报告C语言词法与语法分析器的实现
编写原理课程设计报告题目:编译原理课程设计C语言词法和语法分析器的实现C-词法和语法分析器的实现1.课程设计目标(1)题目的实用性C语言具有完整语言的基本属性,写C语言的词法分析和语法分析对理解编译原理的相关理论和知识会起到很大的作用。
通过编写C语言词法和语法分析程序,可以对编译原理的相关知识:正则表达式、有限自动机、语法分析等有一个清晰的认识和掌握。
(2)C语言的词法描述①语言的关键词:else if int返回void while的所有关键字都是保留字,必须小写。
②特殊符号:+ - * / < <= > >= == != = ;, ( ) [ ] { } /* */③其他标记是ID和NUM,它们由以下正则表达式定义:ID =字母字母*NUM =数字数字*字母= a|..|z|A|..|Zdigit = 0|..|9注:ID表示标识符,NUM表示数字,letter表示字母,digit表示数字。
小写字母和大写字母是有区别的。
④它由空格、换行符和制表符组成。
空格通常会被忽略。
⑤用常用的C语言符号/*将注释括起来...*/.注释可以放在任何空白位置(也就是注释不能放在标记上),可以多行。
注释不能嵌套。
(3)规划目标能够正确分析程序的词法和语法。
2.分析和设计(1)设计理念a.词汇分析词法分析的实现主要使用有限自动机理论。
有限自动机可以用来描述识别输入字符串中模式的过程,因此也可以用来构造扫描程序。
词法分析器可以很容易地用有限自动机理论来设计。
b.语法分析语法分析采用递归下降分析法。
递归下降法是语法分析中最容易理解的方法。
其主要原理是根据每个非终结符的产生式结构为其构造相应的解析子程序,其中终结符生成匹配命令,非终结符生成过程调用命令。
这种方法被称为递归子例程下降法或递归下降法,因为语法递归的相应子例程也是递归的。
子程序的结构与产生式的结构几乎相同。
(2)程序流程图主程序流程图:词法分析:语法分析:词汇分析子流程图:语法分析子流程图:3.程序代码实现整个词法与语法程序设计在同一个项目中,包含八个文件,分别是main.cpp、parse.cpp、scan.cpp、util.cpp、scan.h、util.h、globals.h和parse.h,其中scan.cpp和scan.h是词法分析程序。
编译原理课程设计报告
编译原理课程设计报告课题名称: Lex C Minus词法分析器C Minus词法分析器Yacc C Minus 语法分析器C Minus语法分析器提交文档学生姓名:******提交文档学生学号:**********同组成员名单:无指导教师姓名:杨秋辉指导教师评阅成绩:指导教师评阅意见:..提交报告时间: 2012年 6 月 3 日1.课程设计目标本课程设计主要实现C Minus 的词法分析器和语法分析器,包括自动构造和手动构造分析器。
主要目标如下:1. lex 生成C Minus的词法分析器。
2. 手动构造C Minus的词法分析器,这里采用表驱动方式构造。
3. yacc生成C Minus的语法分析器。
4. 手动构造C Minus的语法分析器,文法为文件输入,这里采用LL(1)构造。
2.C Minus Lex 生成词法分析2.1在定义集中定义以下C Minus需要的符号digit [0-9]number {digit}+letter [a-zA-Z]identifier {letter}+newline \nwhitespace [ \t]+2.2在规则集中定义如下规则。
"if" {return IF;}"else" {return ELSE;}"int" {return INT;}"return" {return RETURN;}"void" {return VOID;}"while" {return WHILE;}"=" {return ASSIGN;}"==" {return EQ;}"!=" {return NEQ;}"<" {return LT;}"<=" {return LTEQ;}">" {return GT;}">=" {return GTEQ;}"," {return COMMA;}"[" {return LSQUARE;}"]" {return RSQUARE;}"{" {return LCURVE;}"}" {return RCURVE;}"+" {return PLUS;}"-" {return MINUS;}"*" {return TIMES;}"/" {return OVER;}"(" {return LPAREN;}")" {return RPAREN;}";" {return SEMI;}{number} {return NUM;}{identifier} {return ID;}{newline} {lineno++;}{whitespace} {/* skip whitespace */}/*对于注释,当程序读到/*时,一直往后读,知道碰到第一个*/进入终结状态,接受该注释,代码如下*/"/*" {char c;int done = FALSE;do{while((c = input()) != '*');while((c = input()) == '*');if(c == '/')done = TRUE;}while(!done);. {return ERROR;}2.3在辅助程序集中实现如下获取记号的函数,并将获取的记号打印到输出流中。
编译原理词法分析和语法分析报告+代码(C语言版)[1]
词法分析一、实验目的二、设计、编制并调试一个词法分析程序, 加深对词法分析原理的理解。
三、实验要求2.1 待分析的简单的词法(1)关键字:begin if then while do end所有的关键字都是小写。
(2)运算符和界符: = + - * / < <= <> > >= = ; ( ) #(3)其他单词是标识符(ID)和整型常数(SUM), 通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和换行符组成。
空格一般用来分隔ID.SUM、运算符、界符和关键字, 词法分析阶段通常被忽略。
2.2 各种单词符号对应的种别码:输入: 所给文法的源程序字符串。
输出: 二元组(syn,token或sum)构成的序列。
其中: syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。
例如: 对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件, 经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……三、词法分析程序的算法思想:算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号, 其基本思想是根据扫描到单词符号的第一个字符的种类, 拼出相应的单词符号。
3.1 主程序示意图:主程序示意图如图3-1所示。
其中初始包括以下两个方面:⑴关键字表的初值。
关键字作为特殊标识符处理, 把它们预先安排在一张表格中(称为关键字表), 当扫描程序识别出标识符时, 查关键字表。
如能查到匹配的单词, 则该单词为关键字, 否则为一般标识符。
关键字表为一个字符串数组, 其描述如下:Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,};图3-1(2)程序中需要用到的主要变量为syn,token和sum3.2 扫描子程序的算法思想:首先设置3个变量: ①token用来存放构成单词符号的字符串;②sum用来整型单词;③syn 用来存放单词符号的种别码。
C_minus语言词法分析器实验报告
编译原理实验报告 题目: C_minus语言词法分析器学 院 计算机科学与技术专 业 xxxxxxxxxxxxxxxx学 号 xxxxxxxxxxxx姓 名 xxxx装订线指导教师xxxx20xx年xx月xx日C_minus语言词法分析器一、实验目的1.理解词法分析器的设计方法:利用DFA编写相应的程序。
2.掌握手工编写词法分析程序的方法。
3.复习熟悉以前学过的编程语言4.通过实验了解编译器词法分析的工作原理二、实验原理1.文法的概念,DFA的表示方法。
2.词法分析程序的输出和输入:词法分析程序的功能是读入源程序,输出单词符号。
单词符号是程序设计语言的比本语法符号,程序设计语言的单词符号一般分为如下几种:关键字,标示符,常数,运算符,界符,单词的输出是二元式的形式,需要知道二元式的表示方法,把得到的二元式写入输出文件。
转化图如下:3.熟悉单词的描述工具,如正规文法,正规式,以及知道正规文法和正规式的等价性以及他们之间的互相转化。
熟悉把正规文法转化为正规式,把正规式转化为NFA以及把NFA 转为相应的DFA,最后再把DFA简化,DFA的状态转化为相应的子程序,最后得到词法分析器4.C语言的基本语法。
三、实验要求1、该个词法分析器要求至少能够识别以下几类单词:关键字:else if int return void while共6个,所有的关键字都是保留字,并且必须是小写;标识符:识别与C语言词法规定相一致的标识符,通过下列正则表达式定义:ID = letter (letter | digit)*;常数:NUM = digit digit*(.digit digit* |ε)(e(+ | - |ε) digit digit* |ε),letter = a|..|z|A|..|Z|,digit = 0|..|9,包括整数,如123等;小数,如123.45等;科学计数法表示的常数,如1.23e3,2.3e-9等;专用符号:+ - * / < <= > >= == != = , ( ) [ ] { } /* */;2、分析器的输入为由上述几类单词构成的程序,输出为该段程序的机表示形式,即关键字、运算符、界限符变为其对应的机符,常数使用二进制形式,标识符使用相应的标识符表指针表示。
C_minus语言词法分析器实验报告
编译原理实验报告
题目 : C_minus 语言词法分析器
装 订 线
学 院 计算机科学与技术 专 业 xxxxxxxxxxxxxxxx 学 号 xxxxxxxxxxxx 姓 名 xxxx 指导教师 xxxx
20xx 年 xx 月 xx 日
.
.
C_minus 语言词法分析器
一、实验目的
1. 理解词法分析器的设计方法:利用 DFA编写相应的程序。 2. 掌握手工编写词法分析程序的方法。 3. 复习熟悉以前学过的编程语言 4. 通过实验了解编译器词法分析的工作原理
四、实验结果(程序)及分析
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 100
typedef struct {
char name[30];
int code;
int addr;
}token;// 存储刚从文件中读取的字符
typedef struct {
h=0; } else{
h=1; break; } } if(h==0) break; } if(h==0) { current.code=key[i].code; output_1(); } else{ strcpy(symboltable[addr_count].name,); symboltable[addr_count].code=10; symboltable[addr_count].addr=addr_count;
isnumber(); else isOthers(); ch=fgetc(source); } fclose(source); fclose(keytxt); fclose(badgetxt); fclose(othertxt); fclose(number); } void iskeyword(){ int i=0,k=0,j=0; int h=0; while(((ch>='a') && (ch<='z')) ||((ch>='A') && (ch<='Z')) || ch=='_' || (ch> '0' && ch<'9')) { [i]=ch; i++; ch=fgetc(source); } zancun=current; for(i=0;i<6;i++) { for(j=0;j<30;j++) { if([j]==key[i].name[j]){
四川大学计算机学院-C-语言编译器-编译原理课程设计报告内附源码-递归下降-c-minus
编译原理课程设计报告课题名称: C-词法扫描器及语法分析器实现提交文档学生姓名: XXX提交文档学生学号: 0943041XXX同组成员名单:无指导教师姓名:张兵指导教师评阅成绩:指导教师评阅意见:..提交报告时间:2012年 6月 2日目录1 课程设计目标 (2)2 分析与设计 (2)2.1 程序结构 (2)2.2 程序流程 (3)3 词法分析 (4)3.1 代码结构分析 (4)3.2 Token定义 (4)3.2.1 Token的定义和类型 (4)3.2.2 Token的种别码 (5)3.3 DAF分析 (5)3.3.1 删除注释DFA (5)3.3.2 词法分析DFA (7)4 语法分析 (10)4.1 代码结构分析 (10)4.2 节点定义 (11)4.2.1 节点定义和类型 (11)4.2.2 各类型节点的描述 (11)4.3 递归向下语法分析 (12)4.3.1 C-文法 (12)4.3.2 递归向下分析过程 (13)5 测试结果 (30)5.1 流程 (30)5.2 词法分析结果 (31)5.3 词法分析出错 (34)5.4 语法分析结果 (34)5.5 语法分析出错 (36)6 总结 (36)6.1 词法分析编写过程 (36)6.2 语法分析编写过程 (36)6.3 成果和收获 (37)7 附录 (37)7.1 scanner.h源文件 (37)7.2 scanner.cpp源文件 (38)7.3 parser.h源文件 (47)7.4 parser.cpp源文件 (49)1 课程设计目标学生在学习《编译原理》课程过程中,结合各章节的构造编译程序的基本理论,要求用C或C++语言描述及上机调试,实现一个C-Minus 小编译程序(包括词法分析,语法分析等重要子程序),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。
要求:(1)设计词法分析器设计各单词的状态转换图,并为不同的单词设计种别码。
C-Minus词法分析和语法分析设计编译器编译原理课程设计
编译原理课程设计报告课题名称:C- Minus词法分析和语法分析设计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|..|Zdigit = 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.cppscanner.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():设置输出结果界面以及设置各种输出状态。
编译原理课程设计报告C-语言词法与语法分析器的实现
编译原理课程设计报告课题名称:编译原理课程设计C-语言词法与语法分析器的实现C-词法与语法分析器的实现1.课程设计目标(1)题目实用性C-语言拥有一个完整语言的基本属性,通过编写C-语言的词法分析和语法分析,对于理解编译原理的相关理论和知识有很大的作用。
通过编写C-语言词法和语法分析程序,能够对编译原理的相关知识:正则表达式、有限自动机、语法分析等有一个比较清晰的了解和掌握。
(2)C-语言的词法说明①语言的关键字:else if int return void while所有的关键字都是保留字,并且必须是小写。
②专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */③其他标记是ID和NUM,通过下列正则表达式定义:ID = letter letter*NUM = digit digit*letter = a|..|z|A|..|Zdigit = 0|..|9注:ID表示标识符,NUM表示数字,letter表示一个字母,digit表示一个数字。
小写和大写字母是有区别的。
④空格由空白、换行符和制表符组成。
空格通常被忽略。
⑤注释用通常的c语言符号/ * . . . * /围起来。
注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。
注释不能嵌套。
(3)程序设计目标能够对一个程序正确的进行词法及语法分析。
2.分析与设计(1)设计思想a.词法分析词法分析的实现主要利用有穷自动机理论。
有穷自动机可用作描述在输入串中识别模式的过程,因此也能用作构造扫描程序。
通过有穷自动机理论能够容易的设计出词法分析器。
b.语法分析语法分析采用递归下降分析。
递归下降法是语法分析中最易懂的一种方法。
它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。
因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。
C_minus语言词法分析器的设计
计算机学院编译原理实验报告年级2008级学号姓名成绩专业实验地点指导教师实验项目C_minus语言词法分析器的设计实验日期实验报告要求:一、实验目的设计编写并调试一个词法分析程序,能够完成读入源程序,输出单词符号的功能。
加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编写一个读单词的过程,从输入的源程序中识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符和界符五大类单词,并依次输出各个单词的内部编码及单词符号自身的值。
二、实验原理词法分析是编译的第一个阶段,他的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列用以语法分析,执行词法分析的程序即为词法分析程序,在程序中先判断这个语句中的每个单元为关键字、常数、运算符、界符,对不同的单词符号给出不同编码形式的编码用以区分之,识别出源程序中的单词并以二元式的形式输出。
三、实验要求1、该个词法分析器要求至少能够识别以下几类单词:a.关键字:else if int return void while共6个,所有的关键字都是保留字,并且必须是小写;b.标识符:识别与C语言词法规定相一致的标识符,通过下列正则表达式定义:ID = letter (letter | digit)*;c.常数:NUM = digit digit*(.digit digit* |ε)(e(+ | - |ε) digit digit* |ε),letter = a|..|z|A|..|Z|,digit = 0|..|9,包括整数,如123等。
d.专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */;2、分析器的输入为由上述几类单词构成的程序,输出为该段程序的机内表示形式,即关键字、运算符、界限符变为其对应的机内符,常数使用二进制形式,标识符使用相应的标识符表指针表示。
编译原理课程设计实验报告
编译原理课程设计实验报告实验目的:这个实验的目的是构造C minus语言的编译器,要求能够编译C minus语言的程序并且生成中间代码。
在实验的过程中,学会使用flex/bison这两个重要的工具。
实验内容:参见教材p491appendix A.设计一cminus 语言编译器语言介绍。
Decaf(cminus)语言的关键字:int while if else return void运算符:+ - * / > < = , . != { } [ ] <= >= == ()C minus语言的限制。
数字:支持10进制整数。
小数可以采用科学记数法,如1E3也是合法的。
字符串:字符串内部不允许出现换行,即字符串变量必须在同一行内。
注释:C minus语言允许采用/*…*/注释,并且注释不可以嵌套,即下面的注释是不合法的:/*This is /*a valid */comment*/程序流程图程序的流程参照了书本TINY 编译器的实例程序:语法分析器(Parser)调用词法分析器得到符合词法的字,建立语法树;符号表通过对语法树的分析,建立符号表,同时检查变量未定义等错误;类型检查包括检查表达式两边是否匹配,函数参数是否匹配等等;经由上述步骤而未出错的源程序被认为是合法程序,然后代码生成通过语法树和符号表生成P Code 中间代码,并将变量地址存入符号表。
其中类型检查和代码生成不要求实现。
本次实验要求分组,一组五人,一人完成一个部分。
本组实验分组成员以及分工介绍:汪晨风:(设计并实现cminus 符号表);E02620105蔡其星:(编写cminus.l文件,并用lex工具生成c代码);E02620107赵婷:(设计cminus 语法树结构);E02620106马培良:编写cminus.y 文件,并用yacc 工具生成可执行代码);E02620121丘廷:(进行程序的测试)以下为具体实验分步报告以及过程:第一部分:设计cminus符号表符号表是编译器中的主要继承属性,并且在语法树之后,形成了主要的数据结构。
编译技术课程设计报告-词法分析、语法分析、中间代码生成
编译技术课程设计班级学号姓名指导老师年月目录一、目的------------------------------------------------------------------------------------------ 2二、任务及要求---------------------------------------------------------------------------------2三、实验环境------------------------------------------------------------------------------------ 4四、实现过程说明------------------------------------------------------------------------------ 41.词法分析器 ------------------------------------------------------------------------------4(1)单词符号表------------------------------------------------------------------------ 4(2)数据结构--------------------------------------------------------------------------- 5(3)函数说明--------------------------------------------------------------------------- 5(4)流程图------------------------------------------------------------------------------ 62.语法分析器------------------------------------------------------------------------------6(1)分析方法说明--------------------------------------------------------------------- 6(2)文法--------------------------------------------------------------------------------- 6(3)数据结构--------------------------------------------------------------------------- 7(4)函数说明--------------------------------------------------------------------------- 73.中间代码生成器------------------------------------------------------------------------ 10(1)属性文法-------------------------------------------------------------------------- 10 (2)数据结构-------------------------------------------------------------------------- 11 (3)函数说明-------------------------------------------------------------------------- 11 (4)流程图------------------------------------------------------------------------------ 11五、程序运行结果------------------------------------------------------------------------------ 12六、总结------------------------------------------------------------------------------------------ 16一、目的<<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。
编译原理课程实验报告(词法分析器及语法分析器)
编译原理实验报告班级:软件0501班学号:**********姓名:***词法分析器与语法分析器I. 问题描述设计、编制并调试一个词法分析子程序,完成识别语言单词的任务;设计、编制、调试一个语法分析程序,并用它对词法分析程序所提供的单词序列进行语法检查和结构分析。
ii. 设计简要描述界面需求:为了更加形象的模拟过程,此实验使用图形界面。
要求从图形界面上输入输入串,点击词法分析,可以将词法分析后识别的单词符号显示,点击语法分析,可以将语法分析的堆栈过程显示,并且显示结果(是否是符合文法的句子),清空则可以将所有置空。
功能分析:1、由用户输入输入串;2、用户点击“词法分析”,可以将词法分析后识别的单词符号显示。
3、用户点击语法分析,可以将语法分析的堆栈过程显示,并且显示结果(是否是符合文法的句子)4、用户点击清空,则将界面所有组件置为空思路描述:一、设计构想:本实验决定编写一个简易C语言的词法分析器和语法分析器。
使其能够识别while,if等关键字,可以判断赋值语句、条件语句、循环语句。
二、文法分析1、需要识别的关键字及其识别码有:关键字识别码关键字识别码关键字识别码main 0 - 11 ;22int 1 * 12 > 23char 2 / 13 < 24if 3 ( 14 >= 25else 4 ) 15 <= 26for 5 [ 16 == 27while 6 ] 17 != 28ID 7 { 18 ERROR -1NUM 8 } 19= 9 , 20+ 10 : 212、文法〈程序〉→ mai n()〈语句块〉〈语句块〉→{〈语句串〉}〈语句串〉→〈语句〉;〈语句串〉|〈语句〉;〈语句〉→〈赋值语句〉|〈条件语句〉|〈循环语句〉〈赋值语句〉→ ID =〈表达式〉;〈条件语句〉→ if〈条件〉〈语句块〉〈循环语句〉→ while〈条件〉〈语句块〉〈条件〉→(〈表达式〉〈关系符〉〈表达式〉)〈表达式〉→〈表达式〉〈运算符〉〈表达式〉|(〈表达式〉)|ID|NUM〈运算符〉→+|-|*|/〈关系符〉→<|<=|>|>=|=|!>转化为符号表示:S→ main() K|空K→ { C }C→Y;C |空Y→F | T | XF→ ID = BT→ if J KX→ while J KJ→( B G B )B→ B Z B |( B )| ID | NUMZ→ + | - | * | /G→< | <= | > | >= | == | !>表示含义:S:程序 K:语句块 C:语句串 Y:语句 F :赋值语句T:条件语句 X:循环语句 J:条件 B:表达式 I:项 Z :运算符G:关系符3、LL(1)分析表(1),求出first集及follow集:FIRST(S)={mian}FIRST(K)={{}FIRST(C)= FIRST(Y)= {ID,if,while,空};FIRST(Y)= FIRST(F)+ FIRST(T)+ FIRST(X)={ID,if,while};FIRST(F)={ID};FIRST(T)={if};FIRST(X)={while};FIRST(J)= FIRST(B)={};FIRST(B)={(,ID,NUM };FIRST(Z)={+,-,*,/}FIRST(G)={<,<= ,>,>=,==,!= };FOLLO W(S)={#};FOLLO W(K)={;};FOLLO W(C)={}};FOLLO W(Y)={;}FOLLO W(F)={;};FOLLO W(T)={;};FOLLO W(X)={;};FOLLO W(J)={{,;};FOLLO W(B)={+,-,*,/,),<,<= ,>,>=,==,!=,;};FOLLO W(B’)={+,-,*,/,),<,<= ,>,>=,==,!=,;};FOLLO W(Z)={(,ID,NUM };FOLLO W(G)={(,ID,NUM };(2)消除左递归,拆分文法关系并编号0、S→ 空1、S→ main() K2、K→ { C }3、C→Y;C4、C→空5、Y→ F6、Y→ T7、Y→ X8、F→ ID = B9、T→ if J K10、X→ while J K11、J→( B G B )12、 B→( B )B'13、B→ ID B'14、B→ NUM B'15、B'→ BZB B'16、B'→空17、Z→ +18、Z→ -19、Z→ *20、Z→ /21、 G→ <22、 G→ <=23、 G→ >24、 G→ >=25、 G→ ==26、 G→ !=(3)构造LL (1)分析表(注:在表中用上一步的编号表示所需要的产生式)iii. 详细设计描述 项目构架:各函数功能介绍:main 空 () { } ; = if while ID num + - * / < <= > >= == != # S 10 K 2 C 4 4 3 3 3 Y 6 7 5 F 8 T 9 X10 J11 B1213 14B '16 15 16 16 15 15 16 16 16 16 16 16 16 16 16 16 Z 17 18 19 20G21 22 232425261、word.wordList包(存储了关键字):word:此类是定义了存储关键字的结构:包括String型的关键字,和int型的识别符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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|..|Zdigit = 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<<"词法分析出错!"<<endl;elsecout<<"词法分析成功了!"<<endl;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'sAlgorithm to compute gcd. */int gcd (int u, int v){if (v==0)return u;else returngcd(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系统设计思想设计思想:parser用递归下降分析方法实现,通过调用词法分析函数getToken实现语法分析。
根据C-语言的规则,得出BNF语法如下:1.program->declaration-list2.declaration-list->declaration-list declaration | declaration3.declaration->var-declaration|fun-declaration4.var-declaration->type-specifier ID;|type-specfier ID[NUM]5.type-specifier->int|void6.fun-specifier ID(parans) compound-stmt7.params->params-list|void8.param-list->param-list,param|param9.param->type-specifier ID|type-specifier ID []pound-stmt->{local-declarations statement-list}11.local-declarations->local-declarations var-declaration|empty12.statement-list->statement-list statement|empty13.statement->expression-stmt|compound-stmt|selection-stmt|iteration-stmt|return-stmt14.expression-stmt->expression;|;15.selection-stmt->if(expression)statement|if(expression)statement elsestatement16.iteration-stmt->while(expression)statement17.return-stmt->return ;|return expression;18.expression->var=expression|simple-expression19.var->ID|ID[expression]20.simple-expression->additive-expression relopadditive-expression|additive-expression21.relop-><=|<|>|>=|==|!=22.additive-expression->additive-expression addop term|term23.addop->+|-24.term->term mulop factor|factor25.mulop->*|/26.factor->(expression)|var|call|NUM27.call->ID(args)28.args->arg-list|empty29.arg-list->arg-list,expression|expression2.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)//匹配出错TreeNode * Parser :: declaration(void)//类型匹配错误TreeNode * Parser :: param_list(TreeNode * k)//k可能是已经被取出来的VoidK,但又不是(void)类型的参数列表,所以一直传到param中去,作为其一个子节点➢parse.h:对parse.c的函数声明//19种节点类型,分别表示int、id、void、数值、变量声明、数组声明、函数声明、函数声明参数列表、函数声明参数、复合语句体、if、while、return、赋值、运算、数组元素、函数调用、函数调用参数列表、未知节点typedef enum {IntK, IdK, VoidK, ConstK, Var_DeclK, Arry_DeclK, FunK, ParamsK, ParamK, CompK, Selection_StmtK, Iteration_StmtK, Return_StmtK, AssignK, OpK, Arry_ElemK, CallK, ArgsK, UnkownK} Nodekind;typedef enum {Void,Integer} ExpType;ofstream fout_Tree("tokenTree.txt");//输出语法树到文件//treeNode定义包括子节点、兄弟节点、所处行号、节点类型、属性、表达式返回类型typedef struct treeNodeTreeNode * newNode(Nodekind k);//根据节点类型新建节点TreeNode * declaration_list(void);TreeNode * declaration(void);TreeNode * params(void);TreeNode * param_list(TreeNode * k);TreeNode * param(TreeNode * k);TreeNode * compound_stmt(void);TreeNode * local_declaration(void);TreeNode * statement_list(void);TreeNode * statement(void);TreeNode * expression_stmt(void);TreeNode * selection_stmt(void);TreeNode * iteration_stmt(void);TreeNode * return_stmt(void);TreeNode * expression(void);TreeNode * var(void);TreeNode * simple_expression(TreeNode * k);TreeNode * additive_expression(TreeNode * k);TreeNode * term(TreeNode * k);TreeNode * factor(TreeNode * k);TreeNode * call(TreeNode * k);TreeNode * args(void);2.1.4 测试程序说明根据附录A后面的例子,程序输入两个整数,计算并打印出它们的最大公因子,保存为a.txt。