我正在寫GLR的樂趣(再次,因爲我瞭解了自我的最後一次嘗試以來的一些事情)。解析器正在工作,我正在執行消歧規則。我正在以似乎有效的方式處理優先事項。現在我對結合性有點不知所措。如何在GLR解析器中執行關聯性規則?
說我有這樣的語法:
E <- E '+' E (rule 1)
E <- E '-' E (rule 2)
E <- '0' (rule 3)
E <- '1' (rule 4)
如果規則1)和2)具有相同的優先級和左結合。
沒有關聯處理,字符串「1-1 + 0」將產生兩個分析樹:
1 2
/\ /\
/ \ / \
2 3 4 1
| \ | \
4 4 4 3
其中數字是指用於還原規則。正確的解析樹是第一個,因此我只想保留這個。
我想知道如何有效地檢測算法上的結合侵害。
我試過的一種方法是看到在第一棵樹頂部節點處,規則2是規則1的子女列表中的規則3的左邊,而在第二條規則1中是規則4的右邊因此,因爲規則2和1是左聯合的,我只保留第一棵樹。
然而,這並沒有讓我在更復雜的例子中走得更遠。這個解決方案的侷限性是我只能根據與另一棵樹的比較來丟棄樹。
您是否認爲我可以使用此方法的精煉版本找到解決方案?標準的做法是什麼?
我看到的唯一支持歧義的論點是,寫語法的人更容易!我必須承認我更喜歡這個論點。如果它可以自動消除歧義(比如說:所有規則默認都保留了關聯性,那麼用戶可以覆蓋它)。我希望這樣。另外,您是否總是將優先規則集成到語法中? – djfm 2012-08-09 07:56:24