编译原理实践7—语法出错处理

合集下载

C语言程序设计中的常见错误和解决

C语言程序设计中的常见错误和解决

C语言程序设计中的常见错误和解决在C语言程序设计中,很多初学者经常会遇到一些常见的错误。

这些错误可能是语法错误、逻辑错误或者是其他一些常见问题导致的。

本文将介绍一些经常出现的C语言程序设计错误,并提供相应的解决方法,帮助读者更好地理解和掌握C语言编程。

一、语法错误1. 括号未匹配括号未匹配是C语言中常见的语法错误之一。

在编写代码时,经常会使用到括号,如if语句、for循环等。

如果不小心忘记关闭某个括号,就会导致括号未匹配的错误。

解决方法:仔细检查代码中的括号是否匹配,并确保每个左括号都有相应的右括号。

2. 分号丢失分号丢失是C语言中另一个常见的语法错误。

在C语言中,分号用于分隔语句,如果遗漏了分号,编译器就无法识别出语句的结束。

解决方法:检查每一行语句的末尾,确保每个语句都以分号结尾。

3. 变量未声明在使用变量之前,必须先声明该变量。

如果没有先声明变量就直接使用,编译器将无法识别该变量,从而报错。

解决方法:在使用变量之前,先进行变量声明。

二、逻辑错误1. 循环控制条件错误在编写循环语句时,控制条件的错误是常见的逻辑错误。

如果循环的控制条件错误,循环可能无法正常结束或者根本无法执行。

解决方法:仔细检查循环的控制条件,确保条件符合预期,并在循环体内更新循环变量。

2. 数组越界访问在C语言中,数组的索引从0开始,通过索引访问数组元素时,如果索引超出了数组的范围,就会导致数组越界访问的错误。

解决方法:确保数组索引在正确的范围内,避免越界访问。

如果需要遍历数组,可以使用循环来控制数组的访问范围。

三、其他常见问题及解决方法1. 变量类型不匹配在赋值操作或者表达式计算时,如果不同类型的变量之间进行操作,则会导致变量类型不匹配的错误。

解决方法:确保操作的变量类型相同或者进行强制类型转换,以保证变量类型的匹配。

2. 内存泄漏在C语言中,手动分配内存的操作是常见的。

如果分配了内存空间,但在使用完毕后未及时释放,就会导致内存泄漏。

C语言技术中常见错误及错误处理策略

C语言技术中常见错误及错误处理策略

C语言技术中常见错误及错误处理策略在学习和使用C语言技术的过程中,常常会遇到各种各样的错误。

这些错误可能是由于语法错误、逻辑错误或者其他各种原因引起的。

本文将介绍一些常见的C 语言错误,并提供相应的错误处理策略,帮助读者更好地理解和处理这些错误。

一、语法错误语法错误是最常见的C语言错误之一。

当我们在编写C语言程序时,如果违反了C语言的语法规则,编译器将无法正确解析代码,从而产生语法错误。

常见的语法错误包括拼写错误、缺少分号、括号不匹配等。

对于语法错误,我们可以通过仔细检查代码,逐行排查错误的位置。

在编写代码的过程中,可以使用IDE(集成开发环境)或者文本编辑器的语法高亮功能来帮助我们发现潜在的语法错误。

此外,可以借助编译器的错误提示信息,定位错误的具体位置。

二、逻辑错误逻辑错误是指程序在运行时产生的错误,这些错误通常是由于程序的逻辑错误或者算法错误引起的。

比如,程序输出的结果与预期不符,或者程序出现死循环等。

对于逻辑错误,我们可以通过调试工具来分析程序的执行过程,找出错误的原因。

调试工具可以帮助我们逐行执行代码,查看变量的值,以及跟踪程序的执行流程。

通过调试工具,我们可以发现潜在的逻辑错误,并进行相应的修复。

此外,良好的编程习惯也可以帮助我们避免逻辑错误的发生。

比如,我们可以使用有意义的变量名、注释代码等,提高代码的可读性和可维护性。

同时,我们还可以编写单元测试用例,验证程序的正确性。

三、内存错误内存错误是C语言程序中常见的错误之一。

在C语言中,我们需要手动管理内存的分配和释放。

如果在程序中存在内存泄漏、越界访问、空指针引用等问题,就会导致内存错误。

