antlr4:如何使标识符不区分大小写

antlr4: how to make identifier case insensitive

不足之处是我的DSL中的关键字,我想让关键字不区分大小写。

我已阅读此文档并尝试。 https://github.com/antlr/antlr4/blob/master/doc/case-insensitive-lexing.md

在我的语法中,我有两个基本规则:matching_rule_not_work 和 matching_rule_will_work。第一条规则是我想要的,但它没有用。第二条规则有效,但这不区分大小写。

那么,如何让第一条规则生效呢?谢谢

grammar test;

matching_rule_not_work: K_DEFICIENCY;

matching_rule_will_work: 'deficiency';

WS : [ \t\r\n]+ -> skip;


K_DEFICIENCY: D E F I C I E N C Y;

fragment A : [aA];
fragment B : [bB];
fragment C : [cC];
fragment D : [dD];
fragment E : [eE];
fragment F : [fF];
fragment G : [gG];
fragment H : [hH];
fragment I : [iI];
fragment J : [jJ];
fragment K : [kK];
fragment L : [lL];
fragment M : [mM];
fragment N : [nN];
fragment O : [oO];
fragment P : [pP];
fragment Q : [qQ];
fragment R : [rR];
fragment S : [sS];
fragment T : [tT];
fragment U : [uU];
fragment V : [vV];
fragment W : [wW];
fragment X : [xX];
fragment Y : [yY];
fragment Z : [zZ];

在您的示例中,您同时使用了 K_DEFICIENCY 和文字 'deficiency'。在解析器规则中使用文字与为该文字定义标记规则相同,后者位于所有其他标记规则之前。

因此您有两种令牌:K_DEFICIENCY 令牌和 'deficiency' 令牌。当词法分析器看到可以同时匹配两者的输入时,将使用最先出现的输入,这将是 'deficiency' 因为,正如我所说,文字总是最先出现的。

如果您从语法中删除 matching_rule_will_work: 'deficiency'; 行,它会像您期望的那样工作。