我正在阅读 ANTLR4 防御指南,现在正在阅读有关词法分析器规则解析的部分。以下是本节的内容:
grammar KeywordTest;
enumDef : 'enum' '{' ... '}';
...
FOR: 'for'
...
ID:[a-zA-Z]; // does not match 'enum' or 'for'
Rule ID could also match kewords such as
enum
orfor
, which means there's more than one rule that could match the same string. [...] Literals such as'enum'
become lexical rules and go immediately after the parser rules but before the explicit lexical rules.
这是什么意思以及它如何帮助我们解决潜在的歧义?我会说这样的声明
ENUM_KEYWORD: 'enum'
其中ATNLR4
可能在内部使用将在规则 enumDef: 'enum' '{' ... '}
之后立即贴上标签看起来如下:
enumDef: ENUM_KEYWORD '{' ... '}
ENUM_KEYWORD: 'enum'
这正是 ANTLR4 的工作方式吗?
最佳答案
词法分析器规则的顺序在语法中非常重要,因为将使用找到的第一个适用规则。您可以阅读更多here .
因此,如果您有词法分析器规则:
ID: [a-zA-Z]+;
FOR: 'for';
根据其顺序,输入“for”将被标记为 FOR token 或 ID token ,因为对于两者来说它都是正确的。
因此,语法经常包含“模糊”规则,其中所有关键字都被提及,因此当另一个标记包含关键字时它会通过。
例如:
alfaNum: (ALFA | NUM | ambigous | '_' )+?;
ambigous: SELECT | WHERE | FROM | WITH | SET | AS;
这样如果有 alfaNum token “选择”,它就会通过。如果未指定 ambigous,则会故障转移词法分析器规则 SELECT: 'select';
关于java - 了解 ANTLR4 中的词法分析器规则解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35765870/