13

对于我们的编译器理论课,我们的任务是为我们自己设计的编程语言创建一个简单的解释器。我正在使用 jflex 和 cup 作为我的生成器,但我对什么是词法错误有点困惑。另外,是否建议我使用 jflex 的状态功能?感觉不对,因为解析器似乎更适合处理该方面。您是否推荐任何其他工具来创建该语言。对不起,如果我不耐烦,但它是在星期二到期。

4

4 回答 4

20

词法错误是词法分析器可以拒绝的任何输入。这通常是由于令牌识别超出了您定义的规则的末尾。例如(没有特定的语法):

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

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

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

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

于 2010-08-14T23:41:22.587 回答
5

词法错误可能是该语言无效或不可接受的字符,例如“@”,它作为 Java 中标识符的词法错误被拒绝(它是保留的)。

词法错误是词法分析器在无法继续时抛出的错误。这意味着无法将词素识别词法分析器的有效标记另一方面,当给定的一组已识别的有效标记与您的语法规则的任何右侧不匹配时,您的扫描仪将抛出语法错误。

感觉不对,因为解析器似乎更适合处理该方面

不。似乎是因为上下文无关语言包括常规语言(这意味着解析器可以完成词法分析器的工作)。但是考虑到解析器是一个堆栈自动机,并且您将使用额外的计算机资源(堆栈)来识别不需要识别堆栈的东西(正则表达式)。那将是一个次优的解决方案。

注意:通过正则表达式,我的意思是...... Chomsky Hierarchy 意义上的正则表达式,而不是一个java.util.regex.*类。

于 2010-10-06T21:08:16.990 回答
3

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

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

我不知道是否接受了多个符号,例如“+-”

于 2013-11-08T18:05:37.923 回答
0

当编译器中有语法时,编译器可以捕获错误!这将取决于编译器本身是否具有捕获词法错误的能力(范围)。如果在编译器的开发过程中决定了哪些类型的词法错误以及如何(根据语法)处理它们。通常所有著名且最常用的编译器都具有此功能。

于 2014-09-27T02:55:28.337 回答