我正在尝试为类似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'
我出错的任何想法?
谢谢你的时间!
图奥马斯
答案 0 :(得分:1)
词法分析器为STRING
创建了一个"property"
令牌,因此您应该调整name
规则:
name : STRING | ID;
您需要在ID
和ZERO
之后移动NONZERO
规则。由于您的数字也符合ID
词法分析器规则,因此将根据语法中出现的第一个规则为其分配一个令牌类型。您希望第一条规则为ZERO
或NONZERO
,目前为ID
。 (由于您的所有号码目前都会产生ID
个令牌,并且ID
不允许value
,因此会出现语法错误。)