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

词法分析器可以检测到哪些错误示例?

  •  1
  • tatsuhirosatou  · 技术社区  · 15 年前

    在Java、C++或C语言中,词法分析器可以在给定的代码段中检测到哪些错误?

    3 回复  |  直到 15 年前
        1
  •  4
  •   Jonathan Feinberg    15 年前

    lexer可以检测没有可能含义的字符序列(其中含义由解析器确定)。例如,在Java中,序列 bana"na 不能是标识符、关键字、运算符等。

    但是,lexer无法检测到给定的词汇有效标记是无意义的或不符合语法的。例如,JavaListar会愉快地返回令牌序列。 final "banana" final "banana" ,分别查看关键字、字符串常量、关键字和字符串常量。

        2
  •  1
  •   Gautham Ganapathy    15 年前

    除了下面提到的情况外,大多数编译器还处理lexer中的注释。因此,也可以在此处检测到与注释相关的错误(嵌套不正确,未关闭)。

    另一个问题是用户定义的数据类型,需要由lexer和解析器一起处理。请考虑以下代码:

    typedef int myinteger; MyTimeX;

    在第二条语句中,myinteger是一种数据类型,lexer应该将myinteger作为数据类型返回,而不是作为标识符返回。这通常是通过交叉引用一个潜在的标识符来实现的,该标识符具有一个列表用户定义的数据类型,该数据类型以前由解析器填充过。

    第三个问题涉及令牌的上下文。在像C++这样的上下文敏感语言中,相同的令牌(EG和LT)可以有不同的含义(小于模板参数的开始)。这也需要与解析器合作处理,解析器可以向lexer提供关于当前状态的反馈。

        3
  •  0
  •   ChrisW    15 年前

    我没有仔细检查语法,但我认为像“2cat”这样的字符串不是任何有效/预期/可分类的标记。