java - 将 IDL 枚举解析为 Java 枚举

标签 java parsing shell enums idl

我有一堆充满枚举的 IDL 文件。我想要一种方法来解析 IDL 文件、提取枚举并基于这些文件创建 native Java 枚举(同时忽略 IDL 中的任何其他声明,如 const、联合或结构)。

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

我想运行一个命令...例如:

转换器 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
}

这可行吗?

最佳答案

一个非常快速和肮脏的解决方案 - 我确信有大量的解析器可以工作得更好,更好等等。但如果您的 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;
    }

}

关于java - 将 IDL 枚举解析为 Java 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11145364/

相关文章:

java - 关于java和flex整合的问题

linux - 通过 shell 脚本获取网站的 Url

python - 为什么在命令行中使用 sys.argv 时没有引号?

java - 构造函数之外无法识别对象

Java:通过匹配 LinkedHashMap 中的相似键来复制值

java - Flume + ElasticSearch 接收器 TTL

algorithm - 解析文本并返回相似性

c# - 如何将特定的 Json 节点反序列化为 Dictionary<string,object>?

python - 使用 isdigit 进行 float ?

bash - 从终端启动 GUI 程序而不发送垃圾邮件的优雅而有效的方式(Bash 或任何 Posix shell)