我正在尝试使用Jison定义一种语言,使用很少的标点符号进行分隔 - 就像CoffeeScript但没有缩进。这就是我想要实现的目标:
# Definition
object1, object2
property1 = value1,
property2 = value2
# Definition
object3 property = value
# Statement
object1 + object2 + object3
这定义了三个具有一些属性的对象并添加了它们。请注意,第一个定义使用名称列表指定了两个对象,第二个定义表明空格不应该很重要。
尽管名称列表和属性列表之间缺少开始和结束符号,但我觉得语法并不模棱两可。语法规定每个名称列表后跟一个属性列表。如果我编写一个仅指定定义的语法,这一切似乎都可以正常工作,包括以下产品:
definition
: name_list property_list
;
name_list
: name
| name_list ',' name
;
property_list
: property
| property_list ',' property
;
property
: name '=' name
;
现在,我以一种相当正常的方式为语法的表达式部分添加规则,据我所知:
expr
: expr '+' expr
| expr '/' expr
| name
;
Jison 抱怨说,对于处于某种编号状态的一堆不同的前瞻标记,“可能有多种操作”。减少选项通常如下所示:
- reduce by rule: name_list -> name
- reduce by rule: expr -> name
我相信语法是明确的,但我怎样才能说服吉森呢?似乎它可能需要向前看两个标记而不是一个,但这是一个盲目的猜测,Jison 文档指出它不(还?)支持 LL( k ) 语法。