0

列挙型で満たされたIDLファイルがたくさんあります。IDLファイルを解析し、列挙型を抽出し、これらに基づいてネイティブJava列挙型を作成する方法が必要です(consts、unions、structsなどのIDL内の他の宣言も無視します)。

どこから始めればいいのかわからない。この目的のために設計された優れたLinuxツールはありますか?正規表現が必要になると思いますか?

私が何を意味するかを説明するために、ここにcommon.idlの例があります:

#ifndef __common_idl__
#define __common_idl__



module common_idl { 


  const short MAX_UNITS      = 99;
  const short MAX_SIZE  = 15; 

  enum Bearing_Type { 
     North_Bearing, 
     South_Bearing, 
     No_Bearing 
  }; 

  enum Bounds_Type {
     Empty,
     Full,
     Above,
     Between,
     Below
  };



  enum Identity_Type { 
      Pending, 
      Unknown, 
      Assumed_Friend, 
      Friend
  }; 

  enum Status_Type {
     No_Status,
     To_Status,
     To_Established,
     From_Established
  }; 

  enum Emergency_Type { 
      Reported, 
      Confirmed, 
      None    
  }; 

 struct Console_Marker { 
    boolean                               Marked; 
 };    


  typedef unsigned short   Index_Type; 
  typedef long            TQ_Type;                   
  typedef unsigned short  Count_Type;             
  typedef unsigned long   Number_Of_Type;          
  typedef unsigned short  Special_Index_Type; 
  typedef string<2>       Code_Type;                 


};


#endif

次のようなコマンドを実行したいのですが。

converter common.idl -package com.myproject -outputDir src

そして、outはこれらのソースJavaファイルを列挙型で吐き出します:

src / com / myproject / Bearing_Type.java

package com.myproject;

public enum Bearing_Type {
    North_Bearing, 
    South_Bearing, 
    No_Bearing 
}

src / com / myproject / Bounds_Type.java

package com.myproject;

public enum Bounds_Type {
    Empty,
    Full,
    Above,
    Between,
    Below
}

src / com / myproject / Emergency_Type.java

package com.myproject;

public enum Emergency_Type {
    Reported, 
    Confirmed, 
    None    
}

src / com / myproject / Identity_Type.java

package com.myproject;

public enum Identity_Type {
    Pending, 
    Unknown, 
    Assumed_Friend, 
    Friend
}

src / com / myproject / Status_Type.java

package com.myproject;

public enum Status_Type {
    No_Status,
    To_Status,
    To_Established,
    From_Established
}

これは実行可能ですか?

4

1 に答える 1

1

非常に迅速で汚い解決策-より良く、より良く、そして何でも機能するパーサーがたくさんあると確信しています。しかし、IDLファイルがすべて同じように見える場合、なぜわざわざするのでしょうか。

import java.io.File;
import java.io.InputStream;
import java.util.Scanner;

public class IDLParserTest {

    public static void main(String[] args) {
        parse("common.idl");
    }

    private static void parse(String file) {
        InputStream is = IDLParserTest.class.getResourceAsStream(file);
        Scanner scanner = new Scanner(is);

        while (parseEnum(scanner))
            ;
    }

    protected static boolean parseEnum(Scanner scanner) {
        if (!scanner.hasNext())
            return false;
        String strEnum = scanner.findWithinHorizon("enum", 8192);
        if (strEnum == null)
            return false;
        if (!strEnum.equals("enum"))
            return true;
        StringBuilder javaCode = new StringBuilder();
        String strClass = scanner.next();
        scanner.next(); // skip open bracket
        javaCode.append("package com.mycompany; ");
        javaCode.append("public enum " + strClass + " { ");
        while (scanner.hasNext()) {
            String f = scanner.next();
            // System.out.println("<<<" + f);
            if (f.equals("};")) {
                javaCode.append(" }");
                File outFile = new File(strClass + ".java");
                // TODO: Write javaCode.toString() to outFile
                System.out.println("Wrote: " + outFile + ":" + javaCode.toString());
                return true;
            } else {
                javaCode.append(f);
            }
        }
        return true;
    }

}
于 2012-06-21T22:32:35.257 に答える