为了避免内存错误,我们可以使用一些编程技巧和规范。

比如,我们可以使用动态内存分配函数(如malloc、calloc等)来申请内存,并在使用完毕后及时释放。

同时,我们可以使用指针检查技术,避免空指针引用。

此外,我们还可以使用边界检查技术,避免越界访问。

计算机科学专业编程实践中的常见错误及解决方法总结

计算机科学专业编程实践中的常见错误及解决方法总结

计算机科学专业编程实践中的常见错误及解决方法总结在计算机科学专业的学习和实践过程中,编程是一项至关重要的技能。

然而,由于编程的复杂性和繁琐性,常常容易出现一些常见的错误。

本文将总结计算机科学专业编程实践中的常见错误,并为这些错误提供解决方法。

一、语法错误语法错误是编程中最常见的错误之一。

这些错误通常是由于编程语言的语法规则没有被遵循而引起的。

为了避免语法错误的发生,程序员应该仔细学习并理解所使用的编程语言的语法规则。

解决方法:1. 仔细检查代码:在编写代码之后,程序员应该仔细检查代码,并确保其中没有语法错误。

可以使用集成开发环境(IDE)或者代码编辑器的语法检查功能来帮助发现并纠正语法错误。

2. 学习和掌握编程语言的语法规则:只有通过学习和掌握编程语言的语法规则,才能更好地避免语法错误的发生。

可以参考编程语言的官方文档、书籍和在线教程等方式来加深对语法规则的理解。

二、逻辑错误逻辑错误是在程序中存在逻辑错误或者错误的算法导致的错误。

这些错误往往难以被发现和纠正,因为程序可以正常地运行,但得不到期望的结果。

解决逻辑错误需要程序员具备较强的逻辑思维和问题解决能力。

解决方法:1. 仔细分析代码:程序员应该对代码进行仔细分析,了解代码中的每一行代码的作用和影响。

通过这种方式,可以更容易地发现逻辑错误的存在。

2. 使用调试工具:调试工具是解决逻辑错误的有力助手。

通过使用调试工具,可以逐行执行代码,并观察程序的运行过程。

当程序无法达到预期结果时,可以通过调试工具来定位并修复逻辑错误。

3. 与他人合作:如果遇到难以解决的逻辑错误,可以与其他程序员进行交流,共同寻找解决方法。

他人的不同思路和观点可能会帮助我们找到问题的根源和解决办法。

三、内存管理错误内存管理错误是在编程过程中常见的错误类型之一。

这些错误通常是由于对内存的使用不当而引起的,比如内存泄漏和野指针等问题。

解决方法:1. 深入学习内存管理知识:为了避免内存管理错误的发生,程序员应该深入学习和理解内存管理的知识。

C语言技术使用中的常见问题及解决方案

C语言技术使用中的常见问题及解决方案

C语言技术使用中的常见问题及解决方案C语言作为一种高级编程语言,广泛应用于软件开发和系统编程中。

然而,即使对于有经验的开发人员来说,使用C语言进行编码也可能遇到一些常见问题。

本文将介绍一些常见的C语言问题,并提供相应的解决方案,旨在帮助读者更好地理解和使用C语言。

问题一:语法错误和语义错误在使用C语言编写代码时,常常会遇到语法错误和语义错误。

语法错误指的是违反C语言语法规则的错误,通常由于拼写错误、缺少分号或括号不匹配等引起。

而语义错误则是程序逻辑有问题,导致程序无法正常执行或产生错误结果。

解决方案:1. 对于语法错误,可以使用编译器提供的错误提示信息来定位问题,仔细检查代码中的拼写、语法规则和括号、分号的匹配情况。

2. 对于语义错误,需要仔细检查代码逻辑,排查潜在的问题。

可以使用调试器或打印调试信息的方式来辅助查找错误。

问题二:内存管理问题在C语言中,开发人员需要手动管理内存,包括分配和释放内存。

如果不正确地进行内存管理,就可能导致内存泄漏或访问无效的内存,进而引发程序崩溃或产生不可预测的结果。

解决方案:1. 在使用动态内存分配函数(如malloc)分配内存后,务必记得使用对应的释放函数(如free)释放内存。

