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