什么是词法错误的例子?一个语言是否可能没有词法错误?

14

我们的编译原理课要求我们为自己设计的编程语言创建一个简单的解释器。我正在使用JFlex和CUP作为我的生成器,但是我不太清楚什么是词法错误。此外,您是否建议我使用JFlex的状态特性?因为感觉这个工具更适合解析器处理。您还推荐使用其他工具来创建编程语言吗?非常抱歉如果我有些着急,因为它要在星期二之前完成。

4个回答

21

词法错误是指词法分析器无法接受的任何输入。这通常是由于标记识别超出了您定义的规则而导致的。例如(没有特定的语法):

[0-9]+   ===> NUMBER token
[a-zA-Z] ===> LETTERS token
anything else ===> error!

如果您将词法分析器视为可接受有效输入字符串的有限状态机,则错误将是任何未导致该有限状态机达到接受状态的输入字符串。

您提出的问题其他部分对我来说不太清楚。如果您已经有一些正在使用的工具,那么也许最好学习如何使用这些工具实现您想要实现的目标(我没有使用过您提到的任何工具)。

编辑:重新阅读您的问题后,我可以回答第二个问题。某种语言可能没有词法错误 - 这是一种语言,其中任何输入字符串都是有效输入。


6
一个词法错误可能是语言中无效或不可接受的字符,比如在Java中作为标识符被拒绝的'@'字符(它是保留字符)。
词法错误是由您的词法分析器无法继续处理时抛出的错误。这意味着对于您的词法分析器来说,没有办法将一个词素识别为有效的标记。另一方面,当一组已经识别出的有效标记与您的语法规则的任何右侧不匹配时,您的扫描器将抛出语法错误。
“感觉不对”,因为上下文无关语言包括正则语言(这意味着解析器可以处理词法分析的工作)。但请考虑到解析器是一个堆栈自动机,而您将使用额外的计算机资源(堆栈)来识别不需要堆栈来识别的东西(正则表达式)。那将是一个次优的解决方案。

注意:在正则表达式中,我指的是乔姆斯基层次结构意义上的正则表达式,而不是java.util.regex.*类。


Java中$符号是保留字符吗? - Ypnypn
不是的,这个例子不好。让我改一下。 - Martín Schonaker
完成。'$'只是不被鼓励使用,因为它用于类名混淆。 - Martín Schonaker

3

词法错误是指输入不属于以下任何一组内容: 关键字:"if","else","main"... 符号:'=','+',';'... 双符号:">=","<=","!=","++" 变量名:[a-z/A-Z]+[0-9]*
数字:[0-9]*

示例:9var:错误,数字在字符之前,既不是变量也不是关键字。 $:错误

我不知道的是是否接受连续多个符号,如"+-"。


0

编译器在其中包含语法时可以捕获错误! 它将取决于编译器本身是否具有捕获词法错误的能力(范围)。 如果在编译器开发期间决定了哪些类型的词法错误以及如何处理它们(根据语法),则会进行处理。 通常,所有著名和广泛使用的编译器都具备这种功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接