2. 确保在释放内存之前,不会再次引用该内存地址,避免出现悬空指针问题。

3. 可以使用内存分析工具来检测内存泄漏问题,如Valgrind、Electric Fence等。

问题三:数组越界访问在C语言中,数组越界访问是一种常见的编程错误。

当访问超出数组边界的索引时,会导致程序崩溃或产生不可预测的结果。

解决方案:1. 确保在访问数组元素之前,索引值在合法的范围内,即大于等于0且小于数组长度。

2. 如果需要迭代数组,使用循环时确保循环变量在合法的范围内,避免数组越界。

问题四:指针问题指针是C语言的重要特性,但也容易带来一些难以排查的问题。

比如使用未初始化的指针、野指针或者指针运算出错等。

解决方案:1. 在使用指针之前,务必进行初始化,以避免未初始化指针带来的问题。

查找和排除程序编译中的错误(主要是语法错误)

查找和排除程序编译中的错误(主要是语法错误)

查找和排除程序编译中的错误(主要是语法错误)(在建设和不断修改中,欢迎提出意见)学生:怎么办啊?我的程序编译通不过,出了这么多错误信息!老师:不要慌!你先集中力量找出第一个错误的真正原因,并将这个问题解决掉。

然后再分析后面的错误。

如果看不清楚下面的问题,那么就重新编译一下,并按照同一个方式重复去做。

不能通编译过的程序实际上还不是合法的程序,因为它不满足C语言对于程序的基本要求。

检查语法错误的第一要义:集中力量检查系统发现的第一个错误,弄清并改正它。

在编译过程中系统发现的错误主要有两类:基本语法错误和上下文关系错误。

这些错误都在表面上,可以直接看得见。

也是比较容易弄清,比较容易解决的。

关键是需要熟悉C语言的语法规定和有关上下文关系的规定,按照这些规定检查程序正文,看看存在什么问题。

编译中系统发现错误都能指出错误的位置。

不同系统在这方面的能力有差异,在错误定位的准确性方面有所不同。

有的系统只能指明发现错误的行,有的系统还能够指明行内位置。

一般说,系统指明的位置未必是真实错误出现的位置。

通常情况是错误出现在前,而系统发现错误在后,因为它检查到实际错误之后的某个地方,才能确认出了问题,因此报出错误信息。

要确认第一个错误的原因,应该从系统指明的位置开始,在那里检查,并从那里开始向前检查。

系统的错误信息中都包含一段文字,说明它所认定的错误原因。

应该仔细阅读这段文字,通常它提供了有关错误的重要线索。

但也应该理解,错误信息未必准确,有时错误确实存在,但系统对错误的解释也可能不对。

也就是说,在查找错误时,既要重视系统提供的错误信息,又不应为系统的错误信息所束缚。

发现了问题,要想清楚错误的真正原因,然后再修改。

不要蛮干。

在这时的最大诱惑就是想赶快改,看看错误会不会消失。

但是蛮干的结果常常是原来的错误没有弄好,又搞出了新的错误。

另一个值得注意的地方:程序中的一个语法错误常常导致编译系统产生许多错误信息。

如果你改正了程序中一个或几个错误,下面的弄不清楚了,那么就应该重新编译。

查找和排除程序编译中的错误(主要是语法错误)

查找和排除程序编译中的错误(主要是语法错误)

查找和排除程序编译中的错误主要是语法错误在建设和不断修改中欢迎提出意见学生怎么办啊我的程序编译通不过出了这么多错误信息老师不要慌你先集中力量找出第一个错误的真正原因并将这个问题解决掉。

然后再分析后面的错误。

如果看不清楚下面的问题那么就重新编译一下并按照同一个方式重复去做。

不能通编译过的程序实际上还不是合法的程序因为它不满足C语言对于程序的基本要求。

检查语法错误的第一要义集中力量检查系统发现的第一个错误弄清并改正它。

在编译过程中系统发现的错误主要有两类基本语法错误和上下文关系错误。

这些错误都在表面上可以直接看得见。

也是比较容易弄清比较容易解决的。

关键是需要熟悉C语言的语法规定和有关上下文关系的规定按照这些规定检查程序正文看看存在什么问题。

编译中系统发现错误都能指出错误的位置。

不同系统在这方面的能力有差异在错误定位的准确性方面有所不同。

