对于我们的编译器理论类,我们的任务是为我们自己设计的编程语言创建一个简单的解释器。我使用jflex和杯子作为我的发生器,但我有点卡在一个词法错误。另外,我建议使用jflex的状态功能吗?它感觉不对,因为看起来解析器更适合处理这个方面。你推荐使用其他工具来创建语言吗?我很抱歉,如果我不耐烦,但它应该在周二到期。
答案 0 :(得分:14)
词法错误是词法分析器可以拒绝的任何输入。这通常是因为令牌识别从您定义的规则的末尾开始。例如(没有特定的语法):
[0-9]+ ===> NUMBER token
[a-zA-Z] ===> LETTERS token
anything else ===> error!
如果你认为词法分析器是一个接受有效输入字符串的有限状态机,那么错误将是任何不会导致有限状态机达到接受状态的输入字符串。
你的其余问题对我来说还不太清楚。如果您已经使用了一些工具,那么也许您最好学习如何使用这些工具实现您想要实现的目标(我对您提到的任何一种工具都没有经验)。
编辑:重新阅读你的问题,我可以回答第二部分。语言可能没有词汇错误 - 它是任何输入字符串都是有效输入的语言。
答案 1 :(得分:3)
词汇错误可能是语言无效或不可接受的字符,例如'@'被拒绝为Java中标识符的词法错误(保留)。
词法错误是词法分析器无法继续时抛出的错误。这意味着没有办法将 lexeme 识别为lexer的有效令牌。另一方面,当一组给定的已经识别的有效令牌与语法规则的任何右侧都不匹配时,扫描仪将抛出语法错误。
它看起来像是错的 解析器更适合处理 那方面
没有。 似乎是,因为context-free languages include regular languages(意思是解析器可以完成词法分析器的工作)。但考虑到解析器是一个堆栈自动机,并且您将使用额外的计算机资源(堆栈)来识别不需要识别堆栈的东西(正则表达式)。那将是一个次优的解决方案。
注意:通过正则表达式,我的意思是......在Chomsky Hierarchy意义上的正则表达式,而不是java.util.regex.*
类。
答案 2 :(得分:2)
词汇错误是指输入不属于以下列表中的任何一个:
关键词:"if", "else", "main"...
符号:'=','+',';'...
双符号:">=", "<=", "!=", "++"
变量:[a-z/A-Z]+[0-9]*
数字:[0-9]*
示例:9var:错误,字符前的数字,不是变量,也不是关键字。 $:错误
我不知道的是,是否接受了彼此之后的多个符号,例如“+ - ”
答案 3 :(得分:0)
编译器在语法中可以捕获错误! 它取决于编译器本身是否具有捕获词法错误的能力(范围)。 如果在编译器的开发过程中决定了什么类型的词法错误以及如何(根据语法)它们将被处理。 通常所有着名且最常用的编译器都具有此功能。