运行JSON2XML_ST时出错

时间:2013-07-07 00:55:52

标签: antlr4 stringtemplate-4

我尝试运行JSON2XML_ST ike this:

bab@maz:~/tpantlr2-code/code/listeners$ antlr4 JSON.g4 
bab@maz:~/tpantlr2-code/code/listeners$ javac JSON2XML_ST.java 
bab@maz:~/tpantlr2-code/code/listeners$ java JSON2XML_ST t.json 

但是我得到了:

(json (object { (pair "description" : (value "An imaginary server config file")) ,      
(pair "logs" : (value (object { (pair "level" : (value "verbose")) , (pair "dir" :  
(value "/var/log")) }))) , (pair "host" : (value "antlr.org")) , (pair "admin" : (value 
(array [ (value "parrt") , (value "tombu") ]))) , (pair "aliases" : (value (array [ 
]))) }))
Exception in thread "main" java.lang.IllegalArgumentException: No such group file: XML.stg
at org.stringtemplate.v4.STGroupFile.<init>(STGroupFile.java:69)
at org.stringtemplate.v4.STGroupFile.<init>(STGroupFile.java:48)
at JSON2XML_ST$XMLEmitter.<init>(JSON2XML_ST.java:45)
at JSON2XML_ST.main(JSON2XML_ST.java:140)

为什么?有谁能够帮我?谢谢。

2 个答案:

答案 0 :(得分:1)

问题是XML.stg不是源代码的一部分。即,当您运行该示例时,文件XML.stg不存在,因此无法找到,因此没有这样的组文件的错误。

Exception in thread "main" java.lang.IllegalArgumentException: No such group file: XML.stg

这似乎是一个已知问题,并已在ANTLR勘误表中报告:  http://pragprog.com/titles/tpantlr2/errata

  

50831:

     

有一个对JSON2XML_ST.java源的引用,它使用StringTemplate进行XML转换。但是在源代码本身中引用了XML.stg文件,该文件在书籍源档案中不存在。   JSON2XML_ST.java(第45行):   STGroup templates = new STGroupFile(“XML.stg”);   如果你把它存档就好了,因为(恕我直言)在其他地方找到它并不容易。   感谢。

这里有一个xml.stg的引用:http://www.antlr.org/wiki/plugins/viewsource/viewpagesrc.action?pageId=16220704你可以使用它。

创建一个新文件并将其命名为XML.stg并输入以下内容:

group XML;

file(props) ::= <<
    \<properties>
    <props; separator="\n">
    \</properties>
>>

prop(ID,v) ::= "\<property id=\"<ID>\"><v>\</property>"

然后重新运行您已经拥有的示例,它可能会有效。

答案 1 :(得分:1)

这是一个可以与JSON2XML_ST.java一起使用的XML.stg。源代码下载仍然不包含XML.stg。然而,自己想出这个文件是一个很好的学习练习。这是给我的。

group XML;

empty() ::= ""

value(x) ::= "<x>"

object(fields) ::= <<

<fields; separator="\n">

>>

enclose_element(x) ::= <<
\<element><x>\</element>
>>

array(values) ::= <<

<values:enclose_element(); separator="\n">

>>

tag(name,content) ::= <<
\<<name>\><content>\</<name>\>
>>