2013-10-20 54 views
8

我有一個yacc文件描述了使用IMP(eclipse項目)開發編輯器的某種語言。我使用LPG作爲解析器生成器,所以我需要提取一個BNF規則從我的yacc文件。我收到的yacc文件包含規則和操作。但是,我想只提取要在LPG中使用的語法描述規則。這樣做的一種方法是手動提取規則並將其重新格式化爲BNF語法(或者可能正在編寫一個程序將其轉換爲我想要的方式)。我想知道是否有這樣做的自動化方式。我在一些博客中讀到野牛可以提供幫助,但我無法準確找到合適的命令。有沒有人知道如何處理這個問題。從yacc文件中提取BNF語法規則

我真的不能發佈yacc文件,因爲它是保密的。但如下

argExprList: 
     assignExp 
      { 
      // some rules here 
      } 
     | assignExpList ',' assignExp 
      { 
       //some other rules here 
      } 
     ; 

什麼,我想它轉換爲是單純的喜歡

argExpList ::= assignExp|assignExpList ',' assignExp 

回答

9

野牛能有所幫助,如果你準備做一些後期處理,我可以舉一個例子。

如果運行與-v選項野牛,它會產生一種叫做filename.output文件(其中filename.y文件的基名);該文件包含語法的副本和每個狀態的描述。語法沒有動作,並且每行有一個生產。但你需要做一些工作:

  1. 每個生產都有編號。你需要刪除這些數字。

  2. 如果存在中間規則操作,它們將顯示爲奇怪命名的空非終端。名稱將會像[email protected]@2。您需要刪除這些令牌及其相應的空白作品。

  3. 空的產品是(至少在一個最新版本的野牛)顯示爲/* empty */。這可能不是你的偏好。

  4. 它不會改變:::=

我從提取YACC /野牛文件語法以這種方式,這是非常直接的;您可以使用簡單的sedawk腳本進行上述所有更改。

+0

這正是我所問的。它解決了我的問題。 – lferasu

+0

@Iferasu:...然後接受Rici的回答 –