2011-03-21 85 views
4

我相信我很難理解輪班如何減少衝突的工作。我知道野牛可以向前看,所以我不明白我爲什麼會遇到這個問題。野牛:輪班減少衝突

在我的語言中,列表定義爲[]之間的一組數字或列表。 例如[] [1] [1 2] [1 [2] 3]都是有效的列表。

下面是導致問題的

value: num 
    | stringValue 
    | list   
    ; 

list: LEFTBRACE RIGHTBRACE 
    | LEFTBRACE list RIGHTBRACE 
    | num list   
    | RIGHTBRACE    
    ; 

衝突從發生數的定義,它不知道天氣由列表規則轉移,或由價值規律減少。我很困惑,因爲它不能檢查一個列表是否跟在數字後面?

任何煽動我應該如何進行將不勝感激。

回答

6

我想我會定義不同的事情,以避免開始與問題的方式,是這樣的:

value: num 
    | stringvalue 
    | list 
    ; 

items: 
    | items value 
    ; 

list: LEFTBRACE items RIGHTBRACE; 

編輯:分離號碼清單從字符串列表無法做到乾淨除非你消除空列表。出現的問題是,您希望允許將空列表包含在數字列表中的字符串列表中,但查看空列表本身並不會讓解析器決定哪個列表。例如:

[[] [] [] [] [] [] [] [] 1]

要弄清楚什麼樣的名單,這是,解析器將不得不看一直到1 - 但LALR(N)解析器只能預測N個符號來做出該決定。 Yacc(和Byacc,Bison等)只能執行LALR(1),所以他們只能向前看一個符號。這使得幾種可能性:

  1. 消除空名單的可能性完全
  2. 有詞法分析器將連續空列表任意數量的作爲單個令牌
  3. 使用解析器生成器,不限於LALR(1)文法

裏面一個yacc語法,但是,我不認爲有什麼可以做 - 你的語法根本放不下YACC的侷限性。

+0

有時很高興爲空比賽發表評論,以便更容易看到。 'item:/ * Empty * /' – 2011-03-21 19:00:59

+0

@Martin:有時是真的 - 同時,任何能夠讀取yacc-like語法的人都會很容易地識別它。 – 2011-03-21 19:18:57

+0

這不會允許字符串在數字列表中嗎?有沒有辦法確保列表中只有一種類型? – Pieces 2011-03-21 19:51:04

1

使用自下而上的解析器,通常是避免右遞歸的好主意,這是您在下面的語法的星號行中所具有的。

list: LEFTBRACE RIGHTBRACE 
    | LEFTBRACE list RIGHTBRACE 
    **| num list**   
    | RIGHTBRACE 

相反,你有沒有想過這樣的事情?

value:value num 
    | value string 
    | value list 
    | num 
    | string 
    | list 

list: LEFTBRACE RIGHTBRACE 
    | LEFTBRACE value RIGHTBRACE 

這樣你就沒有權利遞歸,而且語法的嵌套邏輯更簡單地表達了。

+0

好吧,它是自頂向下的解析器,你想避免左遞歸? – Pieces 2011-03-21 19:48:10

+1

@Peces:對於您要使用右遞歸的自頂向下解析器。對於自下而上的解析器,左遞歸通常是首選。 – 2011-03-21 19:50:25