我尝试运行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)
为什么?有谁能够帮我?谢谢。
答案 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>\>
>>