Antlr4

时间:2016-02-10 17:48:55

标签: json antlr4 lexer

我有一个特定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: ': '

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您可能尚未在COLON模式中定义ORDERMODE - ish标记(QUOT相同) - 每种模式都是完全独立的规则集。

您可以使用片段规则最小化此限制 - 它们在所有模式下都可见。

...
COLON : Colon ;
QUOT  : Quot  ;


mode ORDERMODE;
PREFIX : COLON1 QUOT1 -> skip;
...
COLON1 : Colon ;
QUOT1  : Quot  ;

...
fragment Colon : ':' ;
fragment Quot  : '"' ;