0

谁能告诉如何使用 ANTLR 工具(在 java 中)为 xml 文档创建我们自己的语法以及如何使用 ANTLR 工具(在 java 中)解析这些文档?

4

2 回答 2

2

查看 ANTXR,这是我在语法本身中支持 XML 标记的 ANTLR 派生。您可以使用 SAX 或 XMLPull 作为前端。(注意:它基于 ANTLR 2.x)

http://javadude.com/tools/antxr/index.html

简短的例子:

header {
package com.javadude.antlr.sample.xml;

import java.util.List;
import java.util.ArrayList;
}

class PeopleParser extends Parser;


document returns [List results = null]
  : results=<people> EOF
  ;

<people> returns [List results = new ArrayList()]
  { Person p; }
  : ( p=<person>  { results.add(p); }   )*
  ;

<person> returns [Person p = new Person()]
  {
    String first, last;
    p.setId(@id);  // attributes are read using "@xxxx"
  }
  : ( first=<firstName>  { p.setFirstName(first); }
    | last=<lastName>    { p.setLastName(last);   }
    )*
  ;

<firstName> returns [String value = null]
  : pcdata:PCDATA { value = pcdata.getText(); }
  ;

<lastName> returns [String value = null]
  : pcdata:PCDATA { value = pcdata.getText(); }
  ;
于 2009-11-18T21:03:13.067 回答
1

如果您想编写一个完全符合(甚至是非验证)的 XML 解析器,您必须阅读 W3C 规范(http://www.w3.org/TR/REC-xml/)。您将需要处理内部和外部 DTD 子集、参数实体和一般实体。这将是一项重大任务,即使使用 ANTLR。您将需要能够解析 URL 并处理命名空间URI。还有更多。

我怀疑您只想解析一个子集(尽管我认为为标准编写不符合标准的解析器不是一个好主意)。在这种情况下,第一件事是为您的子集编写 EBNF。那么它应该相当简单:-)

编辑说得很清楚:任何不符合完整规范的东西都不是 XML。您谈到为 XML 创建“自己的语法”,但是已经为 XML 定义了一个无法修改的语法。如果您希望创建自己的“类似于 XML”的语法,您可以,但是任何认为它实际上是 XML 的人都会感到失望,因为您不会支持许多 XML 结构(或者会以不同的方式支持)。

于 2009-11-19T23:29:26.910 回答