0

我正在尝试为类似 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'

有什么想法我哪里出错了吗?

谢谢你的时间!

托马斯

4

1 回答 1

1
  • 词法分析器正在为 创建单个STRING标记"property",因此您应该调整name规则:

    name : STRING | ID;
    
  • 您需要在和ID之后移动规则。由于您的数字也符合词法分析器规则,因此将根据语法中出现的第一条规则为它们分配标记类型。您希望第一条规则是or ,目前它在哪里。(由于您的所有数字当前都生成标记,并且不允许作为,因此您会收到语法错误。)ZERONONZEROIDZERONONZEROIDIDIDvalue

于 2013-04-18T17:09:57.813 回答