Antlr4 中字符串内的 Lexer 模式
Lexer mode inside a string in Antlr4
我有特定 JSON 格式的 ANTLR4 语法
(我知道,我应该使用 JSON 模式,但我们暂时忽略它)
作为我的 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: ': '
我做错了什么?
可能您还没有在 ORDERMODE
模式中定义一个 COLON
-ish 标记(QUOT
也是如此)——每个模式都是一个完全独立的规则集。
您可以使用片段规则最小化此限制 - 它们在所有模式下都可见。
...
COLON : Colon ;
QUOT : Quot ;
mode ORDERMODE;
PREFIX : COLON1 QUOT1 -> skip;
...
COLON1 : Colon ;
QUOT1 : Quot ;
...
fragment Colon : ':' ;
fragment Quot : '"' ;
我有特定 JSON 格式的 ANTLR4 语法 (我知道,我应该使用 JSON 模式,但我们暂时忽略它)
作为我的 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: ': '
我做错了什么?
可能您还没有在 ORDERMODE
模式中定义一个 COLON
-ish 标记(QUOT
也是如此)——每个模式都是一个完全独立的规则集。
您可以使用片段规则最小化此限制 - 它们在所有模式下都可见。
...
COLON : Colon ;
QUOT : Quot ;
mode ORDERMODE;
PREFIX : COLON1 QUOT1 -> skip;
...
COLON1 : Colon ;
QUOT1 : Quot ;
...
fragment Colon : ':' ;
fragment Quot : '"' ;