gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:19:35 73 4
gpt4 key购买 nike

我有一堆充满枚举的 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/

73 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com