ANTLR4 - 同时支持的带引号和非带引号的字符串

时间:2015-01-27 07:06:10

标签: antlr4 lexer

我想要实现的是开发一种语法,以同样的方式解析以下两行:

1. "Bucket 1" = "1 item placed", "3 items removed"
2. Bucket 2 = 2 items placed, 6 items removed

因此,一行以序数开头,然后元素名称为“Bucket 1”和“Bucket 2”。此外,存储桶具有由逗号分隔的一个或多个值。

问题是数据可以附加双引号(上面第1行)和没有引号(如第2行所示)。我可以分别为每一行编写语法,但不能开发一种可以解析它们的语法。

grammar Test;
doc : element+ EOF; 

element: ordinal element_name EQUAL element_values '\n';
element_name : STRING ;
element_values: STRING (COMMA STRING)+; 

ordinal : NUMBER ;
COMMA: ',' ;
EQUAL: '=' ;
NUMBER : ('0'..'9')+ ;
STRING : '"' (EscapeSequence | ~('\\'|'"') )* '"' ; 
// STRING : ('"' (EscapeSequence | ~('\\'|'"') )* '"') | ~('"'|',')+ ;


fragment
EscapeSequence
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   OctalEscape
    ;
fragment
OctalEscape
    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7')
    ;
WS : [ .\t]+ -> skip ;

我使用了 STRING 规则,试图让它处理这两种情况,但没有运气。如果我启用 STRING 规则的注释版本,那么我会在'4处获得行1:0缺少NUMBER。 '解析器错误令人困惑,因为我认为NUMBER规则应该首先被捕获。

这是一个错误的假设吗?你能解释一下它为什么不被抓住了吗?

0 个答案:

没有答案