2

我尝试像这样运行 JSON2XML_ST:

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)

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

4

2 回答 2

2

这是一个可与 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>\>
>>
于 2013-11-08T20:32:14.990 回答
1

问题是 XML.stg 不是源的一部分。即当您运行示例时,文件 XML.stg 不存在,因此无法找到,因此出现 No such group file 的错误。

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 模板 = 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>"

然后像您已经拥有的那样重新运行该示例,它可能会起作用。

于 2013-07-22T22:11:59.583 回答