[英]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.