编译原理实验报告四
- 格式:doc
- 大小:223.00 KB
- 文档页数:12
第1篇一、引言编译原理是计算机科学中的一个重要分支,它研究如何将高级语言编写的程序转换成计算机可以执行的机器语言。
为了深入理解编译原理的基本概念和方法,我们进行了一系列的实践操作。
本文将详细记录实践过程,并对实践结果进行分析和总结。
二、实践目标1. 理解编译原理的基本概念和流程。
2. 掌握编译器各个阶段的设计与实现方法。
3. 能够使用编译原理知识解决实际问题。
三、实践内容本次实践主要包括以下内容:1. 词法分析器(Scanner)的设计与实现:- 使用正则表达式定义词法规则。
- 设计状态转换图,实现状态转移函数。
- 编写代码,实现词法分析器。
2. 语法分析器(Parser)的设计与实现:- 设计文法规则,编写产生式。
- 使用递归下降法或LL(1)算法实现语法分析。
- 编写代码,实现语法分析器。
3. 语义分析器的设计与实现:- 定义符号表,实现符号表操作。
- 设计语义规则,实现语义分析。
- 编写代码,实现语义分析器。
4. 中间代码生成器的设计与实现:- 根据语法分析结果,生成中间代码。
- 设计中间代码格式,实现中间代码生成。
- 编写代码,实现中间代码生成器。
5. 代码优化器的设计与实现:- 分析中间代码,找出优化点。
- 实现代码优化算法,优化中间代码。
- 编写代码,实现代码优化器。
6. 目标代码生成器的设计与实现:- 根据优化后的中间代码,生成目标代码。
- 设计目标代码格式,实现目标代码生成。
- 编写代码,实现目标代码生成器。
四、实践过程1. 词法分析器:- 使用Python编写正则表达式,定义词法规则。
- 设计状态转换图,实现状态转移函数。
- 编写词法分析器代码,实现词法分析功能。
2. 语法分析器:- 设计文法规则,编写产生式。
- 使用递归下降法实现语法分析。
- 编写语法分析器代码,实现语法分析功能。
3. 语义分析器:- 定义符号表,实现符号表操作。
- 设计语义规则,实现语义分析。
- 编写语义分析器代码,实现语义分析功能。
编译原理实验报告一、实验目的本次编译原理实验的主要目的是通过实践加深对编译原理中词法分析、语法分析、语义分析和代码生成等关键环节的理解,并提高实际动手能力和问题解决能力。
二、实验环境本次实验使用的编程语言为 C/C++,开发工具为 Visual Studio 2019,操作系统为 Windows 10。
三、实验内容(一)词法分析器的设计与实现词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个具有独立意义的单词符号。
在本次实验中,我们使用有限自动机的理论来设计词法分析器。
首先,我们定义了单词的种类,包括关键字、标识符、常量、运算符和分隔符等。
然后,根据这些定义,构建了相应的状态转换图,并将其转换为程序代码。
在实现过程中,我们使用了字符扫描和状态转移的方法,逐步读取输入的字符,判断其所属的单词类型,并将其输出。
(二)语法分析器的设计与实现语法分析是编译过程的核心环节之一,其任务是在词法分析的基础上,根据给定的语法规则,判断输入的单词序列是否构成一个合法的句子。
在本次实验中,我们采用了自顶向下的递归下降分析法来实现语法分析器。
首先,我们根据给定的语法规则,编写了相应的递归函数。
每个函数对应一种语法结构,通过对输入单词的判断和递归调用,来确定语法的正确性。
在实现过程中,我们遇到了一些语法歧义的问题,通过仔细分析语法规则和调整函数的实现逻辑,最终解决了这些问题。
(三)语义分析与中间代码生成语义分析的任务是对语法分析所产生的语法树进行语义检查,并生成中间代码。
在本次实验中,我们使用了四元式作为中间代码的表示形式。
在语义分析过程中,我们检查了变量的定义和使用是否合法,类型是否匹配等问题。
同时,根据语法树的结构,生成相应的四元式中间代码。
(四)代码优化代码优化的目的是提高生成代码的质量和效率。
在本次实验中,我们实现了一些基本的代码优化算法,如常量折叠、公共子表达式消除等。
通过对中间代码进行分析和转换,减少了代码的冗余和计算量,提高了代码的执行效率。
编译原理实验报告总结一、实验目的编译原理是计算机科学中的一门重要课程,通过实验可以更深入地理解编译过程的各个阶段,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。
本次编译原理实验的目的主要有以下几点:1、加深对编译原理理论知识的理解和掌握,将抽象的概念通过实际操作转化为具体的实现。
2、培养实际动手能力和解决问题的能力,通过编写代码实现编译程序的各个模块,提高编程技能和调试能力。
3、熟悉编译程序的开发流程和工具,掌握相关编程语言和开发环境的使用。
4、培养团队合作精神和沟通能力,在实验过程中与小组成员共同探讨、解决问题,提高协作效率。
二、实验环境本次实验使用的编程语言为 C/C++,开发环境为 Visual Studio 2019。
同时,使用了一些辅助工具,如调试工具、代码管理工具等,以提高开发效率和代码质量。
三、实验内容1、词法分析任务:使用正则表达式或有限自动机实现对输入源程序的词法分析,将源程序分解为一个个单词,并识别出单词的类型,如标识符、关键字、常量、运算符等。
实现方法:采用有限自动机的方法,设计状态转移图,根据输入字符的类型进行状态转移,最终确定单词的类型。
遇到的问题及解决方法:在处理一些边界情况时,如字符串中的转义字符,出现了识别错误。
通过仔细分析正则表达式和有限自动机的规则,对代码进行了相应的修改和完善,解决了问题。
2、语法分析任务:使用自顶向下或自底向上的语法分析方法,对词法分析得到的单词序列进行语法分析,构建语法树。
实现方法:选择了自顶向下的递归下降分析法,根据语法规则编写递归函数,逐个处理单词,构建语法树。
遇到的问题及解决方法:在处理复杂的语法结构时,出现了回溯和左递归的问题,导致分析效率低下。
通过消除左递归和提取公共因子,优化了语法分析算法,提高了分析效率。
3、语义分析任务:在语法分析的基础上,进行语义分析,检查语法正确的程序是否在语义上也是正确的,如类型匹配、变量未定义等。
编译原理实验报告一、实验概述本次实验旨在设计并实现一个简单的词法分析器,即实现编译器的第一个阶段,词法分析。
词法分析器将一段源程序代码作为输入,将其划分为一个个的词法单元,并将其作为输出。
二、实验过程1.设计词法规则根据编程语言的规范和所需实现的功能,设计词法规则,以明确规定如何将源程序代码分解为一系列的词法单元。
2.实现词法分析器采用合适的编程语言,根据所设计的词法规则,实现词法分析器。
词法分析器的主要任务是读入源程序代码,并将其根据词法规则进行分解,生成对应的词法单元。
3.测试词法分析器设计测试用例,用于检验词法分析器的正确性和性能。
测试用例应包含各种情况下的源程序代码。
4.分析和修正错误根据测试过程中发现的问题,分析产生错误的原因,并进行修正。
重复测试和修正的过程,直到词法分析器能够正确处理所有测试用例。
三、实验结果我们设计了一个简单的词法分析器,并进行了测试。
测试用例涵盖了各种情况下的源程序代码,包括正确的代码和错误的代码。
经过测试,词法分析器能够正确处理所有的测试用例。
词法分析器将源程序代码分解为一系列的词法单元,每个词法单元包含了单词的种类和对应的值。
通过对词法单元的分析,可以进一步进行语法分析和语义分析,从而完成编译过程。
四、实验总结通过本次实验,我深入了解了编译原理的词法分析阶段。
词法分析是编译器的第一个重要阶段,它将源程序代码分解为一个个的词法单元,为后续的语法分析和语义分析提供基础。
在实现词法分析器的过程中,我学会了如何根据词法规则设计词法分析器的算法,并使用编程语言实现词法分析器。
通过测试和修正,我掌握了调试和错误修复的技巧。
本次实验的经验对我今后的编程工作有很大帮助。
编译原理是计算机科学与技术专业的核心课程之一,通过实践能够更好地理解和掌握其中的概念和技术。
我相信通过进一步的学习和实践,我能够在编译原理领域取得更大的成果。
编译原理实验报告一、实验目的编译原理是计算机科学中的重要学科,它涉及到将高级编程语言转换为计算机能够理解和执行的机器语言。
本次实验的目的是通过实际操作和编程实践,深入理解编译原理中的词法分析、语法分析、语义分析以及中间代码生成等关键环节,提高我们对编译过程的认识和编程能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
此外,还使用了一些相关的编译工具和调试工具,如 GDB 等。
三、实验内容(一)词法分析器的实现词法分析是编译过程的第一步,其任务是将输入的源程序分解为一个个单词符号。
在本次实验中,我们使用有限自动机的理论来设计和实现词法分析器。
首先,定义了各种单词符号的类别,如标识符、关键字、常量、运算符等。
然后,根据这些类别设计了相应的状态转换图,并将其转换为代码实现。
在实现过程中,使用了正则表达式来匹配输入字符串中的单词符号。
对于标识符和常量等需要进一步处理的单词符号,使用了相应的规则进行解析和转换。
(二)语法分析器的实现语法分析是编译过程的核心环节之一,其任务是根据给定的语法规则,分析输入的单词符号序列是否符合语法结构。
在本次实验中,我们使用了递归下降的语法分析方法。
首先,根据实验要求定义了语法规则,并将其转换为相应的递归函数。
在递归函数中,通过对输入单词符号的判断和处理,逐步分析语法结构。
为了处理语法错误,在分析过程中添加了错误检测和处理机制。
当遇到不符合语法规则的输入时,能够输出相应的错误信息,并尝试进行恢复。
(三)语义分析及中间代码生成语义分析的目的是对语法分析得到的语法树进行语义检查和语义处理,生成中间代码。
在本次实验中,我们使用了三地址码作为中间代码的表示形式。
在语义分析过程中,对变量的定义和使用、表达式的计算、控制流语句等进行了语义检查和处理。
对于符合语义规则的语法结构,生成相应的三地址码指令。
四、实验步骤(一)词法分析器的实现步骤1、定义单词符号的类别和对应的正则表达式。
国开电大编译原理实验4:语法分析实
验报告
1. 实验目的
本实验的目的是研究和掌握语法分析的原理和实现方法。
2. 实验内容
本次实验主要包括以下内容:
- 设计并实现自顶向下的LL(1)语法分析器;
- 通过语法分析器对给定的输入串进行分析,并输出相应的分析过程;
- 编写测试用例,验证语法分析器的正确性。
3. 实验步骤
3.1 设计LL(1)文法
首先,根据实验要求和给定的语法规则,设计LL(1)文法。
3.2 构建预测分析表
根据所设计的LL(1)文法,构建预测分析表。
3.3 实现LL(1)语法分析器
根据预测分析表,实现自顶向下的LL(1)语法分析器。
3.4 对输入串进行分析
编写程序,通过LL(1)语法分析器对给定的输入串进行分析,并输出相应的分析过程和结果。
3.5 验证语法分析器的正确性
设计多组测试用例,包括正确的语法串和错误的语法串,验证语法分析器的正确性和容错性。
4. 实验结果
经过实验,我们成功设计并实现了自顶向下的LL(1)语法分析器,并对给定的输入串进行了分析。
实验结果表明该语法分析器具有较好的准确性和容错性。
5. 实验总结
通过本次实验,我们对语法分析的原理和实现方法有了更深入的了解。
同时,我们也学会了如何设计并实现自顶向下的LL(1)语
法分析器,并验证了其正确性和容错性。
这对于进一步研究编译原理和深入理解编程语言的语法结构具有重要意义。
6. 参考资料
- 《编译原理与技术》
- 课程实验文档及代码。
编译原理实验报告编译原理实验报告一、实验目的1. 了解编译器的基本原理和工作过程;2. 掌握编译器设计和实现的基本方法和技巧;3. 通过设计和实现一个简单的编译器,加深对编程语言和计算机系统的理解和认识。
二、实验原理编译器是将高级语言程序翻译成机器语言程序的一种软件工具。
它由编译程序、汇编程序、链接程序等几个阶段组成。
本次实验主要涉及到的是编译程序的设计和实现。
编译程序的基本原理是将高级语言程序转换为中间代码,再将中间代码转换为目标代码。
整个过程可以分为词法分析、语法分析、语义分析、代码生成和代码优化几个阶段。
三、实验内容本次实验的设计目标是实现一个简单的四则运算表达式的编译器。
1. 词法分析根据规定的语法规则,编写正则表达式将输入的字符串进行词法分析,将输入的四则运算表达式划分成若干个单词(Token),例如:运算符、操作数等。
2. 语法分析根据定义的语法规则,编写语法分析程序,将词法分析得到的Token序列还原成语法结构,构建抽象语法树(AST)。
3. 语义分析对AST进行遍历,进行语义分析,判断表达式是否符合语法规则,检查语义错误并给出相应的提示。
4. 代码生成根据AST生成目标代码,目标代码可以是汇编代码或者机器码。
四、实验过程和结果1. 首先,根据输入的表达式,进行词法分析。
根据所定义的正则表达式,将输入的字符串划分成Token序列。
例如:输入表达式“2+3”,经过词法分析得到的Token序列为["2", "+", "3"]。
2. 然后,根据语法规则,进行语法分析。
根据输入的Token序列,构建抽象语法树。
3. 接着,对抽象语法树进行语义分析。
检查表达式是否符合语法规则,给出相应的提示。
4. 最后,根据抽象语法树生成目标代码。
根据目标代码的要求,生成汇编代码或者机器码。
五、实验总结通过本次实验,我对编译器的工作原理有了更深入的认识,掌握了编译器设计和实现的基本方法和技巧。
一、实验目的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)定义语义规则,包括类型检查、作用域检查等。
一、实验名称编译原理实验二、实验目的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. 本次实验让我认识到编译原理在软件开发中的重要性,以及编译器在代码生成和优化方面的作用。
第1篇一、实验目的1. 理解编译原理的基本概念和原理。
2. 掌握编译过程的基本步骤,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。
3. 熟悉编译器开发工具和环境的使用。
4. 通过实验加深对编译原理的理解,提高编程能力。
二、实验内容本次实验选择了北理工编译原理课程中的一个典型实验项目:简单算术表达式编译器的设计与实现。
三、实验原理编译原理是计算机科学中研究将源代码转换为机器代码的理论和实践的学科。
编译过程主要包括以下几个阶段:1. 词法分析:将源代码中的字符序列转换为一个个有意义的记号(Token)。
2. 语法分析:根据语言的语法规则,对记号序列进行结构分析,判断其是否符合语法规则。
3. 语义分析:对语法分析后的抽象语法树(AST)进行语义检查,确保其符合语义规则。
4. 中间代码生成:将AST转换为中间代码,便于进行代码优化。
5. 代码优化:对中间代码进行优化,提高目标代码的执行效率。
6. 目标代码生成:将优化后的中间代码转换为特定机器上的目标代码。
四、实验步骤1. 词法分析器设计:- 设计词法分析器,识别算术表达式中的各种记号,如数字、运算符、括号等。
- 使用有限状态自动机(FSM)或正则表达式进行词法分析。
2. 语法分析器设计:- 设计语法分析器,根据算术表达式的语法规则,对词法分析器生成的记号序列进行语法分析。
- 使用递归下降分析、LL(1)分析或LR(1)分析等方法进行语法分析。
3. 语义分析器设计:- 设计语义分析器,对语法分析后的抽象语法树进行语义检查,确保其符合语义规则。
- 检查运算符优先级、运算符结合性、类型匹配等问题。
4. 中间代码生成:- 设计中间代码生成器,将抽象语法树转换为中间代码。
- 选择合适的中间代码表示方法,如三地址代码、四地址代码等。
5. 代码优化:- 设计代码优化器,对中间代码进行优化,提高目标代码的执行效率。
- 采用常见的优化技术,如常数折叠、死代码消除、循环优化等。
编译原理实验报告题目表达式语法分析程序的构造学院专业班级学号学生姓名指导教师西安思源学院教务处制二〇一年实验四表达式语法分析程序的构造一、实验目的1 掌握C++语言编译的语法分析程序2 分别掌握LL(1)、算符优先、LR等语法分析方法的构造。
二、实验环境Microsoft Visual C++ 6.0三、实验内容给定某一文法,试构造其简单优先矩阵(或LL(1)矩阵),并编制程序。
给出相应句子的语法分析过程,判其正确性。
例如:给定文法G:E→T E1E1→+TE1/εT→FT1T1→*F/εF→id/(E)(1)先构造其SELECT集合,判定其是否为LL(1)文法(2)是则构造其分析表(3)给出句子id+id*id$的语法分析过程四、设计说明LL(1):#include<stdio.h>#include<string>typedef int datatype;char a[N3]={'$','E'};char c[N4]={'$','z','*','z','+','z'};char *B[N1][N2]={" ", "z ", "+ " , "*" , "(" , ")", "$ ","E " , "xT", " " , " ", "xT", " ", " ","x ", " ", "xT+", " ", " ", "", "","T ", "yF", " ", " ", "yF ", " ", " ","y ", " ", "", "yF*", " ", "" , "","F ", "z", " ", " ", ")E(", " ", " ",};void FXB(){int i,j;cout<<"分析表为: "<<endl;for(i=0;i<N1;i++){for(j=0;j<N2;j++){cout<<B[i][j]<<" "; }cout<<endl;}}void WF(){ int s;char *w[5]={"E->TE'","E'->TE'/e","T->FT'","T'->*F/e","F->(E)/id"}; cout<<"文法为: "<<endl;for(s=0;s<5;s++){cout<<w[s]<<endl;}}void SELECT(){cout<<"SELECT集合为:"<<endl;cout<<"1. select(E->TE')=FIRST(TE')={(,id}"<<endl;cout<<"2. select(E'->+TE')=FIRST(+TE')={+}"<<endl;cout<<"3. select(E'->e)=FIRST(E)UFOLLOW(E')-{e}={$,)}"<<endl;cout<<"4. select(T->FT')={(,id}"<<endl;cout<<"5. select(T'->*F)={*}"<<endl;cout<<"6. select(T'->e)={+,),$}"<<endl;cout<<"7. select(F->(E))={(}"<<endl;cout<<"8. select(F->id)={id}"<<endl;cout<<"为LL(1)文法"<<endl;}void showa(){ int i;cout<<"分析栈为:"<<endl;for(i=0;i<N3;i++){if(a[i]!=0) cout<<a[i];}cout<<endl;}void showb(){ int j;cout<<"输入流为:"<<endl;for(j=0;j<N4;j++){if(c[j]!=NULL) cout<<c[j];}cout<<endl;}void FX(){cout<<"分析如下:"<<endl;showa();showb();int i,j,m,n;i=I();j=J();m=M();n=N();while(a[m]!='$'){if ((a[m]!=c[n])&&(B[i][j]!=NULL)){a[m]=B[i][j][0];a[m+1]=B[i][j][1];a[m+2]=B[i][j][2];showa();showb();m=M();n=N();if(a[m]==c[n]){ }else{m=M();n=N();i=I();j=J();}}else if(a[m]==c[n]){a[m]=NULL; c[n]=NULL;showa();showb();m=M();n=N();i=I();j=J();}}}void main(){WF();SELECT();FXB();FX();}算符优先:void main(){ int i,j,k=0;printf("请输入文法规则数:");scanf("%d",&r);printf("请输入文法规则:\n");for(i=0;i<r;i++){scanf("%s",st[i]);//存储文法规则,初始化FIRSTVT集和LASTVT集first[i][0]=0;/*first[i][0]和last[i][0]分别表示st[i][0]非终极符的FIRSTVT集和LASTVT集中元素的个数*/last[i][0]=0;}for(i=0;i<r;i++) //判断文法是否合法{for(j=0;st[i][j]!='\0';j++){if(st[i][0]<'A'||st[i][0]>'Z'){printf("不是算符文法!\n"); exit(-1);}if(st[i][j]>='A'&&st[i][j]<='Z'){if(st[i][j+1]>='A'&&st[i][j+1]<='Z'){printf("不是算符文法!\n");exit(-1);}}}}for(i=0;i<r;i++){for(j=0;st[i][j]!='\0';j++){if((st[i][j]<'A'||st[i][j]>'Z')&&st[i][j]!='-'&&st[i][j]!='>'&&st[i][j]!='|')lable[k++]=st[i][j];}}lable[k]='#';lable[k+1]='\0'; table();printf("每个非终结符的FIRSTVT集为:\n"); //输出每个非终结符的FIRSTVT集for(i=0;i<r;i++){ printf("%c: ",st[i][0]);for(j=0;j<first[i][0];j++){printf("%c ",first[i][j+1]);}printf("\n");}printf("每个非终结符的LASTVT集为:\n"); //输出每个非终结符的LASTVT集for(i=0;i<r;i++){ printf("%c: ",st[i][0]);for(j=0;j<last[i][0];j++){printf("%c ",last[i][j+1]);}printf("\n");}printf("算符优先分析表如下:\n");for(i=0;lable[i]!='\0';i++)printf("\t%c",lable[i]);printf("\n");for(i=0;i<k+1;i++){ printf("%c\t",lable[i]);for(j=0;j<k+1;j++){printf("%c\t",data[i][j]);}printf("\n");}printf("请输入文法输入符号串以#结束:");scanf("%s",input);deal();}int deal(){ int i,j;int x,y;int z; //输入串的长度k=1;s[k]='#'; //栈置初值for(i=0;input[i]!='\0';i++); //计算输入串的长度z=i--;i=0;while((a=input[i])!='\0'){ if(zhongjie(s[k]))j=k;elsej=k-1;x=xiabiao(s[j]);y=xiabiao(a);if(data[x][y]=='>'){ out(1,k,s);printf("%c",a);out(i+1,z,input);printf("规约\n");do{ q=s[j];if(zhongjie(s[j-1]))j=j-1;else j=j-2;x=xiabiao(s[j]);y=xiabiao(q);}while(data[x][y]!='<');int m,n,N;for(m=j+1;m<=k;m++){for(N=0;N<r1;N++)for(n=1;string[N][n]!='\0';n++){if(!zhongjie(s[m])&&!zhongjie(string[N][n])){if(zhongjie(s[m+1])&&zhongjie(string[N][n+1])&&s[m+1]==string[N][n+1]){s[j+1]=string[N][0]; break;}}elseif(zhongjie(s[m]))if(s[m]==string[N][n]){s[j+1]=string[N][0]; break;}}}k=j+1;if(k==2&&a=='#'){ out(1,k,s);printf("%c",a);out(i+1,z,input);printf("结束\n");printf("输入串符合文法的定义!\n");return 1; //输入串符合文法的定义}}elseif(data[x][y]=='<'||data[x][y]=='='){ //移进out(1,k,s);printf("%c",a);out(i+1,z,input);printf("移进\n");k++;s[k]=a;i++;}else{printf("\nflase");return 0;}}printf("\nflase");return 0;}SLR(1):void main(){string a[12][9]={{"s5","e","e","s4","e","e", "1","2","3"},{"e","s6","e","e","e","ACC", "e","e","e"},{"e","r2","s7","e","r2","r2", "e","e","e"},{"e","r4","r4","e","r4","r4", "e","e","e"},{"s5","e","e","s4","e","e", "8","2","3"},{"e","r6","r6","e","r6","r6", "e","e","e"},{"s5","e","e","s4","e","e", "e","9","3"},{"s5","e","e","s4","e","e", "e","e","a"},{"e","s6","e","e","sb","e", "e","e","e"},{"e","r1","s7","e","r1","r1", "e","e","e"},{"e","r3","r3","e","r3","r3", "e","e","e"},{"e","r5","r5","e","r5","r5", "e","e","e"}};string s[7]={"","E6","E2","T6", "T2","F6","F2"};char c,cc;string myss="";int flag=0; //看数字或标示符是否结束list<char> ss,ll;list<char>::iterator myit;cout<<"请输入要分析的表达式:"<<endl;while((c=getchar())!='\n'){flag=0;while(isdigit(c)||isalpha(c)){flag=1;c=getchar();}if(flag) ss.push_back('I');if(c=='\n')break;ss.push_back(c);}ss.push_back('$');ll.push_back('$');ll.push_back('0');while(1){if(get(ss.front())!=-1) //输入栈myss=a[getI(ll.back())][get(ss.front())];else {cout<<"错误!"<<endl;break;}if(myss.at(0)=='s') {ll.push_back(ss.front()); //i进入ss.pop_front(); //将I删除ll.push_back(myss.at(1)); //5进入}else if(myss.at(0)=='r'){for(int i=0;i<s[myss.at(1)-48].at(1)-48;i++)ll.pop_back(); //出栈n位cc=ll.back(); //保存当前状态ll.push_back(s[myss.at(1)-48].at(0)); //大写字母ll.push_back(a[getI(cc)][get(ll.back())].at(0));}else if(myss.at(0)=='e') {cout<<"错误!"<<endl;break;}else if(myss.at(0)=='A') {cout<<"匹配成功!"<<endl;break;}for(myss="",myit=ll.begin();myit!=ll.end();myit++)myss+=*myit;cout<<left<<setw(18)<<myss;for(myss="",myit=ss.begin();myit!=ss.end();myit++)myss+=*myit;cout<<right<<setw(16)<<myss;cout<<endl;}cout<<"分析完毕!"<<endl;}运行结果:输入流:算符优先:五、实验总结通过编写算法,对三种方法都有了更好的了解,对编译原理这门课也有了更清晰的认识。