ANTLR-在解析输入消息时填充Java类

ANTLR-在解析输入消息时填充Java类,java,antlr,abstract-syntax-tree,Java,Antlr,Abstract Syntax Tree,在解析输入消息时,如何使用ANTLR填充我的类 例如,如果我的输入消息是:name=Paul,age=16,country=china 在分析此消息时,我是否可以在语法文件中执行以下操作: Person p = new Person(); p.setName("Paul"); p.setAge("16"); p.setCountry("china"); 其中,Person.java是我构建的一个类。或者这只能在我打印AST的主Java类中进行?如果您想从name=Paul和age=16以及co

在解析输入消息时,如何使用ANTLR填充我的类

例如,如果我的输入消息是:name=Paul,age=16,country=china

在分析此消息时,我是否可以在语法文件中执行以下操作:

Person p = new Person();
p.setName("Paul");
p.setAge("16");
p.setCountry("china");

其中,Person.java是我构建的一个类。或者这只能在我打印AST的主Java类中进行?

如果您想从
name=Paul和age=16以及country=china
这种脚本创建类的实例,那么您可以创建自己的方法

public <T> T builder(Class<T> clazz, String line)
            throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
        T instance = clazz.newInstance();
        String[] exps = line.split("AND");
        for (String exp : exps) {

            String[] tokens = exp.split("=", 2);
            // TODO check if token has length==2
            tokens[0] = tokens[0].trim();
            tokens[1] = tokens[1].trim();
            String methodName = "set"
                    + (("" + tokens[0].charAt(0)).toUpperCase())
                    + tokens[0].substring(1);
            Method m1 = instance.getClass().getMethod(methodName, String.class);
            m1.invoke(instance, tokens[1]);
        }
        return instance;
    }
publictbuilder(类clazz,字符串行)
抛出实例化异常、IllegalAccessException、SecurityException、NoSuchMethodException、IllegalArgumentException、InvocationTargetException{
T instance=clazz.newInstance();
字符串[]exps=line.split(“AND”);
for(字符串exp:exps){
字符串[]标记=exp.split(“=”,2);
//TODO检查令牌的长度是否=2
令牌[0]=令牌[0].trim();
令牌[1]=令牌[1].trim();
String methodName=“set”
+(“”+令牌[0].charAt(0)).toUpperCase()
+令牌[0]。子字符串(1);
方法m1=instance.getClass().getMethod(方法名,String.class);
m1.调用(实例,令牌[1]);
}
返回实例;
}
当您调用它时,
builder(Person.class,“name=Paul,age=16,country=china”)
您将得到
Person
类的实例,其中填充了字段
name
age
country


这就是你想要的吗?

是的,你可以,但如果这只是你需要做的,你不需要antlrOK。但这有什么具体的语法吗?要将其写入语法文件?如果这
name=Paul,age=16,country=china就是你想要解析的,然后你需要做的就是摆脱
;'字符,在
和“
上拆分行,您可以使用
String.split()
然后数组中的每个条目在
'='
上再次拆分。然后使用反射从实例中获取setter并设置正确的参数。您想创建类的实例、源文件还是二进制文件?类似的。。。但我发现在运行时解析生成的AST比解析输入消息更好。