2013-02-26 32 views
0

我试图定义使用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(ķ)语法。

+0

是的,这是模糊的语法。从这[问题和答案]获取帮助(http://stackoverflow.com/questions/14554752/how-can-i-add-parentheses-as-the-highest-level-of-precedence-in-a-simple -grammar/14569166#14569166) – 2013-02-26 08:43:36

+0

如果没有看到你的'property_list'的规则很难说。 – 2013-02-26 14:56:24

+0

@DavidGorsline我添加了'property_list'和'property'制作。只是不想让这个问题太长。 – 2013-02-26 17:25:53

回答

1

你不显示整个语法,但它看起来像你的问题是,它不能说出一个简单名称的expr和名称中单一名称的声明的开始之间的区别名单。考虑输入

A B = C 

A B C = D 

第一种情况是与A一种性质的单一定义,而第二个是后跟B一个定义表达式A

的问题是,解析器需要在看到A和望着B先行后,这些案件之间作出选择,但它不能 - 它需要更多的预读(看什么B后)

有许多事情可以通过改变语言或获得(有效)额外的预测来避免这种情况。

  1. 更改语言。可能是这种情况,只是一个单一名称的声明没有任何意义。所以,你可以改变的语言有一个单独的statement规则不允许简单的名字:

    statement: expr '+' expr | expr '/' expr ; 
    expr: statement | name ; 
    

    现在它可以在不需要额外的先行一statementdeclaration区分,为statement必须包含运营商。

  2. 更换工具。您可以使用野牛的%glr-parser选项或类似btyacc的工具来处理非LALR(1)语法。然而,我完全不知道Jison支持什么。

  3. 在词法分析器中模拟额外的预测。你可以让你的词法分析器为你做额外的lookahead。您可以使用匹配[a-zA-Z]+[ \t\n]*=(即名称后跟=号)的词法分析器模式,并返回特殊的propname令牌而不是name。然后你property规则变为:

    property: propname name ; 
    
+0

谢谢!这些都是很棒的建议;我会尽力实施它们。我之前遇到过试图禁止使用单名声明的问题,但是您描述的内容很简单,我不明白为什么它不起作用! – 2013-02-27 17:28:07