有的系统只能指明发现错误的行有的系统还能够指明行内位置。

一般说系统指明的位置未必是真实错误出现的位置。

通常情况是错误出现在前而系统发现错误在后因为它检查到实际错误之后的某个地方才能确认出了问题因此报出错误信息。

要确认第一个错误的原因应该从系统指明的位置开始在那里检查并从那里开始向前检查。

系统的错误信息中都包含一段文字说明它所认定的错误原因。

应该仔细阅读这段文字通常它提供了有关错误的重要线索。

但也应该理解错误信息未必准确有时错误确实存在但系统对错误的解释也可能不对。

也就是说在查找错误时既要重视系统提供的错误信息又不应为系统的错误信息所束缚。

发现了问题要想清楚错误的真正原因然后再修改。

不要蛮干。

在这时的最大诱惑就是想赶快改看看错误会不会消失。

但是蛮干的结果常常是原来的错误没有弄好又搞出了新的错误。

另一个值得注意的地方程序中的一个语法错误常常导致编译系统产生许多错误信息。

如果你改正了程序中一个或几个错误下面的弄不清楚了那么就应该重新编译。

改正一处常常能消去许多错误信息行。

解决语法错误常见语法错误1缺少语句、声明、定义结束的分号。

编译原理中处理语法错误问题的研究

编译原理中处理语法错误问题的研究摘要:本文分析了编译系统以及其错误处理能力对于程序设计语言的重要性,对其中处理语法错误问题进行了深入研究,并从语法错误的诊察与报告,到利用递归下降分析法对错误进行恢复和纠正处理,直至最后的限制重复报告错误信息及其中涉及的关键技术进行了介绍,从而帮助学习者和开发者牢固掌握相关的理论和技术。

关键词:编译系统;语法错误处理;递归下降分析法1 前言在计算机应用领域,目前多数用户都是通过高级语言实现所需要的计算。

而对于任何高级语言来说,其编译系统内容丰富,具有严密的逻辑性,对提高学习者和开发者的计算机软件素质具有很大作用,使其不但能认识计算机信息处理的实质,还可以综合运用所学的软件设计技术来分析解决问题[1]。

因此,编译系统是计算机系统软件最重要的组成部分之一,也是用户最直接关心的工具之一,它不但要接受程序语言的所有标准定义,以便源代码实现跨平台的可移植性,还必须生成高效、正确的目标代码。

因此编译系统本身是一个大而复杂的程序,值得我们深入分析研究。

我们知道,在编译原理的学习和编译系统的构建过程中,语法分析是其中最为重要的一个组成部分。

而在实际的编译系统中,语法分析器的错误处理能力与其构造原理和技术一样重要,这通常是编译原理教学环节中容易忽视的地方,不利于学习者进行实际的编译系统的开发工作。

因此,本文对C++编译系统中递归下降的语法分析过程进行了研究,找到了发现并纠正语法错误问题的有效方法。

2 语法错误编程人员在编写程序时,很难一次就将程序写的完美无误,尤其是一些比较复杂的程序,往往会存在程序错误。

程序错误的种类有很多,比如违反语言的语法和语义规定的错误,源程序超出了计算机系统的某种限制而引发的错误,等等。

其中语法错误是指源程序中含有不符合语法规则的成分时所产生的错误,一般是有关语言结构上的错误,如单词拼写错、表达式中缺少操作数、begin和end不匹配等。

语法分析结果的质量将直接影响到编译系统后期各阶段的工作,因此,为了帮助编程人员发现并纠正这一阶段可能出现的错误,编译系统的语法分析器应该具有错误处理的能力,其不但可以对语法上正确的源程序进行正确的编译,同时还能够对有错误的源程序报错,甚至在一定程度上对错误进行改正[2]。

c查找编译出错的语句

c查找编译出错的语句(实用版)目录1.编译出错的原因2.如何查找编译出错的语句3.编译出错时的解决方法正文在编程过程中,有时候我们会遇到编译出错的情况,这可能会让我们感到困扰。

不过,请不要担心,接下来我将为大家介绍如何查找编译出错的语句,并给出相应的解决方法。

一、编译出错的原因编译出错的原因有很多,常见的有以下几种:1.语法错误:代码中存在语法错误,导致编译器无法识别。

