C-编译器设计报告

合集下载

C语言编译器前端的设计与实现 实训报告

C语言编译器前端的设计与实现  实训报告
-1-
第 1 章 绪论
1.1 C 语言及编译器概述
C 语言是在 70 年代初问世的。一九七八年由美国电话电报公司(AT&T)贝尔实验室正式 发表了 C 语言。同时由 B.W.Kernighan 和 D.M.Ritchit 合著了著名的“THE C PROGRAMMING LANGUAGE”一书。通常简称为《K&R》,也有人称之为《K&R》标准。但是,在《K&R》中并 没有定义一个完整的标准 C 语言,后来由美国国家标准学会在此基础上制定了一个 C 语言 标准,于一九八三年发表。通常称之为 ANSI C。C 语言是一种结构化语言。它层次清晰, 便于按模块化方式组织程序,易于调试和维护。C 语言的表现能力和处理能力极强。它不仅 具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的 物理地址,进行位(bit)一级的操作。由于 C 语言实现了对硬件的编程操作,因此 C 语言集 高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。 此外,C 语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上, 从而形成了多种版本的 C 语言。
2.3.1 自顶向下的语法分析...........................................................................................5 2.3.2 自底向上的语法分析...........................................................................................5 2.4 语义分析.........................................................................................................................6 2.5 符号表.............................................................................................................................6 2.6 类型检查.........................................................................................................................7 第 3 章 系统详细设计..................................................................................................................8 3.1 系统设计基本思路.........................................................................................................8 3.2 词法分析模块设计.........................................................................................................8 3.3 语法分析模块设计.......................................................................................................11 3.4 语义分析模块设计.......................................................................................................14 第 4 章 结束语............................................................................................................................16 参考文献...................................................................................................................................... 16 附录: 附录 1:词法分析核心代码............................................................................................17 附录 2:语法分析核心代码............................................................................................18

编译原理课程设计C-语言编译器

编译原理课程设计C-语言编译器

编译原理课程设计报告课题名称: C-语言编译器设计提交文档学生姓名:李杰提交文档学生学号:0743041240同组成员名单:无指导教师姓名:金军N不指导教师评阅意见:..提交报告时间: 2010年 6 月 10日1.课程设计目标实验建立C-编译器。

只含有scanner和parser部分。

2.分析与设计(1)实现方法:编程语言为C语言。

编程方法:scanner部分根据DFA图用switch-case结构实现状态转换;parser部分用递归下降分析方法实现。

(2)扫描器:C-惯用的词法1、语言的关键字:else if int return void while2、专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */3、其他标记是ID和NUM,通过下列正则表达式定义:ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|94、空格由空白、换行符和制表符组成。

空格通常被忽略,除了它必须分开ID、NUM关键字。

5. 注释用通常的C语言符号/ * . . . * /围起来。

注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。

注释不能嵌套各单词的状态转换图(DFA图如下)词法结构见文件"globals.h"中。

(3)分析器:分析树结构见文件"globals.h"中。

C-的BNF语法如下:(4)代码设计说明:程序结构:语法分析函数parse通过调用词法分析函数getToken实现语法分析。

文件和函数的设计说明:文件main.c包含相应头文件,及main函数的实现;文件golbals.h 包含符号表和分析数的数据结构及在其它文件中使用的变量;文件util.h 和util.c实现与词法分析和语法分析输出相关的函数printToken和printTree,以及分析树节点初始化相关的函数newStmtNode,newExpNode(Expkind)和copyString;文件scan.h 和scan.c实现词法分析,主要函数为getToken;文件parse.h 和parse.c实现语法分析,函数为与文法规则对应的函数。

编译器实验报告

编译器实验报告

编译器实验报告编译器实验报告引言编译器是计算机科学中的重要组成部分,它将高级语言代码转换为机器语言代码,使计算机能够理解和执行人类可读的指令。

在本次实验中,我们将设计和实现一个简单的编译器,以加深对编译原理和计算机体系结构的理解。

一、背景知识1.1 编译器的基本原理编译器主要由两个阶段组成:前端和后端。

前端负责将源代码转换为中间代码,后端则将中间代码转换为目标机器代码。

1.2 词法分析词法分析是编译器的第一个阶段,它将源代码分解为一个个词法单元,如标识符、关键字、运算符等。

词法分析器通过正则表达式和有限自动机来实现。

1.3 语法分析语法分析是编译器的第二个阶段,它将词法单元按照语法规则组织成语法树。

语法分析器通常使用上下文无关文法和递归下降分析来实现。

二、实验设计2.1 实验目标本次实验的目标是设计一个简单的编译器,能够将一种自定义的高级语言转换为目标机器代码。

我们选取了一种类C语言的语法作为实验对象。

2.2 实验流程首先,我们需要编写词法分析器,将源代码分解为词法单元。

然后,我们使用语法分析器将词法单元组织成语法树。

接下来,我们需要进行语义分析,检查代码是否符合语义规则。

最后,我们将中间代码转换为目标机器代码。

