对于ANTLR 4 JSON语法,“输入时没有可行的替代”错误

时间:2015-12-05 15:44:15

标签: parsing antlr antlr4

我正在尝试将Pair中对象的STRING部分改编为CamelString,但它失败了。并报告“输入时没有可行的选择”。

我尝试使用我的CamelString作为一个独立的语法,它运作良好。我认为这意味着我的语法含糊不清,但我无法理解为什么。

对于测试输入

{
   'BaaaBcccCdddd':'cc'
}

发生错误

line 2:2 no viable alternative at input '{'BaaaBcccCdddd''

以下是我的语法。它与ANTLR 4的标准JSON语法几乎相同。

/** Taken from "The Definitive ANTLR 4 Reference" by Terence Parr */

// Derived from http://json.org

grammar Json;


json:   object
    |   array
    ;

object
    :   '{' pair (',' pair)* '}'
    |   '{' '}' // empty object
    ;

pair : camel_string ':' value;

camel_string : '\'' (camel_body)*? '\'';

STRING
    : '\'' (ESC | ~['\\])* '\'';

camel_body: CAMEL_BODY;

CAMEL_START: [a-z] ALPHA_NUM_LOWER*;
CAMEL_BODY: [A-Z] ALPHA_NUM_LOWER*;
CAMEL_END: [A-Z]+;

fragment ALPHA_NUM_LOWER : [0-9a-z];

array
    :   '[' value (',' value)* ']'
    |   '[' ']' // empty array
    ;



value
    :   STRING
    |   NUMBER
    |   object  // recursion
    |   array   // recursion
    |   'true'  // keywords
    |   'false'
    |   'null'
    ;

fragment ESC :   '\\' (["\\/bfnrt] | UNICODE) ;
fragment UNICODE : 'u' HEX HEX HEX HEX ;
fragment HEX : [0-9a-fA-F] ;
NUMBER
    :   '-'? INT '.' [0-9]+ EXP? // 1.35, 1.35E-9, 0.3, -4.5
    |   '-'? INT EXP             // 1e10 -3e4
    |   '-'? INT                 // -3, 45
    ;

fragment INT :   '0' | [1-9] [0-9]* ; // no leading zeros
fragment EXP :   [Ee] [+\-]? INT ; // \- since - means "range" inside [...]
WS  :   [ \t\n\r]+ -> skip ;

0 个答案:

没有答案