ANTLR中关键字作为标识符的两种语法规则行为差异原因问询
ANTLR中关键字作为标识符的两种语法规则行为差异原因问询
这个问题的核心其实是ANTLR词法分析器的工作逻辑在“搞事情”,咱们一步步拆解清楚:
首先得明确ANTLR的词法规则优先级:当输入的字符串能匹配多个词法规则时,会遵循两个原则:
- 优先匹配最长的字符串(也就是所谓的“最长匹配原则”)
- 如果长度相同,就按照词法规则在语法文件中的定义顺序来,先定义的规则会被优先选用
回到你的两个例子:
第一种能正常工作的情况
你在parser规则identifier里明确把VAR作为备选选项:
identifier: IDENTIFIER | VAR;
当输入var var = 5时:
- 第一个
var被词法分析器优先识别为VARtoken(因为VAR规则比IDENTIFIER先定义),刚好符合fieldDeclaration开头的VAR要求; - 第二个
var同样被词法分析器识别为VARtoken,但因为identifier规则明确接受VAR作为合法输入,所以parser能顺利把它当成标识符处理,整个语句就合法了。
第二种报错的情况
你把identifier规则改成只接受IDENTIFIER:
identifier: IDENTIFIER;
这时候问题就来了:
虽然IDENTIFIER的规则[a-zA-Z]+理论上能匹配var,但词法分析器根本不会给它这个机会——因为VAR规则先定义,输入里的var会被优先匹配成VAR token,而不是IDENTIFIER。
当parser处理第二个var时,它拿到的是VAR token,但identifier规则只认IDENTIFIER token,自然就会抛出不匹配的错误。
简单来说:第一种情况是你告诉parser“就算这个token是关键字VAR,也可以把它当标识符用”;第二种情况你没说这句话,而词法分析器早就把var当成关键字token了,parser不认这个token作为标识符,所以报错。
备注:内容来源于stack exchange,提问作者detcle
相关产品推荐
相关产品推荐

