2013-10-20 7 views
8

IMP(eclipseプロジェクト)を使用してエディタを開発しているyaccファイルがあります。私のyaccファイルから。受け取ったyaccファイルにはルールとアクションが含まれています。しかし、私はLPGで使用される文法記述の規則だけを抽出したいと思っていました。これを行う1つの方法は、手作業でルールを抽出し、それをBNF構文に再フォーマットすることです(または、必要な方法に変換するプログラムを作成している可能性があります)。私はこれを行うための自動化された方法があるかどうか疑問に思っていました。私はバイソンが助けることができるいくつかのブログを読んだが、私は正確に適切なコマンドを見つけることができなかった。誰もがこの問題に対処する方法を知っています。yaccファイルからBNF文法規則を抽出する

私はそれが機密であるので、私が持っているyaccファイルを実際に投稿することはできません。あなたには、いくつかの後処理を行うために準備している場合は、単に

argExpList ::= assignExp|assignExpList ',' assignExp 

答えて

9

バイソンは助けることができるようなもので、私はそれが変換されることを望ん

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

を次のようにしかし、私は例を与えることができます。

あなたは-vオプションでバイソンを実行した場合、それは(filename.yファイルのベース名です)filename.outputと呼ばれるファイルを生成します。そのファイルには文法のコピーとすべての状態の説明が含まれています。文法にはアクションはなく、行ごとに1つのプロダクションがあります。しかし、あなたは仕事をする必要があります:

  1. すべての作品には番号が付けられています。それらの番号を削除する必要があります。

  2. ルールの中程のアクションがある場合、それらは奇妙な名前の空の非終端記号として表示されます。名前は[email protected]または@2のようになります。これらのトークンとそれに対応する空のプロダクションを削除する必要があります。

  3. 空のプロダクションは、少なくとも1つの最近のバージョンのバイソンで、/* empty */と表示されています。それはあなたの好みではないかもしれません。

  4. 私はこの方法ではyacc/bisonのファイルから文法を抽出しました:

::=にそれは変わりません、それは非常に単純明快です。単純なsedまたはawkスクリプトで上記の変更をすべて行うことができます。

+0

これはまさに私が求めていたものでした。それは私の問題を解決しました。 – lferasu

+0

@イフェラス:...リシの答えを受け入れる –

関連する問題