词法分析器可以在 Java、C++ 或 C 等语言的给定代码中检测到哪些错误示例?
3 回答
词法分析器可以检测没有可能含义的字符序列(其中含义由解析器确定)。例如,在 Java 中,序列bana"na
不能是标识符、关键字、运算符等。
但是,词法分析器无法检测到给定的词法有效标记是无意义的或不合语法的。因此,例如,Java 词法分析器会很高兴地返回标记序列final "banana" final "banana"
,分别看到一个关键字、一个字符串常量、一个关键字和一个字符串常量。
除了下面提到的情况,大多数编译器还在词法分析器中处理注释。因此,这里也可以检测到注释错误(嵌套不当,未关闭)。
另一个问题是用户定义数据类型的情况,需要由词法分析器和解析器一起处理。考虑以下代码:
typedef int myinteger; 我的整数 x;
在第二个语句中,myinteger 是一种数据类型,词法分析器应该将 myinteger 作为数据类型返回,而不是作为标识符返回。这通常是通过交叉引用一个潜在的标识符来完成的,该标识符具有一个列表用户定义的数据类型,这些数据类型以前由解析器填充。
第三个问题涉及令牌的上下文。在像 C++ 这样的上下文相关语言中,相同的标记(例如 <)可以具有不同的含义(小于,模板参数的开头)。这也需要与解析器合作处理,解析器可以向词法分析器提供有关其当前状态的反馈。
我没有仔细检查语法,但我认为像“2cat”这样的字符串不是任何类型的有效/预期/可分类标记。