我们的编译原理课要求我们为自己设计的编程语言创建一个简单的解释器。我正在使用JFlex和CUP作为我的生成器,但是我不太清楚什么是词法错误。此外,您是否建议我使用JFlex的状态特性?因为感觉这个工具更适合解析器处理。您还推荐使用其他工具来创建编程语言吗?非常抱歉如果我有些着急,因为它要在星期二之前完成。
我们的编译原理课要求我们为自己设计的编程语言创建一个简单的解释器。我正在使用JFlex和CUP作为我的生成器,但是我不太清楚什么是词法错误。此外,您是否建议我使用JFlex的状态特性?因为感觉这个工具更适合解析器处理。您还推荐使用其他工具来创建编程语言吗?非常抱歉如果我有些着急,因为它要在星期二之前完成。
词法错误是指词法分析器无法接受的任何输入。这通常是由于标记识别超出了您定义的规则而导致的。例如(没有特定的语法):
[0-9]+ ===> NUMBER token
[a-zA-Z] ===> LETTERS token
anything else ===> error!
如果您将词法分析器视为可接受有效输入字符串的有限状态机,则错误将是任何未导致该有限状态机达到接受状态的输入字符串。
您提出的问题其他部分对我来说不太清楚。如果您已经有一些正在使用的工具,那么也许最好学习如何使用这些工具实现您想要实现的目标(我没有使用过您提到的任何工具)。
编辑:重新阅读您的问题后,我可以回答第二个问题。某种语言可能没有词法错误 - 这是一种语言,其中任何输入字符串都是有效输入。
注意:在正则表达式中,我指的是乔姆斯基层次结构意义上的正则表达式,而不是java.util.regex.*
类。
词法错误是指输入不属于以下任何一组内容:
关键字:"if","else","main"...
符号:'=','+',';'...
双符号:">=","<=","!=","++"
变量名:[a-z/A-Z]+[0-9]*
数字:[0-9]*
示例:9var:错误,数字在字符之前,既不是变量也不是关键字。 $:错误
我不知道的是是否接受连续多个符号,如"+-"。
编译器在其中包含语法时可以捕获错误! 它将取决于编译器本身是否具有捕获词法错误的能力(范围)。 如果在编译器开发期间决定了哪些类型的词法错误以及如何处理它们(根据语法),则会进行处理。 通常,所有著名和广泛使用的编译器都具备这种功能。