2.拼写错误:变量名、函数名或关键字拼写错误。

3.缺少或引用错误:代码中引用了不存在的变量、函数或库,或者引用错误。

4.逻辑错误:代码逻辑错误,导致程序运行结果不符合预期。

二、如何查找编译出错的语句1.查看错误信息当程序编译出错时,编译器会输出相应的错误信息。

我们需要仔细阅读这些信息,以便快速定位出错位置。

2.使用编辑器或 IDE 的查找功能许多编辑器和集成开发环境(IDE)都提供了查找功能,可以帮助我们快速定位到出错的语句。

我们可以使用这些工具查找错误信息中提到的文件和行数,进而找到具体的出错语句。

3.分析代码逻辑如果错误信息不够明确,我们可以尝试分析代码逻辑,找出可能出错的地方。

这需要我们逐行阅读代码,理解代码的运行逻辑,以便找到问题所在。

三、编译出错时的解决方法1.修复语法错误如果编译出错是由于语法错误导致的,我们需要仔细检查代码,找到错误的地方,并进行修正。

2.检查拼写错误检查变量名、函数名和关键字的拼写,确保没有拼写错误。

如果有拼写错误,需要进行修改。

3.修复引用错误如果编译出错是由于引用错误导致的,我们需要找到引用错误的地方,并进行修复。

这可能包括修改引用变量、函数或库的名称,或者确保引用的库已经正确导入。

4.修改代码逻辑如果编译出错是由于代码逻辑错误导致的,我们需要分析代码逻辑,找到问题所在,并进行修改。

总之,在编程过程中遇到编译出错时,我们需要保持冷静,通过查看错误信息、查找出错语句和采取相应的解决方法,来解决这些问题。

如何解决C语言中的编译错误与警告

如何解决C语言中的编译错误与警告C语言是一种广泛应用于系统编程和嵌入式开发的编程语言,它的编译过程中常常会出现各种错误和警告。

这些错误和警告可能会导致程序无法正确编译或者在运行时出现问题。

因此,解决C语言中的编译错误与警告是每个程序员都需要掌握的重要技能。

本文将介绍一些常见的编译错误和警告,并提供一些解决方法。

一、理解编译错误和警告的含义在解决编译错误和警告之前,我们首先需要理解它们的含义。

编译错误是指在编译过程中发现的语法错误或者逻辑错误,这些错误会导致程序无法正确编译。

编译警告是指在编译过程中发现的一些潜在的问题,虽然不会导致程序无法编译,但可能会导致程序在运行时出现问题。

二、常见的编译错误和警告1. 语法错误:语法错误是最常见的编译错误之一,它通常是由于编程人员在编写代码时遗漏了分号、括号不匹配等导致的。

解决语法错误的方法是仔细检查代码,确保语法正确。

2. 未声明的标识符:当使用一个未声明的标识符时,编译器会报错。

解决这个问题的方法是在使用标识符之前先进行声明或者引入相应的头文件。

3. 类型不匹配:类型不匹配是指在赋值或者函数调用过程中,变量的类型与期望的类型不一致。

解决这个问题的方法是检查变量的类型,并进行相应的类型转换。

4. 未使用的变量:编译器会对未使用的变量发出警告,这可能是由于代码中存在一些无用的变量。

解决这个问题的方法是删除未使用的变量或者对其进行使用。

5. 未初始化的变量:未初始化的变量可能导致程序在运行时出现未定义的行为。

解决这个问题的方法是在使用变量之前先进行初始化。

6. 函数返回值不匹配:函数的返回值类型与函数定义时声明的返回值类型不一致会导致编译错误。

解决这个问题的方法是检查函数的返回值类型,并进行相应的修改。

7. 潜在的内存泄漏:编译器可能会对未释放的内存发出警告,这可能会导致内存泄漏。

解决这个问题的方法是在使用完内存后及时释放。

三、解决编译错误和警告的方法1. 仔细阅读编译错误和警告信息:编译器通常会提供详细的错误和警告信息,我们应该仔细阅读这些信息,找出问题所在。

编程语言语法中的异常处理和错误处理机制

编程语言语法中的异常处理和错误处理机制在编程领域,异常处理和错误处理机制是非常重要的概念。

