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



我正在阅读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正是这样做的吗?

法分析器规则的顺序在语法中非常重要,因为将使用找到的第一个适用规则。您可以在此处阅读更多内容。

因此,如果您有词法分析器规则:

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

根据其顺序输入"for"将被标记为 FOR 令牌或 ID 令牌,因为两者都是正确的。

因此,语法通常包含规则"ambigous",其中提到了所有关键字,因此当另一个令牌包含关键字时,它将通过。

例如:

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

这样,如果有 alfaNum 令牌"选择",它就会通过。如果未指定不明确,它将故障转移词法分析器规则SELECT: 'select';

相关内容

  • 没有找到相关文章

最新更新