了解ANTLR4中的词法分析器规则解析

时间:2016-03-03 07:34:29

标签: java antlr4 lexer

我正在阅读ANTLR4防范指南,现在我在关于词法分析规则解析的部分。以下是本节中的内容:

grammar KeywordTest;
enumDef : 'enum' '{' ... '}';
...
FOR: 'for'
...
ID:[a-zA-Z]; // does not match 'enum' or 'for'
  

规则ID还可以匹配enumfor等关键字,这意味着   有多个规则可以匹配相同的规则   串。 [...] 'enum'之类的文字成为词法规则并且   在解析器规则之后但在显式词汇之前   的规则。

这意味着什么?它如何帮助我们解决潜在的模糊性?我会说像

这样的声明
ENUM_KEYWORD: 'enum'
ATNLR4可能在内部使用的

将在规则enumDef: 'enum' '{' ... '}之后立即进行评分,并且如下所示:

enumDef: ENUM_KEYWORD '{' ... '}
ENUM_KEYWORD: 'enum'

ANTLR4究竟是怎么做的?

1 个答案:

答案 0 :(得分:1)

词法规则的顺序在语法中非常重要,因为将使用找到的第一个适用规则。您可以阅读更多here

所以如果你有词法规则:

ID: [a-zA-Z]+;
FOR: 'for';

根据其订单输入“for”将被标记为FOR令牌或ID令牌,因为两者都是正确的。

因此,语法通常包含规则'ambigous',其中提到所有关键字,因此当另一个标记包含它将通过的关键字时。

例如:

alfaNum: (ALFA | NUM | ambigous | '_' )+?;
ambigous: SELECT | WHERE | FROM | WITH | SET | AS;

这样,如果有alfaNum令牌“选择”,它就会通过。如果不指定ambigous,则会对词法分析器SELECT: 'select';

进行故障转移