繁体   English   中英

将IDL枚举解析为Java枚举

[英]Parse IDL enums to Java Enums

我有一堆充满枚举的IDL文件。 我想要一种解析IDL文件,提取枚举并基于这些枚举创建本机Java枚举的方法(也忽略IDL中的任何其他声明,例如const,union或structs)。

我什至不知道从哪里开始。 是否有为此目的设计的良好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

并用枚举吐出这些源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
}

这可行吗?

一个非常快速和肮脏的解决方案-我敢肯定那里有大量的解析器,它们可以更好,更好地工作。 但是,如果您的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;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM