我正在阅读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正是这样做的吗?
法分析器规则的顺序在语法中非常重要,因为将使用找到的第一个适用规则。您可以在此处阅读更多内容。
因此,如果您有词法分析器规则:
ID: [a-zA-Z]+;
FOR: 'for';
根据其顺序输入"for"将被标记为 FOR 令牌或 ID 令牌,因为两者都是正确的。
因此,语法通常包含规则"ambigous",其中提到了所有关键字,因此当另一个令牌包含关键字时,它将通过。
例如:
alfaNum: (ALFA | NUM | ambigous | '_' )+?;
ambigous: SELECT | WHERE | FROM | WITH | SET | AS;
这样,如果有 alfaNum 令牌"选择",它就会通过。如果未指定不明确,它将故障转移词法分析器规则SELECT: 'select';