无论是在开发大型软件还是小型应用程序,处理异常和错误能够提高代码的可靠性和稳定性。

本文将讨论编程语言语法中的异常处理和错误处理机制,以及它们的作用和使用方法。

一、异常处理异常是指在程序执行过程中遇到的意外情况,可能导致程序中断或出现错误。

异常处理机制是一种能够捕获和处理异常的机制,使程序能够在异常发生时进行适当的处理,而不会导致程序崩溃或出现不可预测的结果。

在大多数编程语言中,异常处理通过try-catch语句块来实现。

try块用于包含可能抛出异常的代码,而catch块用于捕获并处理异常。

当try块中的代码抛出异常时,程序会跳转到与之匹配的catch块,并执行其中的代码。

例如,在Java语言中,可以使用以下代码来处理异常:```javatry {// 可能抛出异常的代码// ...} catch (Exception e) {// 异常处理代码// ...}```在上述代码中,try块中的代码可能会抛出异常,而catch块则用于捕获并处理这个异常。

通过使用try-catch语句,程序可以在异常发生时进行适当的处理,例如输出错误信息、恢复程序状态或进行其他操作。

除了try-catch语句外,一些编程语言还提供了finally块,用于包含无论是否发生异常都需要执行的代码。

finally块中的代码在try-catch块执行完毕后无论是否发生异常都会被执行,常用于释放资源或进行清理操作。

二、错误处理错误处理是指在程序执行过程中遇到的错误情况,通常是由于代码逻辑错误、外部资源不可用或其他原因导致的。

与异常不同,错误通常是可以预测和避免的,因此错误处理机制主要用于检测和处理这些可预测的错误。

在编程语言中,错误处理通常通过返回错误码或抛出异常来实现。

返回错误码是一种简单的错误处理方式,通过在函数或方法中返回一个特定的值来表示错误。

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

