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

  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(变量或函数名)声明或使用时的行数。

相关文档
最新文档