类似JSON语言的语法

时间:2013-04-18 16:37:49

标签: antlr4

我正在尝试为类似JSON的语言设计语法。主要的区别是属性名称不需要双引号(它们可以是),并且这些数字只是整数(没有浮点数)。

这是一个例子:

{
  "property1": "string value",
  property2: 321,
  arr: [1,2,3]
}

这是我的(尝试)语法:

grammar Command;

command: object;

object:   '{' pair (',' pair)* '}' ;

pair: name ':' value ;

name
   : '"' ID '"'
   | ID
   ;

value
    :   string
    |   integer
    |   object
    |   array
    |   bool
    ;

array: '[' value (',' value)* ']' ;

string: STRING ;

integer
      : ZERO
      | NONZERO 
      ;

bool
   : 'true' 
   | 'false' 
   ;

ID : [a-zA-Z0-9_]+ ;
STRING: '"' (ESC | .)*? '"' ;
fragment ESC: '\\"' | '\\\\' ;

ZERO: '0' ;
NONZERO: '-'? [1-9] [0-9]* ; 
WS  :   [ \t\n\r]+ -> skip ;

但是,尝试在我的示例输入上运行TestRig,我得到了

line 2:2 no viable alternative at input '"property"'
line 3:10 no viable alternative at input '321'
line 4:8 no viable alternative at input '1'
line 4:10 no viable alternative at input '2'
line 4:12 no viable alternative at input '3'

我出错的任何想法?

谢谢你的时间!

图奥马斯

1 个答案:

答案 0 :(得分:1)

  • 词法分析器为STRING创建了一个"property"令牌,因此您应该调整name规则:

    name : STRING | ID;
    
  • 您需要在IDZERO之后移动NONZERO规则。由于您的数字也符合ID词法分析器规则,因此将根据语法中出现的第一个规则为其分配一个令牌类型。您希望第一条规则为ZERONONZERO,目前为ID。 (由于您的所有号码目前都会产生ID个令牌,并且ID不允许value,因此会出现语法错误。)