2014-07-14 25 views
1

我正在設計一種音樂編程語言,並將其語法作爲PEG語法來實現。解析過程結果相當複雜,所以最簡單的方法是定義幾個單獨的語法,然後按順序應用它們。到目前爲止,我有三種語法:解析PEG文法常見的多個通道?

  1. 取出源文件的全部內容並去掉註釋。
  2. 取出源文件(註釋去掉)並用儀器分開。這導致成對的樂器名稱/定義和由所述樂器「演奏」的「音樂代碼」。
  3. 實際解析音樂代碼並返回音樂「事件」的解析樹。

在這三個解析器中,#3是迄今爲止最複雜的。 #1和#2比較簡單,每個只佔用大約10行。另一方面,#3實現的語法越多,越複雜,目前處於33行並計數。

這個想法讓我想起了我,也許我可以將3個語法壓縮成一個嗎?這可能會消除語法中的一些重複,甚至可能會減少程序本身的代碼行數,但我不確定它是否會使事情過度複雜化。我粗略地將他們結合起來,但很快發現它很困難,因爲我似乎必須解決在每條規則中發生評論的可能性(糾正我,如果我錯了!)。事實上,我已經有了一個可選空白的規則,我已經在大多數音樂「事件」的定義中加入了這個規則,以便在語法上留出空白的靈活性。我無法決定是否堅持以多遍進行解析並且有多個獨立的解析器,每個任務一個解析器,或者如果試圖將它們組合成一個超級文法是值得的。

我的問題是這樣的:對於那些有構建PEG語法的經驗的人,你是否經常發現自己打破了將大文法分解爲更小的子文法並對輸入進行多次傳遞的問題?將所有內容都保存在一個語法中有什麼優點(性能或其他)?

回答

2

你的方法是合理的。某些解析器生成工具可輕鬆忽略註釋和空白。如果您使用的工具不是這種情況,那麼執行註釋刪除過程是合理的,因爲它大大簡化了其他過程的語法。

我可以想到的試圖統一語法的唯一原因是你有一個性能要求,這似乎並不是這樣。 (可從import this)。