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