代码之家  ›  专栏  ›  技术社区  ›  cesar

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

  •  9
  • cesar  · 技术社区  · 14 年前

    对于我们的编译器理论课,我们的任务是为我们自己设计的编程语言创建一个简单的解释器。我使用jflex和cup作为生成器,但我有点被词法错误所困扰。另外,是否建议我使用jflex的状态特性?感觉是错误的,因为似乎解析器更适合处理这个方面。您是否建议使用其他工具来创建该语言?如果我不耐烦的话,我很抱歉,但是星期二就要到了。

    4 回复  |  直到 10 年前
        1
  •  14
  •   Gian    14 年前

    词法错误是lexer可以拒绝的任何输入。这通常是由于令牌识别偏离了您定义的规则的末尾。例如(无特定语法):

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

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

    你剩下的问题我不太清楚。如果您已经使用了一些工具,那么您最好学习如何使用这些工具实现您想要实现的目标(我对您提到的任何一种工具都没有经验)。

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

        2
  •  3
  •   Martín Schonaker    10 年前

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

    词法错误是词法分析器在无法继续时引发的错误。这意味着没有办法识别 词位 作为有效 令牌 对你来说。另一方面,当一组给定的 已经 已识别的有效标记与语法规则的任何右侧都不匹配。

    感觉不对,就像 解析器更适合处理 那方面

    不,不。 似乎 因为 context-free languages include regular languages (意思是解析器无法完成lexer的工作)。但考虑到解析器是一个堆栈自动机,您将使用额外的计算机资源(堆栈)来识别不需要识别堆栈的东西(正则表达式)。这将是一个次优的解决方案。

    注:用正则表达式,我的意思是…Chomsky层次结构意义上的正则表达式,而不是 java.util.regex.* 班级。

        3
  •  2
  •   Mohe TheDreamy    11 年前

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

    示例:9var:error,number before characters,not a variable and not a key word either. 美元:错误

    我不知道的是像一个以上的符号一样的东西是否被接受,比如“+-”

        4
  •  0
  •   Al Mahmud    10 年前

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

    推荐文章