天津理工大学编译原理实验一
编译原理实验报告(C语言)
![编译原理实验报告(C语言)](https://img.taocdn.com/s3/m/03fead8aa0116c175f0e482e.png)
编译原理实验报告实验项目1:词法分析程序实验一、实验的目的与任务:编译原理是计算机类专业特别是计算机软件专业的一门重要专业课。
设置该课程的目的在于系统地向学生讲述编译系统的结构、工作流程及编译程序各组成部分的设计原理和实现方法,使学生通过学习既掌握编译理论和方法方面的基本知识,也具有设计、实现、分析和维护编译程序等方面的初步能力。
编译原理是一门理论性和实践性都比较强的课程。
进行上机实验的目的是使学生通过完成上机实验题目加深对课堂教学内容的理解。
同时培养学生实际动手能力。
编译实验由三个独立实验组成,按照由浅入深进行排列,希望通过本实验使学生更深学习并理解编译的主要过程和相关方法。
词法分析的目的是将输入的源程序进行划分,给出基本符号(token)的序列,并掠过注解和空格等分隔符号。
基本符号是与输入的语言定义的词法所规定的终结符。
本实验要求学生编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续进行)二、题目分析1.这里采用C语言编写的源程序作为词法分析程序的输入数据,输入数据保存在“in.txt”记事本中,将分析结果存在“out.txt”记事本中。
词法分析器的源代码使用C语言编写。
2.下面就词法分析程序中的主要变量进行说明:主函数main():打开要分析的C语言源程序,若不能正确打开,则报错。
先从源程序中读入一个字符ch,然后进行如下处理:1、cp消耗掉空格,制表符,换行符后,cp数组复位,开始检测cp;2、数字检测,对照符号表输出,若匹配成功,则返回序号;3、字符串检测, 对照符号表输出,若匹配成功,则返回序号;4、基本保留字检测,对照符号表输出,若匹配成功,则返回序号;5、运算符检测,对照符号表输出,若匹配成功,则返回序号;注意这里碰到‘/’时,要判断后面是否跟着是注释语句。
编译原理实验报告(C语言)
![编译原理实验报告(C语言)](https://img.taocdn.com/s3/m/8a688c42be23482fb4da4ccd.png)
else if(strcmp(word,"if")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',12,')'); else if(strcmp(word,"else")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',13,')'); else if(strcmp(word,"switch")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',14,')'); else if(strcmp(word,"case")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',15,')'); else if(strcmp(word,"for")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',16,')'); else if(strcmp(word,"do")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',17,')'); else if(strcmp(word,"while")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',18,')'); else if(strcmp(word,"goto")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',19,')'); else if(strcmp(word,"continue")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',20,')'); else if(strcmp(word,"break")==0) fprintf(out,"%c%c%s%c,%d%c\n",'(','"',word,'"',21,')');
编译原理实验报告
![编译原理实验报告](https://img.taocdn.com/s3/m/3c4ad9414b7302768e9951e79b89680202d86b58.png)
编译原理实验报告一、实验概述本次实验旨在设计并实现一个简单的词法分析器,即实现编译器的第一个阶段,词法分析。
词法分析器将一段源程序代码作为输入,将其划分为一个个的词法单元,并将其作为输出。
二、实验过程1.设计词法规则根据编程语言的规范和所需实现的功能,设计词法规则,以明确规定如何将源程序代码分解为一系列的词法单元。
2.实现词法分析器采用合适的编程语言,根据所设计的词法规则,实现词法分析器。
词法分析器的主要任务是读入源程序代码,并将其根据词法规则进行分解,生成对应的词法单元。
3.测试词法分析器设计测试用例,用于检验词法分析器的正确性和性能。
测试用例应包含各种情况下的源程序代码。
4.分析和修正错误根据测试过程中发现的问题,分析产生错误的原因,并进行修正。
重复测试和修正的过程,直到词法分析器能够正确处理所有测试用例。
三、实验结果我们设计了一个简单的词法分析器,并进行了测试。
测试用例涵盖了各种情况下的源程序代码,包括正确的代码和错误的代码。
经过测试,词法分析器能够正确处理所有的测试用例。
词法分析器将源程序代码分解为一系列的词法单元,每个词法单元包含了单词的种类和对应的值。
通过对词法单元的分析,可以进一步进行语法分析和语义分析,从而完成编译过程。
四、实验总结通过本次实验,我深入了解了编译原理的词法分析阶段。
词法分析是编译器的第一个重要阶段,它将源程序代码分解为一个个的词法单元,为后续的语法分析和语义分析提供基础。
在实现词法分析器的过程中,我学会了如何根据词法规则设计词法分析器的算法,并使用编程语言实现词法分析器。
通过测试和修正,我掌握了调试和错误修复的技巧。
本次实验的经验对我今后的编程工作有很大帮助。
编译原理是计算机科学与技术专业的核心课程之一,通过实践能够更好地理解和掌握其中的概念和技术。
我相信通过进一步的学习和实践,我能够在编译原理领域取得更大的成果。
编译原理实验报告
![编译原理实验报告](https://img.taocdn.com/s3/m/7bd0e2317f21af45b307e87101f69e314332faa0.png)
编译原理实验报告一、实验目的编译原理是计算机科学中的重要学科,它涉及到将高级编程语言转换为计算机能够理解和执行的机器语言。
本次实验的目的是通过实际操作和编程实践,深入理解编译原理中的词法分析、语法分析、语义分析以及中间代码生成等关键环节,提高我们对编译过程的认识和编程能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
此外,还使用了一些相关的编译工具和调试工具,如 GDB 等。
三、实验内容(一)词法分析器的实现词法分析是编译过程的第一步,其任务是将输入的源程序分解为一个个单词符号。
在本次实验中,我们使用有限自动机的理论来设计和实现词法分析器。
首先,定义了各种单词符号的类别,如标识符、关键字、常量、运算符等。
然后,根据这些类别设计了相应的状态转换图,并将其转换为代码实现。
在实现过程中,使用了正则表达式来匹配输入字符串中的单词符号。
对于标识符和常量等需要进一步处理的单词符号,使用了相应的规则进行解析和转换。
(二)语法分析器的实现语法分析是编译过程的核心环节之一,其任务是根据给定的语法规则,分析输入的单词符号序列是否符合语法结构。
在本次实验中,我们使用了递归下降的语法分析方法。
首先,根据实验要求定义了语法规则,并将其转换为相应的递归函数。
在递归函数中,通过对输入单词符号的判断和处理,逐步分析语法结构。
为了处理语法错误,在分析过程中添加了错误检测和处理机制。
当遇到不符合语法规则的输入时,能够输出相应的错误信息,并尝试进行恢复。
(三)语义分析及中间代码生成语义分析的目的是对语法分析得到的语法树进行语义检查和语义处理,生成中间代码。
在本次实验中,我们使用了三地址码作为中间代码的表示形式。
在语义分析过程中,对变量的定义和使用、表达式的计算、控制流语句等进行了语义检查和处理。
对于符合语义规则的语法结构,生成相应的三地址码指令。
四、实验步骤(一)词法分析器的实现步骤1、定义单词符号的类别和对应的正则表达式。
编译原理实验报告
![编译原理实验报告](https://img.taocdn.com/s3/m/1c88c24ba517866fb84ae45c3b3567ec102ddcb5.png)
编译原理实验报告一、引言编译原理是计算机科学中的重要课程,它研究了将高级语言翻译为机器语言的方法和技术。
编译器作为实现这一目标的关键工具,扮演着至关重要的角色。
本实验报告将介绍编译原理实验的相关内容,包括实验目的、实验环境、实验步骤和实验结果等。
二、实验目的编译原理实验的主要目的是通过设计和实现一个简单的编译器,来加深对编译原理相关概念和技术的理解。
具体目标包括: 1. 理解词法分析、语法分析、语义分析等编译器的基本原理和流程; 2. 掌握使用Lex和Yacc工具进行词法分析和语法分析的方法; 3. 学会使用C/C++等编程语言实现编译器的基本功能。
三、实验环境本实验使用的实验环境包括: 1. 操作系统:Windows 10; 2. 开发工具:Visual Studio Code; 3. 编程语言:C/C++; 4. 辅助工具:Lex、Yacc。
四、实验步骤本实验的主要步骤如下:4.1 设计语言文法在开始实验之前,我们首先需要设计我们要实现的编程语言的文法。
文法是描述编程语言语法结构的形式化规则,它指定了合法的语法结构和语句构造方法。
我们可以使用BNF(巴科斯范式)或EBNF(扩展巴科斯范式)来表示文法。
4.2 实现词法分析器词法分析器的主要任务是将输入的字符流转换为一个个的词法单元(token)。
词法单元是编程语言中的最小语法单位,例如关键字、标识符、常量等。
我们可以使用Lex工具来实现词法分析器,它可以根据我们定义的正则表达式规则来生成词法分析器的代码。
4.3 实现语法分析器语法分析器的主要任务是根据语言文法,将词法单元序列转换为语法树。
语法树是描述程序语法结构的一种树状数据结构,它可以帮助我们理解和处理程序的语义。
我们可以使用Yacc工具来实现语法分析器,它可以根据我们定义的文法规则来生成语法分析器的代码。
4.4 实现语义分析器语义分析器的主要任务是对语法树进行遍历和分析,检查程序中的语义错误并生成中间代码。
编译原理实验一
![编译原理实验一](https://img.taocdn.com/s3/m/97ece0365bcfa1c7aa00b52acfc789eb172d9ebd.png)
编译原理实验一
编译原理实验一是一个非常重要的实验环节,它涉及到一些基本的编译原理知识和实践技能。
在这个实验中,我们将学习如何设计并实现一个简单的词法分析器。
在编译原理实验一中,我们将首先学习词法分析的基本概念和原理。
词法分析是编译器的第一阶段,它的主要任务是将输入的源代码分解成一个个的词法单元,如标识符、关键字、数字、运算符等。
为了完成这个任务,我们需要设计一个适用于特定编程语言的词法分析器。
接下来,我们将学习如何使用正则表达式来描述词法单元的模式。
通过定义正确的正则表达式,我们可以准确地识别出源代码中的各种词法单元。
为了实现这一功能,我们将使用一个常用的正则表达式引擎,如lex工具。
在实验过程中,我们将根据给定的编程语言规范,编写相应的正则表达式规则,并通过lex工具生成对应的词法分析器程序。
然后,我们将使用这个词法分析器程序来对一些示例源代码进行分析,确保它能正确地识别出各种词法单元。
最后,我们将对实验结果进行总结和分析。
通过实验一,我们将更深入地了解词法分析的原理和实现方法,为以后更复杂的编译原理实验和项目打下坚实的基础。
希望大家能够认真对待这个实验,积极探索和学习,并尽可能多地掌握相关知识和技能。
编译原理的实验报告
![编译原理的实验报告](https://img.taocdn.com/s3/m/1521ce20a9956bec0975f46527d3240c8547a16a.png)
一、实验目的1. 理解编译原理的基本概念和原理。
2. 掌握编译器的各个阶段及其实现方法。
3. 能够运用编译原理的知识解决实际问题。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 20194. 实验内容:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成三、实验内容1. 词法分析(1)实验目的:实现一个简单的词法分析器,将源代码中的字符序列转换为词法符号序列。
(2)实验步骤:1)定义词法符号类型,包括标识符、关键字、运算符、常量等。
2)设计词法分析器算法,对源代码进行遍历,将字符序列转换为词法符号序列。
3)实现词法分析器程序,输出词法符号序列。
(3)实验结果:输入源代码:int a = 10;输出词法符号序列:{<int, int>, <a, a>, <=, =>, <10, 10>, <;, ;>}2. 语法分析(1)实验目的:实现一个简单的语法分析器,将词法符号序列转换为抽象语法树(AST)。
(2)实验步骤:1)定义语法规则,包括产生式、非终结符、终结符等。
2)设计语法分析算法,根据语法规则对词法符号序列进行解析,生成AST。
3)实现语法分析器程序,输出AST。
(3)实验结果:输入词法符号序列:{<int, int>, <a, a>, <=, =>, <10, 10>, <;, ;>}输出AST:```AST:- ExpressionStatement- Expression- BinaryExpression- Identifier: a- Operator: =- Constant: 10```3. 语义分析(1)实验目的:实现语义分析器,对AST进行语义检查,确保程序的正确性。
(2)实验步骤:1)定义语义规则,包括类型检查、作用域检查等。
大学编译原理实验报告
![大学编译原理实验报告](https://img.taocdn.com/s3/m/f2d5eaa2c9d376eeaeaad1f34693daef5ff7136e.png)
一、实验名称编译原理实验二、实验目的1. 理解编译原理的基本概念和原理。
2. 掌握文法分析、词法分析和语法分析的基本方法。
3. 学会使用编译工具,如Lex和Yacc,实现简单的编译器。
三、实验内容本次实验主要分为三个部分:1. 词法分析2. 语法分析3. 编译器构建四、实验步骤1. 词法分析- 使用Lex工具实现词法分析器。
- 定义输入文件格式,包括源代码和标记。
- 编写Lex规则,将源代码转换为标记序列。
- 使用Flex生成词法分析器程序。
2. 语法分析- 使用Yacc工具实现语法分析器。
- 定义语法规则,包括产生式和文法符号。
- 编写Yacc规则,将标记序列转换为语法分析树。
- 使用Bison生成语法分析器程序。
3. 编译器构建- 将词法分析器和语法分析器程序结合,构建简单的编译器。
- 实现编译器的中间代码生成功能。
- 实现编译器的目标代码生成功能。
五、实验结果1. 词法分析- 输入:`int a = 10;`- 输出:`TOKEN: int, TOKEN: a, TOKEN: =, TOKEN: 10, TOKEN: ;`2. 语法分析- 输入:`int a = 10;`- 输出:`Syntax Tree: Program -> Declaration -> Variable Declaration -> Identifier -> a, Token -> int, Token -> =, Token -> 10, Token -> ;`3. 编译器构建- 输入:`int a = 10;`- 输出:`Target Code: int a = 10;`六、实验心得1. 通过本次实验,我深入理解了编译原理的基本概念和原理,包括词法分析、语法分析和编译器构建。
2. 我学会了使用Lex和Yacc等编译工具,实现了简单的编译器。
3. 本次实验让我认识到编译原理在软件开发中的重要性,以及编译器在代码生成和优化方面的作用。
编译原理实验报告
![编译原理实验报告](https://img.taocdn.com/s3/m/707a57a35ff7ba0d4a7302768e9951e79a896964.png)
编译原理实验报告一、实验目的本次实验的目的是了解编译原理的基本知识,并运用所学知识实现一个简单的词法分析器。
二、实验内容1.设计一个词法分析器,能够识别并输出源程序中的关键字、标识符、常数和运算符等。
2.设计并实现一个词法分析器的算法。
3.对编写的词法分析器进行测试。
三、实验过程1.设计词法分析器的算法在设计词法分析器的时候,需要先了解源程序的基本构成,了解关键字、标识符、常数和运算符等的特点,以及它们在源程序中的表示形式。
然后,根据这些特点,设计一个适合的算法来进行词法分析。
2.实现词法分析器根据设计好的算法,在编程语言中实现词法分析器。
在实现过程中,需要根据不同的词法单元,设计相应的正则表达式来进行匹配和识别。
3.测试词法分析器编写几个简单的测试用例,对词法分析器进行测试。
检查输出结果是否正确,并根据实际情况对词法分析器进行调试和优化。
四、实验结果经过测试,词法分析器能够正确识别并输出源程序中的关键字、标识符、常数和运算符等。
测试用例的输出结果与预期结果一致。
五、实验总结通过本次实验,我学习了编译原理的基本知识,掌握了词法分析器的设计和实现方法。
在实验过程中,我遇到了一些困难和问题,但通过仔细思考和查阅文献资料,最终成功地完成了实验任务。
这次实验不仅帮助我巩固了所学知识,还提高了我的编程能力和解决问题的能力。
通过实践,我深刻体会到了编译原理在软件开发中的重要性和作用,并对将来的学习和工作有了更好的规划和方向。
通过本次实验,我对编译原理的相关知识有了更深入的理解和掌握,对词法分析器的设计和实现方法有了更加清晰的认识。
同时,我还学会了如何进行实验报告的撰写,提高了我的文档写作能力。
通过本次实验,我不仅实现了实验的目标,还提高了自己的综合素质和能力。
编译原理上机实验报告
![编译原理上机实验报告](https://img.taocdn.com/s3/m/d6e2dc7e82c4bb4cf7ec4afe04a1b0717fd5b3c8.png)
编译原理上机实验报告一、实验目的本次实验旨在通过实践的方式理解和掌握编译原理中的一些重要概念和技术,包括词法分析、语法分析和语义分析等。
通过实验的操作,了解和体验编译器的工作过程,深入理解编译原理的相关理论知识。
二、实验环境本次实验使用了Java语言作为编程语言,使用Eclipse作为开发环境,实验所需的相关工具和库已经提前配置完成。
三、实验内容本次实验主要分为三个部分,分别是词法分析、语法分析和语义分析。
1.词法分析词法分析是编译器的第一个阶段,也是最基础的阶段。
在本次实验中,我们首先需要实现一个词法分析器,该分析器可以将源代码分割成一个个的词法单元,将其存储到一个词法单元表中。
我们首先需要定义一些词法单元的模式,比如关键字、标识符、常量等。
然后,我们使用正则表达式和有限自动机的思想来实现一个可以识别各种模式的词法分析器。
2.语法分析语法分析是编译器的第二个阶段,其目的是将词法单元表中的内容按照语法规则进行分析,生成一个语法树。
在本次实验中,我们需要实现一个递归下降的语法分析器。
我们首先需要定义一些语法规则,然后根据这些规则逐条实现相应的语法分析函数。
最终,我们可以通过递归调用这些函数,将源代码转换成语法树的形式。
3.语义分析语义分析是编译器的第三个阶段,其目的是对语法树进行进一步的检查和处理。
在本次实验中,我们需要实现一个简单的语义分析器。
我们可以在语法分析的基础上,增加一些语义规则,然后对生成的语法树进行检查。
比如,我们可以检查变量的定义和使用是否一致,是否存在未定义的变量等。
最终,我们可以通过语义分析器发现和纠正一些潜在的错误。
四、实验总结通过本次实验,我深入学习了编译原理的相关知识,并通过实践中加深了对这些知识的理解和掌握。
实验中,我了解到了词法分析、语法分析和语义分析在编译器设计中的重要性,也学会了如何使用相关工具和技术来实现这些功能。
通过实验,我发现编译原理是一门非常有趣且实用的课程,它既涉及到理论知识,又需要实践操作。
编译原理实验报告
![编译原理实验报告](https://img.taocdn.com/s3/m/fb24dc875ff7ba0d4a7302768e9951e79a89694e.png)
编译原理实验报告一、实验目的编译原理是计算机科学中的一门重要课程,通过实验,旨在加深对编译原理相关理论知识的理解,提高实践动手能力和问题解决能力。
具体目标包括:1、熟悉编译程序的基本结构和工作流程。
2、掌握词法分析、语法分析、语义分析及中间代码生成等主要阶段的实现方法。
3、培养运用编程语言实现编译算法的能力。
二、实验环境本次实验使用的编程语言为_____,开发工具为_____,操作系统为_____。
三、实验内容(一)词法分析词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个单词符号。
使用正则表达式和有限自动机的理论,设计并实现了词法分析器。
首先,定义了单词的类别,如标识符、关键字、运算符、常量等。
然后,根据不同单词类别的特征,编写了相应的正则表达式模式。
在实现过程中,通过对输入的源程序进行逐字符扫描,利用正则表达式匹配来识别单词,并将其分类存储。
(二)语法分析语法分析是编译过程的核心部分,其目的是确定输入的单词序列是否符合给定的语法规则。
采用了自顶向下的递归下降分析法和自底向上的算符优先分析法。
对于递归下降分析法,根据语法规则编写了相应的递归函数。
每个函数处理一种语法结构,通过递归调用实现对整个语法的分析。
算符优先分析法则通过定义算符的优先级和结合性,构建算符优先关系表,然后依据表进行语法分析。
(三)语义分析语义分析阶段主要检查语法正确的句子是否具有实际的意义,并进行类型检查、语义计算等操作。
在实现中,通过构建符号表来记录变量的信息,包括名称、类型、作用域等。
同时,在语法分析的过程中,根据语义规则进行相应的检查和计算。
(四)中间代码生成中间代码生成是将源程序转换为一种便于优化和目标代码生成的中间表示形式。
选择了三地址码作为中间代码。
在生成中间代码时,根据语法分析和语义分析的结果,按照一定的规则将源程序转换为三地址码的形式。
四、实验步骤1、需求分析仔细研究实验要求,明确各个阶段的任务和目标,确定所需的数据结构和算法。
天津理工大学计算机网络
![天津理工大学计算机网络](https://img.taocdn.com/s3/m/b99a596e48d7c1c709a14502.png)
天津理工大学计算机科学与技术学院《编译原理》上机指导《编译原理》课程组实验一词法分析器一实验目的1掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。
2通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。
并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
3掌握根据程序的伪代码来编写程序模块程序源代码。
二实验涉及到的知识要点词法分析器的功能输入是源程序,输出单词符号。
词法分析可以采用如下两种处理结构:(1)把词法分析程序作为主程序;(2)把词法分析程序作为语法分析程序调用的子程序。
三实验预习(以把词法分析程序作为主程序为例)程序语言的单词符号通常可以分以下五种:保留字、标识符、常数、运算符、界符。
语法分析程序输出的单词符号通常以二元式的形式表示:(单词种别,单词自身的值)四实验程序流程(仅供参考)五程序结构(仅供参考)Token=‘’; /*对token数组初始化*/S=getch( ); /*读入一个字符*/Getbc( ); /*滤除空白*/Switch(s){case ‘a’:case ‘b’:…case ‘z’:while (letter( ) || digit( )){concat(); /*将当前读入的字符送token数组*/getch();}retract(); /*非字母或数字则扫描指针回退一个字符*/c=reserve(); /*判断token是否为关键字,把返回值给c*/ if(c==0) /*若token是标识符*/{buildlist(); /*将标识符登录到符号表中*/return(id,指向符号表入口指针);}else /*若token不是标识符*/return(保留字,null);break;case ‘0’:case ‘1’:…case ‘9’:while (digit()) /*若当前读入的字符是数字*/ {concat(); /*将当前读入的数字送token数组*/getch();}retract(); /*非数字则扫描指针回退一个字符*/buildlist(); /*将常数登录到常数表*/return(num,num的常数表入口指针);break;case ‘+’:return(‘+’,null);break;case ‘-’:return(‘-’,null);break;case ‘*’:return(‘*’,null);break;case ‘<’:getch();if(ch==‘=’)return(relop,LE);else{retract(); /*扫描指针回退一个字符*/return(relop,LT)} break;case ‘;’:return(‘;’,null);break;default:error();}六实验内容题目:用以下语言词法构造规则,来构造词法分析器。
编译原理熟悉实验报告
![编译原理熟悉实验报告](https://img.taocdn.com/s3/m/d8f74853bb1aa8114431b90d6c85ec3a87c28bd3.png)
一、实验目的1. 理解编译原理的基本概念和流程;2. 掌握编译器的各个阶段及其实现方法;3. 熟悉编译器各个阶段中使用的算法和数据结构;4. 培养编程能力和问题解决能力。
二、实验内容1. 词法分析;2. 语法分析;3. 语义分析;4. 代码生成;5. 符号表;6. 中间代码生成。
三、实验步骤1. 词法分析(1)设计词法分析器:首先需要确定源程序中的词法单元,如标识符、关键字、运算符等。
然后,编写代码实现词法分析器,对源程序进行扫描,将词法单元转换成词法符号。
(2)实现词法分析器:使用C语言或Java等编程语言实现词法分析器,完成词法单元的识别和转换。
2. 语法分析(1)设计语法分析器:根据源程序的语言规范,设计语法分析器,实现语法规则的定义和匹配。
(2)实现语法分析器:使用递归下降分析法、LL(1)分析法、LR(1)分析法等实现语法分析器,对词法分析器输出的词法符号序列进行语法分析。
3. 语义分析(1)设计语义分析器:根据源程序的语言规范,设计语义分析器,实现语义规则的检查和类型检查。
(2)实现语义分析器:使用C语言或Java等编程语言实现语义分析器,完成语义规则的检查和类型检查。
4. 代码生成(1)设计代码生成器:根据源程序的语言规范,设计代码生成器,将抽象语法树转换成目标代码。
(2)实现代码生成器:使用C语言或Java等编程语言实现代码生成器,完成抽象语法树到目标代码的转换。
5. 符号表(1)设计符号表:在编译过程中,需要记录变量、函数等信息,设计符号表实现这些信息的存储和管理。
(2)实现符号表:使用C语言或Java等编程语言实现符号表,完成变量、函数等信息的存储和管理。
6. 中间代码生成(1)设计中间代码生成器:根据源程序的语言规范,设计中间代码生成器,将抽象语法树转换成中间代码。
(2)实现中间代码生成器:使用C语言或Java等编程语言实现中间代码生成器,完成抽象语法树到中间代码的转换。
四、实验结果与分析1. 词法分析器能够正确识别源程序中的词法单元,并将它们转换成词法符号。
天津理工大学编译原理实验一
![天津理工大学编译原理实验一](https://img.taocdn.com/s3/m/2940032c87c24028915fc3d9.png)
实验报告学院(系)名称:计算机与通信工程学院实验源代码和心得体会#include<iostream>#include<ctype.h>#include<cstring>#define bufsize 1024//关键字#define INCLUDE 256#define AUTO 257#define BREAK 258#define CASE 259#define CHAR 260#define CONST 261#define CONTINUE 262#define DEFAULT 263#define DO 264#define DOUBLE 265#define ELSE 266#define ENUM 267#define EXTERN 268#define FLOAT 269#define FOR 270#define GOTO 271#define IF 272#define INT 273#define LONG 274#define REGISTER 275#define RETURN 276#define SHORT 277#define SIGNED 278#define SIZEOF 279#define STA TIC 280#define STRUCT 281#define SWITCH 282#define TYPEDEF 283#define UNION 284#define UNSIGNED 285#define VOLATILE 286#define WHILE 287//运算符#define PLUS 288 // +#define MINUS 289 // -#define MUL 290 // * #define DIV 291 // /#define REMAIN 292 // %#define LESS 294 // <#define EQUAL 295 // =#define MISTAKE 296 // ! #define AND 297 // &#define OR 298 // |#define PP 299 // ++#define MM 300 // --#define EE 301 // ==#define GE 302 // >=#define LE 303 // <=#define MISE 304 // !=#define AA 305 // &&#define OO 306 // ||#define PE 307 // +=#define MINUSE 308 // -=#define MULE 309 // *=#define DIVE 310 // /=#define POW 311 // ^ // 界符#define SEMIC 312 // ;#define COMMA 313 // ,#define MULANNO_L 314 // /* #define MULANNO_R 315 // */ #define BRACE_L 316 // { #define BRACE_R 317 // } #define BRAKET_L 318 // (#define BRAKET_R 319 // )#define MIDBRA_L 320 // [#define MIDBRA_R 321 // ]#define ONE_ANNO 322 // ////标识符和常量符#define TAG 400#define CONINT 401#define CONFLOAT 402#define CONCHAR 403#define CONSTRING 404//转义字符和字符串#define CA 500#define CB 501#define CF 502#define CN 503#define CR 504#define CT 505#define CV 506#define CQUE 508#define CDQM 509#define CQM 510#define ZERO 511using namespace std;typedef struct Variate{//变量标识符int id;char name[50];}Variate;typedef struct Constant{//常量int id;char name[50];}Constant;typedef struct Sign{char name[100];int sym;char attr[100];}Sign;const char *keywordTable[]={"include","auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","if","int","long","register","return","short","signed","sizeof","static","struct","switch","typedef","union","unsigned","volatile","while","","##"};//##作用是判断是否结束const char *operateTable[]={"+","-","*","/","%",">","<","=","!","&","|","++","--","==",">=","<=","!=","&&","||","+=","-=","*=","/=","^","##"}; const char *borderTable[]={";",",","/*","*/","{","}","(",")","[","]","//","##"};const char changeList[12]={'a','b','f','n','r','t','v','\\','?','"','\'','0'};FILE *in;FILE *Out;FILE *Error;int line=1; //用于输出错误的行数或者其他情况。
编译原理实验1(同名23813)
![编译原理实验1(同名23813)](https://img.taocdn.com/s3/m/27e86c7ab4daa58da1114a25.png)
天津理工大学实验报告学院(系)名称:计算机与通信工程学院姓名学号专业班级实验项目实验一:词法分析器课程名称编译原理课程代码实验时间实验地点批改意见成绩教师签字:一、实验内容:实现标准C语言词法分析器。
二、实验要求:(1)单词种别编码要求基本字、运算符、界符:一符一种标识符:统一为一种;常量:按类型编码;(2)词法分析工作过程中建立符号表、常量表。
并以文本文件形式输出。
(3)词法分析的最后结果以文本文件形式输出。
三、实验代码:输入的程序:package com.example;public class WordList {writer.write("字符编码:"+(temp+i+1)+"\t种别详情:"+list.get(i).toString());writer.write("\r\n");}writer.close();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {HanShu hanShu = new HanShu();String string = hanShu.getFile("a.txt");String str = hanShu.yuChuLi(string);ArrayList<Word> list = hanShu.fenGe(str);ArrayList<WordList> arrayList = hanShu.fenlei(list);List<String> guanjianzi = hanShu.guanjianzi;outPut(guanjianzi,"E:/2.txt",1);List<String> fengefu = hanShu.fengefu;outPut(fengefu, "E:/3.txt",2);List<String> caozuofu = hanShu.caozuofu;outPut(caozuofu, "E:/4.txt",3);outPut(arrayList);}public static void print(ArrayList<WordList> list){for(int i =0;i<list.size();i++){System.out.println(list.get(i));}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告学院(系)名称:计算机与通信工程学院实验源代码和心得体会#include<iostream>#include<ctype.h>#include<cstring>#define bufsize 1024//关键字#define INCLUDE 256#define AUTO 257#define BREAK 258#define CASE 259#define CHAR 260#define CONST 261#define CONTINUE 262#define DEFAULT 263#define DO 264#define DOUBLE 265#define ELSE 266#define ENUM 267#define EXTERN 268#define FLOAT 269#define FOR 270#define GOTO 271#define IF 272#define INT 273#define LONG 274#define REGISTER 275#define RETURN 276#define SHORT 277#define SIGNED 278#define SIZEOF 279#define STA TIC 280#define STRUCT 281#define SWITCH 282#define TYPEDEF 283#define UNION 284#define UNSIGNED 285#define VOLATILE 286#define WHILE 287//运算符#define PLUS 288 // +#define MINUS 289 // -#define MUL 290 // * #define DIV 291 // /#define REMAIN 292 // %#define LESS 294 // <#define EQUAL 295 // =#define MISTAKE 296 // ! #define AND 297 // &#define OR 298 // |#define PP 299 // ++#define MM 300 // --#define EE 301 // ==#define GE 302 // >=#define LE 303 // <=#define MISE 304 // !=#define AA 305 // &&#define OO 306 // ||#define PE 307 // +=#define MINUSE 308 // -=#define MULE 309 // *=#define DIVE 310 // /=#define POW 311 // ^ // 界符#define SEMIC 312 // ;#define COMMA 313 // ,#define MULANNO_L 314 // /* #define MULANNO_R 315 // */ #define BRACE_L 316 // { #define BRACE_R 317 // } #define BRAKET_L 318 // (#define BRAKET_R 319 // )#define MIDBRA_L 320 // [#define MIDBRA_R 321 // ]#define ONE_ANNO 322 // ////标识符和常量符#define TAG 400#define CONINT 401#define CONFLOAT 402#define CONCHAR 403#define CONSTRING 404//转义字符和字符串#define CA 500#define CB 501#define CF 502#define CN 503#define CR 504#define CT 505#define CV 506#define CQUE 508#define CDQM 509#define CQM 510#define ZERO 511using namespace std;typedef struct Variate{//变量标识符int id;char name[50];}Variate;typedef struct Constant{//常量int id;char name[50];}Constant;typedef struct Sign{char name[100];int sym;char attr[100];}Sign;const char *keywordTable[]={"include","auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","if","int","long","register","return","short","signed","sizeof","static","struct","switch","typedef","union","unsigned","volatile","while","","##"};//##作用是判断是否结束const char *operateTable[]={"+","-","*","/","%",">","<","=","!","&","|","++","--","==",">=","<=","!=","&&","||","+=","-=","*=","/=","^","##"}; const char *borderTable[]={";",",","/*","*/","{","}","(",")","[","]","//","##"};const char changeList[12]={'a','b','f','n','r','t','v','\\','?','"','\'','0'};FILE *in;FILE *Out;FILE *Error;int line=1; //用于输出错误的行数或者其他情况。
默认值是从1 开始,为第一行char buf[bufsize]; //存储读取的一行的字符串char firchar; //头文件下第一个字符char Char;int start=0;int VariateNum=0;//记录变量的个数,减去1int ConstantNum=0;//记录常量的个数int SignNum=0;//记录标记的个数int notation=1;//记录是否找到多行注释的另一半*/ ,默认值是1 即为有另一半int isNotation=0;//判断是否是在注释行内0 不是,1 单行注释2多行注释bool last=false;int late=0;Variate var;Constant con;Variate VarArr[bufsize];Constant ConArr[bufsize];Sign SigArr[bufsize];//获取读取的文件本行的第一个字符,直到找到一个非空格字符char getfirstc(FILE *in){char ch=fgetc(in);//fgetc() 函数的作用是读取文件的当前行的一个字符,返回读取的字符while(ch==' '||ch=='\n'||ch=='\t'){if(ch=='\n'){line++;fputc('\n',Out);//向输出的文本文件中打印换行}ch=fgetc(in);}return ch;}//处理读取的本行内容void dealhead(char *buf){char ch[10];char cha;char str[bufsize];int i=0;int j=0;int temp=0;while(i<bufsize)//找到include<并保存{if(buf[i]!=' '&&buf[i]!='\0'){if(temp==0){if(buf[i]=='i')temp=1;else if(buf[i]=='d')temp=2;else{fprintf(Error,"Line:%d\tformat is wrong! Without'>'\n",line);break;}}if(temp==1)ch[j]=buf[i];j++;if(buf[i]=='<'){ch[j]='\0';break;}}else if(temp==2){ch[j]=buf[i];j++;if(buf[i+1]==' '){ch[j]='\0';i++;break;}}}i++;}if(temp==1){int index=0;fputc('#',Out);while(buf[index]!='\0'){if(buf[index]!=' ')fputc(buf[index],Out);index++;}if(strcmp(ch,"include<")==0){i++; //因为上面程序没进行++就直接break所以这里就需要加1到下一个角标while((cha=buf[i])!='>'){i++;if(cha=='\n'){fprintf(Error,"Line:%d\tinclude end without '>'\n",line);break;}}elsefprintf(Error,"Line:%d\tinclude format is wrong\n",line);}else if(temp==2){if(strcmp(ch,"define")!=0){i++;while((cha=buf[i])==' '){if(cha=='\n'){// fprintf(Error,"Line:%d\tinclude end without '>'\n",line);break;}i++;}if(buf[i]!=' '){if(!(isalpha(buf[i])))fprintf(Error,"Line:%d\tdefine format is wrong\n",line);//此处意思是define后必须有变量名称}}else{//在上面的break之前已经进行过i++;所以这里可以直接用while(!isalpha(buf[i])){if(buf[i]=='\0'){fprintf(Error,"Line:%d\tdefine without vatiate and name!\n",line);break;}i++;}int index=0;int space=0;//计算在上一个字母之后第几次遇到空格fputc('#',Out);while(buf[index]!='\0'){if(buf[index]!=' '){fputc(buf[index],Out);}else{space++;if(space==1&&index!=0)fputc(' ',Out);}index++;}}}}//处理头文件char head(FILE *in){char ch;if(late==0)ch=getfirstc(in);elsech=firchar;//即为#while(ch=='#'){fgets(buf,bufsize,in);//fgets()读取in文件当前一行的内容为bufsize-1个字符的内容int len=strlen(buf);buf[len-1]='\0';dealhead(buf); //这条语句执行完毕后且找到'>'就说明这行结束line++;ch=getfirstc(in);if(ch=='#')fputc('\n',Out);}return ch;}//判断关键字int keyword(char *str){int i;for(i=0;keywordTable[i]!="##";i++)if(strcmp(str,keywordTable[i])==0)return i+256; //返回关键字对应的值return -1;}//处理字母void dealAlpha()char str[50];Variate var;Sign sign;int i;int key;//记录字符串str对应的值。