2014-05-13 17 views
0

我如何使用ANTLR,填充類礦,而我解析輸入消息?ANTLR - 填充一個Java類,在分析輸入消息

例如,如果我輸入的信息是:名=保羅和年齡= 16和國家=中國;

雖然我解析這個消息,我可以執行,在語法文件,是這樣的:

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

Person.java是我建立了一個類。或者這隻能在我打印AST的主要Java類中進行?

+0

是你可以,但如果這只是你需要做的,你不需要ANTLR – user902383

+0

確定。但是有沒有特定的語法?要在語法文件中寫入這些內容? – user2144555

+0

如果這個'名字=保羅和年齡= 16和國家=中國;'是你要分析一下,那麼所有你需要做的是擺脫掉';從行末'性格,分裂你行「」你可以使用'String.split()',然後你的數組中的每個條目再次在'=''上分開。然後通過使用反射從實例中獲得setter並設置正確的參數。你想創建你的類,源文件或二進制文件的實例嗎? – user902383

回答

0

如果你想從name = Paul AND age = 16 AND 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; 
    } 

,當你調用它builder(Person.class,"name = Paul AND age = 16 AND country = china")你會得到Person類的實例與填充字段nameagecountry

這是你在找什麼?

+0

類似的東西......但我發現,是更好地解析比在運行時輸入的消息產生的AST。 – user2144555