2013-02-26 61 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