Example 3:
begin if odd b then z:=z+a; a:=2*a; b:=b/2
end;
常见错误:语句之间丢失分号 解决办法:修改statement语法分析程 序
statement语法结构(P74 图8_11)
if sym=beginsym then begin getsym; statement([semicolon,endsym]+fsys); while sym in [semicolon]+statbegsys do begin if sym = semicolon then getsym else error(10); statement([semicolon,endsym]+fsys) end; if sym=endsym then getsym else error(17) end else…
1. 常见、易犯的错误—预先假设,在程序相应处 作修改或扩充 2. 不常见、无法预料的错误—跳过一部分原文, 让它在适当的地方停下来,然后继续分析下去
第一类错误处理和具体的语言十分有关 第二类错误处理的一些原则:
假如在识别出一个错误之后,要跳过原文的 某一部分,那么语言必不可少地要包含一些 关键字,这些关键字用错的几率非常小 在出错情况下当时的语法分析过程并不简单 地放弃它的目标,而是跳过一部分原文,使 被调用的语法分析过程总是能够正常结束
3.不可预料错误的处理
策略:跳过一部分原程序,在适当的地 方停下来,然后再继续分析下去 在语法定义结构上
尽量简明的语言结构 尽量使每个语法结构的头一个符号都使用关 键字
在出错处理技术上
每个语法单位的分析过程补充一个参数:
fsys:表示该语法单位的跟随符集合
增加一个test过程,三个参数s1,s2和n
2.2修改语法定义
statement语法结构(P74 图8_11)
statement改造前的语法结构图(P105 图9_4)
begin
statement
statement
end
;
statement改造后的语法结构图(P105 图9_5)
begin
statement
statement
end
;
if sym=beginsym then begin getsym; repeat statement([semicolon,endsym]+fsys); while sபைடு நூலகம்m=semicolon do begin getsym; statement([semicolon,endsym]+fsys); end; until not (sym in statbegsys) if sym=endsym then getsym else error() end;
当语法分析进入某些关键字或终结符号集合为开始符 号的语法单元时,在其入口或出口调用一个测试程序 TEST。例如,语句的开始符是begin, if, while, cal, read, write;说明的开始符为var, const, procedure;因子的开始符是“(”, ident, number。 当语法分析进入这样的语法单元前,可用测试程序检 查当前单词符号是否属于他们开始符号的集合,若不 是则出错。 由于PL/0编译程序是自顶而下的分析方法,一个语法 单元分析程序调用别的语法单元的分析程序时,以参 数形式给出被调用的语法分析程序出口时合法的后继 单词符号集合,在出口处也调用测试程序。若当前单 词符号属于所给集合,则语法分析正确,否则出错。
constdeclaration语法结构图 (P77 图8_17)
begin if sym=ident then begin getsym; if sym in [eql,becomes] then begin if sym = becomes then error(1); getsym; if sym=number then begin enter(constant); getsym end else error(2) end else error(3) end else error(4)
PL/0文法非终结符的开始符号与后继符号集合表
非终结符 分程序 block
开始符号集合 const var Procedure ident if call begin while
后继符号集合 .; . ; end
then do . ; rop end then do
ident call begin if while 语句 statement odd + - ( ident number 条件 condition + - ( ident number 表达式 expression ident number ( 项 term ident number ( 因子 factor
block语法结构图(P76 图8_16)
repeat if sym=constsym then begin getsym; repeat constdeclaration; while sym=comma do begin getsym; constdeclaration end; if sym=semicolon then getsym else error(5) until sym <> ident end; if sym=varsym then begin getsym; repeat vardeclaration; while sym=comma do begin getsym; vardeclaration end; if sym=semicolon then getsym else error(5) until sym <> ident;
TEST测试过程三个参数
S1:当语法分析进入或退出某一语法单元时当 前单词符号应属于的集合,他可能是一个语 法单元的开始符号集合,也可能是一个语法 单元的后继符号集合。 S2:在某一出错状态时,可恢复语法分析继续 工作的补充单词符号集合。因为当语法分析 出错时,即当前单词符号不再集合S1中,为 了继续编译,需跳过后遍输入的一写单词符 号,直到当前输入的单词符号属于S1和S2其 和。 n:出错信息编号。
. ; ) rop + - end then do
. ; ) rop + - * / end then do
例如,考察因子的语法分析。在过程FACTOR的入口处调用 一次TEST过程,它的实参S1是因子开始符号集合。S2是每 个过程的形参FSYS调用时实参的传递值。当编译程序第一次 调用BLOCK时,FSYS的实参为[.]与说明开始符号和语句 开始符号集合的和。以后随着调用语法分析程序层次的深入 逐步增加。如在调用语句时增加了[;]和[endsym],在表达 式语法分析中调用项时又增加[+]和[-],而在项中调用因子 时又增加了[*]和[/],这样在进入因子分析程序时即使当前 符号不是因子开始符,出错后只要跳过一定的符号,遇到当 时输入的单词符号在FSYS中或在因子开始符号集合中,均可 继续正常进行语法分析。在因子过程的出口处也调用了测试 过程,当时的FSYS集合的单词符号都是因子正常出口时允许 的单词符号。
2.常见错误的分析处理
修改语法分析程序 修改语法定义
2.1修改语法分析程序
Example1: 正确:const m=7,n=85; 错误:const m:=7,n=85; • 将说明中的等号写成赋值号 解决方法:修改constdeclaration语法 分析程序,使原来接收“=”的,也可以 接收“:=”
编译原理实践 --语法出错处理
语法出错处理概论 常见错误的分析处理 不可预料错误的处理 PL/0语法出错处理程序及其执行
1.语法出错处理概论
出错处理要解决的主要问题
出错(procedure error(n:integer)) (P83)
• 指出错误类型、halt
一次运行,尽可能多的发现语法错误
语法分析程序program4的缺点:遇到 错误就调用error过程,中断程序的执 行 分析程序可能的出错情况和解决方案:
出错分析举例
const a=25,b=10; var x,y; begin x:=a; y:=x,5; end.
4.PL/0语法出错处理程序及其执行 program5.pas
Example2: 正确: const m=7,n=85; var x,y,z,q,r; 错误:
const m=7;n=85, const m=7,n=85, const m=7,n=85
• 容易犯的错误:将中间的逗号写成分号;将结束的分 号写成逗号;遗漏结束时候的分号 • 解决方法:修改block语法分析程序
test函数 (P107,P111)
procedure test(s1,s2:symset; n:integer); begin if not(sym in s1) then begin error(n); s1:=s1+s2; while not(sym in s1) do getsym end end(*test*);
相关文档
最新文档