【问题标题】:Lexer mode inside a string in Antlr4Antlr4中字符串内的词法分析器模式
【发布时间】:2016-02-10 17:48:54
【问题描述】:

我有一个特定 JSON 格式的 ANTLR4 语法 (我知道,我应该使用 JSON Schema,但我们暂时忽略它)

作为我的 JSON 对象的一部分,我想匹配这样的字符串:

"order" : "somefield ASC, someotherfield DESC"

这里是相关的语法部分

解析器:

orderObject        : ORDER;

词法分析器:

COLON: ':';
QUOT: '"';
FIELDNAME : ALPHA (ALPHA | DIGIT | UNDER)*;
fragment DIGIT : [0-9];
fragment UNDER : '_';
fragment ALPHA : [a-zA-Z];
ORDER : '"order"'  -> pushMode(ORDERMODE);
WS : [ \r\n\t]+ -> skip;


mode ORDERMODE;
WS2 : [ \r\n\t]+ -> skip;
PREFIX           : COLON QUOT -> skip;
ORDERCLAUSE      : (ORDERITEM (COMMA ORDERITEM)*)+;
CLOSE            : '"' -> popMode; 
ORDERITEM        : FIELDNAME ORDERDIRECTION?;
ORDERDIRECTION   : 'ASC' | 'DESC';

我得到的输出是

line 1:8 token recognition error at: ': '

我做错了什么?

【问题讨论】:

    标签: json antlr4 lexer


    【解决方案1】:

    您可能没有在ORDERMODE 模式(QUOT 相同)中定义COLON-ish 令牌——每种模式都是一个完全独立的规则集。

    您可以通过使用片段规则来最小化这个限制 - 它们在所有模式下都是可见的。

    ...
    COLON : Colon ;
    QUOT  : Quot  ;
    
    
    mode ORDERMODE;
    PREFIX : COLON1 QUOT1 -> skip;
    ...
    COLON1 : Colon ;
    QUOT1  : Quot  ;
    
    ...
    fragment Colon : ':' ;
    fragment Quot  : '"' ;
    

    【讨论】:

      猜你喜欢
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多