ANTLR4 - 如何在引号内以不同的方式标记



我正在定义一个 ANTLR4 语法,我希望它对某些(但不是全部(事物进行标记,当它们出现在双引号内时与它们出现在双引号外时不同。这是我到目前为止的语法:

grammar SimpleGrammar;
AND: '&';
TERM: TERM_CHAR+;
PHRASE_TERM: (TERM_CHAR | '%' | '&' | ':' | '$')+;
TRUNCATION: TERM '!';
WS: WS_CHAR+ -> skip;
fragment TERM_CHAR: 'a' .. 'z' | 'A' .. 'Z';
fragment WS_CHAR: [ trn];
// Parser rules
expr:
    expr AND expr
    | '"' phrase '"'
    | TERM
    | TRUNCATION
    ;
phrase:
    (TERM | PHRASE_TERM | TRUNCATION)+
    ;

上述语法在解析 a! & b 时有效,它正确解析为:

  AND
  / 
 /   
a!    b

但是,当我尝试解析"a! & b"时,我得到:

第 1:4 行 无关的输入 '&' 期望 {'"', 术语, PHRASE_TERM, TRUNCATION}

错误消息是有意义的,因为&被标记为AND。但是,我想做的是,当&出现在双引号内(在"短语"内(时,将其标记为PHRASE_TERM。请注意,我确实希望a!标记为TRUNCATION,即使它出现在短语中也是如此。

这可能吗?

如果使用词法分析器模式,这是可能的。遇到特定令牌后可以更改模式。但词法分析器规则必须单独定义,而不是在组合语法中定义。

在您的情况下,遇到报价后,您将更改模式,

在遇到另一个报价后,您将模式切换回默认模式。

LBRACK : '[' -> pushMode(CharSet);
RBRACK : ']' -> popMode;

欲了解更多信息,谷歌"ANTLR词法分析器模式">

相关内容

  • 没有找到相关文章

最新更新