我正在阅读ANTLR4防范指南,现在我在关于词法分析规则解析的部分。以下是本节中的内容:
grammar KeywordTest;
enumDef : 'enum' '{' ... '}';
...
FOR: 'for'
...
ID:[a-zA-Z]; // does not match 'enum' or 'for'
规则ID还可以匹配
enum
或for
等关键字,这意味着 有多个规则可以匹配相同的规则 串。 [...]'enum'
之类的文字成为词法规则并且 在解析器规则之后但在显式词汇之前 的规则。
这意味着什么?它如何帮助我们解决潜在的模糊性?我会说像
这样的声明ENUM_KEYWORD: 'enum'
ATNLR4
可能在内部使用的将在规则enumDef: 'enum' '{' ... '}
之后立即进行评分,并且如下所示:
enumDef: ENUM_KEYWORD '{' ... '}
ENUM_KEYWORD: 'enum'
ANTLR4究竟是怎么做的?
答案 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';