0
votes

I have an ANTLR4 grammar for a specific JSON format (I know, I should be using JSON Schema, but let's ignore that for now)

As part of my JSON object, I would like to match a string like this:

"order" : "somefield ASC, someotherfield DESC"

Here are the relevant grammar parts

Parser:

orderObject        : ORDER;

Lexer:

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';

The output I am getting is

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

What am I doing wrong?

1

1 Answers

1
votes

Likely you have have not defined a COLON-ish token within the ORDERMODE mode (same for QUOT) -- each mode is a completely separate rule set.

You can minimize this limitation by using fragment rules - they are visible in all modes.

...
COLON : Colon ;
QUOT  : Quot  ;


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

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