【发布时间】:2013-02-11 14:34:12
【问题描述】:
我正在尝试使用 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 相信这一点?似乎它可能需要向前看两个标记而不是一个,但这是一个盲目的猜测,Jison 文档指出它不(还?)支持 LL(k) 语法。
【问题讨论】:
-
是的,这是模棱两可的语法。从此question and answer获得帮助
-
如果不查看
property_list的规则,很难判断。 -
@DavidGorsline 我添加了
property_list和property作品。只是不想让问题太长。 -
@GrijeshChauhan 谢谢,我会尽力吸收。