我想要实现的是开发一种语法,以同样的方式解析以下两行:
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规则应该首先被捕获。
这是一个错误的假设吗?你能解释一下它为什么不被抓住了吗?