三、实验过程3.1 词法分析在词法分析阶段,我们使用正则表达式和有限自动机来实现词法分析器。

我们定义了一系列正则表达式来匹配不同的词法单元,如标识符、关键字、运算符等。

通过扫描源代码,词法分析器能够将源代码分解为一个个词法单元。

3.2 语法分析在语法分析阶段,我们使用上下文无关文法和递归下降分析来实现语法分析器。

我们定义了一系列文法规则来描述语法结构,如函数声明、条件语句、循环语句等。

语法分析器能够将词法单元组织成语法树。

3.3 语义分析在语义分析阶段,我们检查代码是否符合语义规则。

例如,我们检查变量是否声明过、函数是否调用正确等。

如果发现错误,我们将生成错误信息并终止编译过程。

3.4 代码生成在代码生成阶段,我们将中间代码转换为目标机器代码。

扬大课程设计报告-C语言子集编译器

扬大课程设计报告-C语言子集编译器

扬州大学编译原理课程设计题目C语言子集编译器班级学号姓名成绩扬州大学信息工程学院一、课程设计目的通过编译原理课程设计,加深对课堂中所讲授的内容的理解,设计一个具有词法分析、语法、语义分析、错误处理的综合程序。

进一步掌握编译程序常用实现的方法和技术,使学生初步具有研究、设计、编制和调试编译程序的能力。

二、课程设计题目实现一个简单的编译器三课程设计要求1.实现一个C语言子集或Pascal语言子集的编译器,工具任选。

2.要求实现的功能:翻译 +,-,*, / 四则运算表达式及布尔表达式,翻译包含if语句,while语句及do-while语句及相互间的嵌套。

四、课程设计语言及选用工具选用语言:Java工具 Eclipse五、课程设计方法1,本课程设计的数据结构设计过程中用到的栈:static Vector<String>DataStack = new Vector<String>(); 输入流栈static Vector<String>targetAnaStack = new Vector<String>(); 输入备份栈static Vector<String>AnalysStack = new Vector<String>(); 分析栈static Vector<String>KeyWordStack = new Vector<String>(); 保留字栈static Vector<String>JiexanStack = new Vector<String>(); 界限符栈static Vector<String>YunsuanfuStack = new Vector<String>(); 运算符栈中间代码的构造:包括标号,符号,第一操作数,第二操作数,和目的操作数class midCode {String sign;String op1;String op2;LoopLastLocation p1;}class LoopLastLocation { //每一个目的操作数都联系着一个对应的跳转标号String LastLocation;Int BiaoHao;}总体构成:跳转标号(操作符,第一操作数,第二操作数,目的操作数或者跳转标号)2,器主要分为四个部分:词法分析、语法分析、中间代码生成和目标代码生成。

(完整版)c实验报告

(完整版)c实验报告

(完整版)c实验报告实验名称: C语言实验报告实验内容:本次实验主要针对C语言编程进行实验。

通过实验的设计和完成,检验和加深对C语言的理解和应用能力。

实验步骤:1. 实验准备在开始实验之前,需要准备好以下必要的工具和材料:- 计算机- C语言编译器(比如GCC、Clang等)- 文本编辑器(比如Notepad++、Sublime Text等)2. 实验环境搭建在计算机上安装C语言编译器,并配置好相应的环境变量。

这样可以在终端或命令提示符中执行相关的C程序。

3. 编写实验代码根据实验要求,使用文本编辑器编写C语言代码。

根据实验的要求和功能需求,合理设计和组织代码结构,包括头文件的引用、变量的定义、函数的声明和定义等。

4. 编译和运行代码在命令行或终端中使用编译器对编写好的C语言代码进行编译,并生成可执行文件。

编译命令的具体格式根据不同的编译器而有所差异,但一般形式如下:```gcc -o output_file input_file.c```其中,"output_file"表示生成的可执行文件名,"input_file.c"表示待编译的C源代码文件名。

编译成功后,通过命令行或终端执行生成的可执行文件,检查程序的运行结果是否符合预期。

5. 实验结果分析根据实际运行结果,对实验数据进行分析和归纳。

可以通过输出结果、打印特定信息或观察程序的行为来判断程序是否正确地实现了预期的功能。

6. 实验总结在实验报告中对本次实验的过程、方法、结果进行总结,并提出实验中遇到的问题和解决方法。

同时,对所学习的C语言相关知识点进行总结和归纳,以加深对相关知识的理解和记忆。

实验结果:通过本次实验的设计和实现,我成功完成了对C语言编程的实验,达到了预期的目标。

通过编写实际的代码,我巩固了对C语言语法和基本概念的理解。

在实验过程中,我遇到了一些问题,通过查阅资料和与同学的讨论,我成功解决了这些问题。

编译原理课程设计C编译器词法分析与语法分析的实现

编译原理课程设计C编译器词法分析与语法分析的实现

编译原理课程设计报告课落款称: C-编译器词法分析与语法分析的实现提交文档学生姓名:黄臻旸提交文档学生学号: 1043041227 同组成员名单:无指导教师姓名:金军指导教师评阅成绩:指导教师评阅意见:..提交报告时刻:2021年 6 月 5 日编译原理课程设计报告 (1)一、课程设计目标 (3)二、分析与设计 (3)2.一、说明所用的方式: (3)2.二、系统总图: (3)2.2.一、scanner部份: (3)2.2.二、parse部份: (5)2.2.3、代码设计说明 (7)3、程序代码实现 (10)3.一、获取输入部份(在main.c中): (10)3.二、词法分析部份(在scan.c中): (10)3.3、语法分析部份(在parse.c中): (15)3.4、输出与结点的成立(在util.c中) (29)3.五、TokenType、treeNode与结点类型的声明(在globals.h中) (35)4、测试结果 (36)五、总结 (40)5.一、收成 (43)5.二、不足 (43)一、课程设计目标本次实验,本C- 编译器要紧设计而且实现了C- 编译器的词法分析功能与语法分析功能。

二、分析与设计2.一、说明所用的方式:各部份的实现方式(scanner:手工实现、Lex;parser:递归下降、LL(1)、LR(0)、SLR(1)、2.二、系统总图:2.2.一、scanner部份:2.2.1.一、实验原理:扫描程序的任务是从源代码中读取字符并形成由编译器的以后部份(一般是分析程序)处置的逻辑单元。

由扫描程序生成的逻辑单元称作记号(token),将字符组合成记号与在一个英语句子中将字母将字母组成单词并确信单次的含义很相像。

在此程序中,我将记号分成了以下类型:typedef enum {ENDFILE,ERROR,IF,ELSE,INT,RETURN,VOID,WHILE,ID,NUM,ASSIGN,PLUS,MINUS,TIMES,OVER,L T,LET,BT,BET,EQ,NEQ,// = + - * / < <= > >= == !=LPAREN_1,RP AREN_1,SEMI,COM,LPAREN_2,RP AREN_2,LPAREN_3,RP AREN_3,LIN,RIN// { } ; , [ ] ( ) /*} TokenType;其中,关键字有:else、if、int、return、void、while;专用符号有:+、-、*、/、<、<=、>、>=、==、~=、=、;、,、(、)、[、]、{、}、/*、*/其他标记是ID、NUM,通过以下正那么表达式概念:ID = letter letter*NUM = digit digit*letter = a|..|z|A|..|Zdigit = 0|..|9小写大写字母是有区别的。

编译原理课程设计报告 编译器

编译原理课程设计报告 编译器

《编译技术》课程设计实验报告实验名称:编译器程序说明:下载请好评姓名:向难学号:200812110106班级:计算机系08本一班2010年11月12日目录一、课设要求 (3)二、总体设计思想 (4)三、详细算法设计 (4)四、流程框图 (5)五、函数相关说明 (9)1. 所有函数一览 (9)2. void emit(char *res,char *num1,char *op,char *num2) (9)3. char *newTemp() (10)4. int merge(int p1,int p2) (10)5. void backpatch(int p,int t) (11)6. void fuzhi() (11)7. void tiaojian(int *nChain) (12)8. void xunhuan() (13)六、程序运行结果 (15)七、编译器使用说明 (17)八、心得与体会 (17)九、源程序清单 (18)一、课设要求用C语言对下述文法和单词表定义的语言设计编制一个编译器。

(1)单词符号及种别表(2)语法结构定义<程序> ::= main()<语句块><语句块> ::= ‘{‘<语句串>’}’//程序用括号括起来<语句串>::=<语句>{;<语句>};<语句>::=<赋值语句>|<条件语句>|<循环语句><赋值语句>::=ID=<表达式> //赋值语句用”=”号<条件语句>::=if<条件><语句块> //条件怎么没有括号,囧(自己加1个)<循环语句>::=do <语句块>while <条件><条件>::=<表达式><关系运算符><表达式> //没有布尔运算,还算简单<表达式> ::= <项>{ +<项>|-<项>}<项> ::= <因子>{*<因子>|/<因子>}<因子> ::=ID|num|(<表达式>)num::=( +|-|ε) 数字*(.数字数字* | ε)( e ( +|-|ε) 数字数字*|ε)ID::=字母(字母|d数字)*字母::=a|b|c…|z|A|B|C…|Z数字::=0|1|2…|9<关系运算符> ::= <|<=|>|>=|==|!=二、总体设计思想采用递归下降(自上而下)的语法制导翻译法。

编译器_实验报告

编译器_实验报告

一、实验目的1. 理解编译器的基本原理和设计方法。

2. 掌握编译器各个阶段的功能和实现方法。

3. 通过实际编程,加深对编译器原理的理解。

二、实验环境1. 操作系统:Windows 102. 编程语言:C/C++3. 开发工具:Visual Studio 2019三、实验内容本次实验主要完成一个简单的编译器,该编译器包含词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段。

四、实验步骤1. 词法分析:- 定义单词类型,如标识符、关键字、运算符、常数等。

- 实现词法分析器,读取源代码,将其分解为一个个单词。

2. 语法分析:- 定义语法规则,构建语法分析器。

- 实现语法分析器,对单词序列进行语法分析,生成抽象语法树(AST)。

3. 语义分析:- 遍历AST,进行语义检查,如类型检查、作用域检查等。

- 生成中间代码,如三地址代码。

4. 代码优化:- 对中间代码进行优化,提高代码执行效率。

- 优化策略包括:常数折叠、循环优化、死代码消除等。

5. 目标代码生成:- 将优化后的中间代码转换为机器代码。

- 生成目标程序,如汇编代码。

五、实验结果1. 词法分析:- 成功识别出标识符、关键字、运算符、常数等单词类型。

- 输出单词序列,供语法分析器使用。

2. 语法分析:- 成功生成抽象语法树(AST)。

- AST结构清晰,便于后续处理。

3. 语义分析:- 成功进行语义检查,如类型检查、作用域检查等。

- 生成中间代码,供代码优化和目标代码生成使用。

4. 代码优化:- 对中间代码进行优化,提高代码执行效率。

- 优化效果明显,如减少了循环的次数、消除了死代码等。

5. 目标代码生成:- 成功生成汇编代码。

- 汇编代码结构清晰,便于后续翻译成机器代码。

六、实验总结1. 通过本次实验,我们深入了解了编译器的基本原理和设计方法。

2. 实验过程中,我们掌握了编译器各个阶段的功能和实现方法。

3. 实验成果表明,所编写的编译器能够对源代码进行词法分析、语法分析、语义分析、代码优化和目标代码生成等处理。

C语言实现的编译器设计

C语言实现的编译器设计

C语言实现的编译器设计编译器是将高级语言(如C语言)代码转换为机器语言或者其他形式的可执行代码的软件工具。

它是软件开发过程中不可或缺的一部分。

在本文中,将介绍C语言实现的编译器设计,并探讨其中的技术原理和实现步骤。

一、引言编译器是一种非常复杂的软件工具,它可以将高级语言代码转换为机器语言。

C语言作为一种广泛应用于软件开发的编程语言,其编译器的设计和实现至关重要。

本文将从编译器设计的角度来介绍C语言编译器的基本原理和实现方法。

二、编译器的基本原理编译器的设计基于以下三个基本原理:词法分析、语法分析和语义分析。

词法分析器负责将源代码转换为单词流或者记号流,语法分析器负责将单词流或者记号流转换为语法树,而语义分析器则负责对语法树进行语义分析。

1. 词法分析词法分析器负责读取源代码的字符流,将其转换为单词流或者记号流。

在C语言中,单词可以是关键字、标识符、常数或者运算符等等。

词法分析器通过正则表达式和有限自动机来识别每个单词,并生成相应的记号。

2. 语法分析语法分析器负责对单词流或者记号流进行分析,并将其转换为语法树。

语法树是由语法规则定义的一种树状结构,用于表示程序的语法结构。

在C语言中,语法规则包括函数定义、语句块、条件语句等等。

语法分析器使用上下文无关文法和递归下降分析等技术来构建语法树。

3. 语义分析语义分析器负责对语法树进行语义分析。

它检查语法树中的每个节点,并对其进行类型推导、类型检查等操作。

语义分析器还负责生成中间代码或者目标代码,并进行一些优化操作。

三、C语言编译器的实现步骤C语言编译器的实现可以分为以下几个步骤:词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化。

1. 词法分析词法分析的目标是将源代码转换为单词流或者记号流。

为了实现词法分析,需要定义C语言的词法规则,并使用正则表达式和有限自动机技术进行单词识别。

词法分析器还负责跳过注释和处理预处理指令等操作。

2. 语法分析语法分析的目标是将单词流或者记号流转换为语法树。

编译原理c语言编译器的设计与实现

编译原理c语言编译器的设计与实现

经编译程序运行后得到的输出结果如下:
1〕词法分析得出的相应的名字的号码和他的值2〕列举程序中所有的变量
3〕状态栈的移进-归约过程1.
4〕最后产生的四元式中间代码
一、实验总结:
通过此次实验,让我知道了词法分析的功能是输出把它组织成单个程序,让我理解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;对语法规那么有明确的定义;编写的分析程序可以进展正确的语法分析;对于遇到的语法错误,可以做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程;实验报告要求用文法的形式对语法定义做出详细说明,说明语法分析程序的工作过程,说明错误处理的实现。

通过该实验的操作,我理解编译原理课程兼有很强的理论性和理论性,是计算机专业的一门非常重要的专业根底课程,它在系统软件中占有非常重要的地位,是计算机专业学生的一门主修课。

为了让学生可以更好地掌握编译原理的根本理论和编译程序构造的根本方法和技巧,融会贯穿本课程所学专业理论知识,进步他们的软件设计才能,。

c语言子集编译器实验报告书

c语言子集编译器实验报告书

c语言子集编译器实验报告书C语言子集编译器实验报告书一、引言编译器是一种将高级语言代码转换为机器语言代码的工具。

本报告旨在介绍我们设计和实现的C语言子集编译器。

该编译器可以接受符合C语言子集语法规范的源代码,并将其转换为目标机器的可执行文件。

本报告将详细介绍编译器的设计思路、实现过程和测试结果。

二、设计思路我们的编译器主要分为四个阶段:词法分析、语法分析、语义分析和代码生成。

首先,词法分析器将源代码分解为一个个的词法单元,如关键字、标识符、运算符等。

然后,语法分析器将词法单元按照语法规则进行组合,构建出抽象语法树。

接下来,语义分析器对抽象语法树进行语义检查,确保源代码的合法性。

最后,代码生成器将抽象语法树翻译成目标机器的汇编代码,并生成可执行文件。

三、实现过程1.词法分析词法分析器采用有限状态自动机的方式进行实现。

它读取源代码字符流,并根据预定义的正则表达式规则逐个识别出词法单元。

识别出的词法单元被作为输入传递给语法分析器。

2.语法分析语法分析器采用递归下降的方式进行实现。

它根据C语言子集的语法规则,逐步展开抽象语法树的各个节点。

在展开的过程中,语法分析器将词法单元与语法规则进行匹配,确保源代码的语法正确性。

3.语义分析语义分析器在语法分析的基础上,进一步检查源代码的语义错误。

它通过符号表来管理变量和函数的声明和引用,并进行类型检查和作用域检查等。

如果发现语义错误,语义分析器将报告错误信息,并中断编译过程。

4.代码生成代码生成器根据语义分析器生成的抽象语法树,将其翻译成目标机器的汇编代码。

它会为每个变量分配内存空间,并生成相应的加载和存储指令。

最后,代码生成器将生成的汇编代码输出到一个文件中,并调用目标机器的汇编器和链接器生成可执行文件。

四、测试结果为验证编译器的正确性和性能,我们设计了一系列测试用例,涵盖了C语言子集的各种语法和语义规则。

经过测试,编译器能够正确处理各种情况下的源代码,并生成符合预期的可执行文件。

编译原理课程设计报告C

编译原理课程设计报告C

编译原理课程设计报告C编译原理课程设计报告课题名称:编译原理课程设计C-语言词法与语法分析器的实现提交文档学生姓名:提交文档学生学号:同组成员名单:指导教师姓名:指导教师评阅成绩:指导教师评阅意见:. .提交报告时间:年月日C-词法与语法分析器的实现1.课程设计目标题目实用性C-语言拥有一个完整语言的基本属性,通过编写C-语言的词法分析和语法分析,对于理解编译原理的相关理论和知识有很大的作用。

通过编写C-语言词法和语法分析程序,能够对编译原理的相关知识:正则表达式、有限自动机、语法分析等有一个比较清晰的了解和掌握。

C-语言的词法说明①语言的关键字:else if int return void while 所有的关键字都是保留字,并且必须是小写。

②专用符号:+ - * / >= == != = ; , ( ) [ ]{ } /* */ ③其他标记是ID和NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9注:ID表示标识符,NUM表示数字,letter表示一个字母,digit表示一个数字。

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

④空格空白、换行符和制表符组成。

空格通常被忽略。

⑤注释用通常的c语言符号/ * . . . * /围起来。

注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。

注释不能嵌套。

程序设计目标能够对一个程序正确的进行词法及语法分析。

2.分析与设计设计思想a. 词法分析词法分析的实现主要利用有穷自动机理论。

有穷自动机可用作描述在输入串中识别模式的过程,因此也能用作构造扫描程序。

通过有穷自动机理论能够容易的设计出词法分析器。

b. 语法分析语法分析采用递归下降分析。

递归下降法是语法分析中最易懂的一种方法。

它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。

四川大学计算机学院-C-语言编译器-编译原理课程设计报告内附源码-递归下降-c-minus

四川大学计算机学院-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语言编译器设计和实现-精选文档

C语言编译器设计和实现-精选文档

• 因此,掌握这一技术具有非常重大的实际意义。
相关环境
软件环境
• VC2019
硬件环境
• CPU:Intel Core I5 • 操作系统:Windows7
相关理论
• 编译原理
形式语言理论
词法分析 语法分析 语义分析 中间代码生成
使用技术
标准C++实现 保存不同信息的数据结构 大量算法
开发步骤
语法分析--LR(1)
• 2)求项目集闭包,需要用到第1步中的结 果 。闭包利用集合的唯一性,故使用C++标准 STL库中的set模板。利用一个三元式存储标 识一个产生式:
struct item_node
{
size_t cfg_no;
//产生式编号
size_tdot_pos; //加点位置
intpossible_prefix; //输入符号
# … ai
a i1

#
分析表 总控程序 控制机构
r4
Sn
xn
……
S1
x1
S0
#
语法分析--LR(1)
• 语法分析采用LR分析器,由于分析表数据量 庞大,采用程序自动算出。
• 1)求非终结符的first集。为方便以后访问, 求完所有非终结符的first集后将它放在一个 以非终结符为键的hash表中。
查保留字表
N 查名字表 生成属性字
查到?
Y
生成属性字
写到输出流
N 是否分析结束
Y 结束
语法分析
• 自顶向下
• LL(1) • 递归下降
• 自底向上
• LR(0) • SLR(1) • LR(1) • LALR(1)

一个简单的编译器设计和分析

一个简单的编译器设计和分析

《编译技术》课程设计实验报告实验名称:编译器程序目录一、课设要求 (2)二、总体设计思想 (3)三、详细算法设计 (3)四、流程框图 (4)五、函数相关说明 (8)1. 所有函数一览 (8)2. void emit(char *res,char *num1,char *op,char *num2) (8)3. char *newTemp() (9)4. int merge(int p1,int p2) (9)5. void backpatch(int p,int t) (10)6. void fuzhi() (10)7. void tiaojian(int *nChain) (11)8. void xunhuan() (12)六、程序运行结果 (14)七、编译器使用说明 (16)八、心得与体会 (16)九、源程序清单 (17)一、课设要求用C语言对下述文法和单词表定义的语言设计编制一个编译器。

(1)单词符号及种别表(2)语法结构定义<程序> ::= main()<语句块><语句块> ::= ‘{‘<语句串>’}’//程序用括号括起来<语句串>::=<语句>{;<语句>};<语句>::=<赋值语句>|<条件语句>|<循环语句><赋值语句>::=ID=<表达式> //赋值语句用”=”号<条件语句>::=if<条件><语句块> //条件怎么没有括号,囧(自己加1个)<循环语句>::=do <语句块>while <条件><条件>::=<表达式><关系运算符><表达式> //没有布尔运算,还算简单<表达式> ::= <项>{ +<项>|-<项>}<项> ::= <因子>{*<因子>|/<因子>}<因子> ::=ID|num|(<表达式>)num::=( +|-|ε) 数字*(.数字数字* | ε)( e ( +|-|ε) 数字数字*|ε)ID::=字母(字母|d数字)*字母::=a|b|c…|z|A|B|C…|Z数字::=0|1|2…|9<关系运算符> ::= <|<=|>|>=|==|!=二、总体设计思想采用递归下降(自上而下)的语法制导翻译法。

c语言子集编译器实验报告书 -回复

c语言子集编译器实验报告书 -回复

c语言子集编译器实验报告书-回复C语言子集编译器实验报告书为了深入理解编译原理和实践C语言的编译过程,我们小组决定设计和实现一个C语言子集编译器。

本报告将详细介绍我们的实验目标、所采取的实验方法、主要成果和遇到的困难及解决办法等相关内容。

一、实验目标我们的实验目标是设计和实现一个基于C语言子集的编译器。

C语言是一种高级编程语言,对于程序员来说非常重要。

能够编写一个能够正确解析、分析和生成目标代码的编译器对于我们研究和理解底层编程原理具有重要意义。

二、实验方法1. 语法分析器的设计与实现语法分析是编译器的核心部分,用于将源代码转换为可以执行的中间表示。

我们选择使用自上而下的递归下降方法进行语法分析器的设计。

首先,我们仔细研究了C语言的语法规范,并根据其语法规范设计了文法。

然后,我们使用LL(1)文法,并手动实现了对应的递归下降的语法分析器。

2. 词法分析器的设计与实现词法分析器用于将源代码转换为一个个的词法单元(token),即基本的语法单元。

我们使用有限状态自动机(FSM)来设计并实现词法分析器。

首先,我们构建了一个有限状态自动机的状态转移图,然后使用代码实现了相应的状态转移过程。

3. 中间代码生成和代码优化在语法分析的过程中,我们将生成中间表示形式的代码来进一步处理和优化。

我们选择使用三地址码作为中间表示形式,并实现了相应的中间代码生成算法。

此外,我们还进行了局部和全局的代码优化,包括常量合并、无用代码删除等操作。

三、主要成果经过一段时间的实验和努力,我们成功地设计和实现了一个C语言子集编译器。

该编译器能够正确地将C语言子集的源代码转换为目标代码,并生成中间表示形式的代码。

通过该编译器的实验,我们深入理解了编译原理的相关知识,对于C语言的语法、词法和语义有了更加深入的了解。

四、遇到的困难及解决办法在实验的过程中,我们遇到了一些困难,但通过团队合作和不懈的努力,我们最终克服了这些困难。

首先,我们遇到了语法分析器的设计和实现问题。

四川大学计算机学院 C-语言编译器 编译原理课程设计报告内附源码 递归下降 c minus

四川大学计算机学院 C-语言编译器 编译原理课程设计报告内附源码 递归下降 c minus

四川大学计算机学院 C-语言编译器编译原理课程设计报告内附源码递归下降 c minus编译原理课程设计报告课题名称: C-词法扫描器及语法分析器实现提交文档学生姓名: XXX 提交文档学生学号: 0943041XXX 同组成员名单: 无指导教师姓名: 张兵指导教师评阅成绩: 指导教师评阅意见: . .提交报告时间:2012年 6月 2日《编译原理课程设计报告》计算机学院计科x班 xxx 094304xxxx目录1 课程设计目标 ..................................................................... ..... 3 2 分析与设计 ..................................................................... . (4)2.1 程序结构 ..................................................................... (4)2.2 程序流程 ..................................................................... ... 5 3 词法分析 ..................................................................... (6)3.1 代码结构分析 ....................................................................63.2 Token定义......................................................................73.2.1 Token的定义和类型 (7)3.2.2 Token的种别码 (7)3.3 DAF分析 ..................................................................... (8)3.3.1 删除注释DFA (8)3.3.2 词法分析DFA ............................................................. 10 4 语法分析 ..................................................................... .. (14)4.1 代码结构分析 ...................................................................144.2 节点定义 ..................................................................... .. 154.2.1 节点定义和类型 (15)4.2.2 各类型节点的描述 (16)4.3 递归向下语法分析 (16)4.3.1 C-文法 ...................................................................164.3.2 递归向下分析过程 .......................................................... 17 5 测试结果 ..................................................................... .. (34)5.1 流程 ..................................................................... (34)5.2 词法分析结果 ...................................................................345.3 词法分析出错 ...................................................................385.4 语法分析结果 ...................................................................395.5 语法分析出错 ...................................................................41 6 总结...................................................................... .. (42)6.1 词法分析编写过程 (42)6.2 语法分析编写过程 (43)6.3 成果和收获 .....................................................................43 7 附录...................................................................... .. (44)7.1 scanner.h源文件 (44)7.2 scanner.cpp源文件 (45)7.3 parser.h源文件 (54)7.4 parser.cpp源文件 (56)指导老师:张兵老师 2《编译原理课程设计报告》计算机学院计科x班 xxx 094304xxxx1 课程设计目标学生在学习《编译原理》课程过程中,结合各章节的构造编译程序的基本理论,要求用C或C++语言描述及上机调试,实现一个 C-Minus 小编译程序(包括词法分析,语法分析等重要子程序),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。

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

课程实验报告(全日制硕士研究生)课程名称程序语言与编译实验名称C-编译器设计专业、班级计算机科学与技术4班学生张洁坤学号S********同组学生及学号无指导教师杨晓波目录第1章实验介绍及整体框架 (3)1.1实验目的: (3)1.2实验环境: (3)1.3 C-编译器的整体框架 (3)第2章词法分析 (4)2.1 词法分析包括两个类: (4)2.2 C关键字表: (5)2.3 标识符词法: (5)第3章语法分析 (6)3.1 Class CParser: (6)3.2 Grammar: (6)3.3 基本树形结构: (7)3.4 支持的语句及运算: (8)第4章建立符号表 (9)4.1 辅助类: (9)4.2 主要的类,建立符号表: (9)第5章类型检测 (10)第6章代码生成 (11)6.1 PCode: (11)6.2 80X86 ASM: (12)第7章总结 (13)参考文献 (15)第1章实验介绍及整体框架1.1实验目的:通过实验,加深对所学的关于程序语言与编译的理论知识的理解,增强对所学知识的综合应用能力。

通过本实验,进一步明确编译各阶段之间的关系,掌握词法分析、语法分析、语义分析等实现技术及其实现,熟悉符号表的管理及其在编译过程中的作用,掌握错误处理机制及其应用。

1.2实验环境:硬件:主机:586以上,配有鼠标,内存:256MB以上显示器:VGA或以上硬盘空间:500MB以上软件:Microsoft Visual C++ 6.01.3 C-编译器的整体框架输入文件开始词法分析语法分析建立符号表类型检查代码生成结束语法树符号表第2章词法分析2.1 词法分析包括两个类:(1)Class CTokenizer:从一个字符串中(这个把一个文件看作是一个字符串,MFC中CFile->CString)分离出一个一个token,配上简单的类型通过NextToken()返回:#define TT_EOL '\n'#define TT_EOF -1#define TT_INTEGER -2#define TT_REAL -3#define TT_WORD -4#define TT_STRING '"'#define TT_CHAR '\''(2)Class CScaner:得到具体的的token类型,定义TokenType如下:enum TokenType{// reserved Keyword_AUTO, _DOUBLE, _INT, _STRUCT,_BREAK, _ELSE, _LONG, _SWITCH,_CASE, _ENUM, _REGISTER, _TYPEDEF,_CHAR, _EXTERN, _RETURN, _UNION,_CONST, _FLOAT, _SHORT, _UNSIGNED,_CONTINUE, _FOR, _SIGNED, _VOID,_DEFAULT, _GOTO, _SIZEOF, _VOLA TILE,_DO, _IF, _STATIC, _WHILE,_READ, _WRITE, _PRINTF,// operationsASSIGN, PLUS, MINUS, TIMES, DIV, MOD,BITWISE_AND, BITWISE_OR, BITWISE_NOT, LOGICAL_NOT, LT, GT,// interpunctionsLPARAN, RPARAN, LBRACE, RBRACE, LSQUARE, RSQUARE, COMMA, DOT, SEMI, COLON,// complex operationsEQ/* == */, NEQ/* != */, PLUS_PLUS/* ++ */, MINUS_MINUS/* -- */,PLUS_ASSIGN/* += */, MINUS_ASSIGN/* -= */, TIMES_ASSIGN/* *= */, DIV_ASSIGN/* /= */,NGT/* <= */, NLT/* >= */, LOGICAL_AND/* && */, LOGICAL_OR/* || */,// others_EOF, _ID, _NUM, _STRING, _CHARACTER, _LABEL, _ERROR, _NONE};CScaner通过一个CMap<CString, LPCSTR, enum TokenType, enum TokenType> m_KeyIndex 把CString的关键字和TokenType对应,便于查找和反向查找。

2.2 C关键字表:auto double int structbreak else long switchcase enum register typedefchar extern return unionConst float short unsignedContinue for signed voidDefault goto sizeof volatileDo if static while2.3 标识符词法:identifier :nondigitidentifier nondigitidentifier digitnondigit : one of_ a b c d e f g h i j k l m n o p q r s t u v w x y zA B C D E F G H I J K L M N O P Q R S T U V W X Y Zdigit : one of0 1 2 3 4 5 6 7 8 9escape:\n, \r, \b, \0-7第3章语法分析3.1 Class CParser:定义CTreeNode,和Tiny例程类似:#define MAX_CHILDREN 3class CTreeNode{public:CTreeNode* child[ MAX_CHILDREN ]; // point to child nodeCTreeNode* father; // point to father nodeCTreeNode* sibling; // point to sibling nodeint lineno;NodeKind nodekind;union {StmtKind stmt;ExpKind exp;} kind;enum TokenType type;CString szName;CString szScope; // node function scopeBOOL bArray; // is this an array declarationint iArraySize; // array size};通过文法及相应规则建立语法树。

3.2 Grammar:1.program->declaration_list2.declaration_list->declaration_list declaration | declaration3.declaration->var_declaration | fun_declaration4.var_declaration->type_specifier ID(, ...)`;` | type_specifier ID `[` NUM `]`(, ...)`;`5.type_specifier->`int` | `void` | `char`, actually this step is in declaration_list()6.fun_declaration->type_specifier ID `(` params `)` compound_stmt7.params->param_list | `void` | empty, `void` is thought as empty8.param_list->param_list `,` param | param9.param->type_specifier ID | type_specifier ID `[` `]`pound_stmt->`{` loal_declarations statement_list `}` | expression_stmt11.local_declarations->local_declarations var_declaration | var_declaration12.`read` `(` var `)` `;`13.`write` `(` expression `)` `;`14.`printf` `(` `"` STRING `"` `)` `;`15.expression_stmt->expression `;` | `;`16.expression->var `=` expression | logic1_expression17.logic1_expression->logic1_expression `||` logic2_expression | logic2_expression18.logic2_expression-> logic2_expression `&&` simple_expression | simple_expression19.simple_expression->additive_expression relop additive_expression | additive_expression20.relop-> `<=` | `<` | `>` | `>=` | `==` | `!=`21.additive_expression -> additive_expression addop term | term22.addop-> `+` | `-`23.term->term mulop logic3_expression | logic3_expression24.mulop-> `*` | `/` | `%`25.logic3_expression-> `!` logic3_expression | factor26.factor->`(` expression `)` | var | call | NUM27.var->ID | ID `[` expression `]`28.call->ID `(` args `)`29.args->args_list | empty30.args_list->args_list `,` expression | expression31.sub_compoundstmt->ID `:` | call `;` | expression_stmt32.if_stmt->`if` `(` expression `)` compound_stmt| `if` `(` expression `)` compound_stmt `else` compound_stmt33.while_stmt->`while` `(` expression `)` compound_stmt34.for_stmt->`for` `(` var `=` expression `;` expression `;` var `=` expression `)`compound_stmt35.goto_stmt->`goto` ID `;`36.break_stmt->`break` `;`37.continue_stmt->`continue` `;`38.return_stmt->`return` `;` | `return` expression `;`3.3 基本树形结构:if语句:while语句:if语句表达式语句语句while语句表达式语句for复合语句:3.4 支持的语句及运算:1) 数据类型:int ,char void ,PCode 里支持float ,在80x86 ASM 里不支持 2) 语句:赋值(=),if, while ,for ,return ,break ,continue 3) 数学运算:+,-,*,/4) 关系运算:= =,>,<,>=,<=,!= 5) 逻辑运算:&&,||,! 6) 支持函数的定义、调用 7) 支持复合语句8) 注释语句:C 类型的 /* */ 和C++类型的 //表达式语句表达式for 语句表达式语句复合语句语句语句声明第4章建立符号表4.1 辅助类:(1) Class LineListRec:主要成员是lineno,记录某个Token(变量或函数名)声明或使用时的行数。

相关文档
最新文档