[antlr-interest] XPA and ANTLR
Monty Zukowski
monty at codetransform.com
Wed Aug 11 19:29:00 PDT 2004
The best way I know to see that the tree parser is complete is to parse
to a tree and then back to text and do a diff.
The only other way I could think of is to make your own node type with
a flag for if it is visited. Override match() to set the flag and then
traverse the whole tree looking for any unset nodes.
Monty
On Aug 11, 2004, at 5:52 PM, ooobles wrote:
>
> Hi all,
>
> It's been a while since I've got to play with ANTLR in a new way.
> I've been happily making up new grammars for a while now. :) I now
> have the new challenge of parsing XML. After writing a 1200line parser
> that reads over a dom4j tree, I decided there must be a better way.
> Thankfully, I found XPA and have started writing a tree walker for
> reading XML Schemas (XSD).
>
> One thing I find with tree walkers is that I can't be sure if I missed
> nodes in the tree. A tree walker can silently skip child nodes
> because the grammar has already been met. Is there any way to force
> the parser to report an error when additional nodes have been found in
> the tree?
>
> I've been using one of the XPA examples to write the tree parser (see
> below). It *seems* to read XSD, but I'm quite sure it is skipping
> some elements.
>
> As an aside, has anyone already written an XSD parser that generates a
> nice internal model? :) I'm guessing I'll need to do a few passes
> over the XSD files to resolve all the data types, groups, elements,
> etc.
>
> Thanks,
> David.
>
> PS I read over a few other messages mentioning that there arn't many
> fans of XML here. I'm definately not a fan either, but when you
> work in a group that only does XML, you don't get much choice. :)
>
> -------------- XSD Tree Parser ----------------
>
> class ComponentTreeParser extends TreeParser;
> options
> {
> buildAST = true;
> ASTLabelType = "XMLAST";
> }
>
> // enable wildcard processing for xtal and
> // set wildcard element type to "<wildcard>"
> tokens
> {
> "<wildcard>";
> }
>
> schema : #(c:"<xsd:schema>" ( schemaImport | schemaInclude | element |
> complexType | complexContent | groupDef )* )
> ;
>
> schemaImport : imp:"<xsd:import>"
> ;
>
> schemaInclude : inc:"<xsd:include>"
> ;
>
> groupDef: #("<xsd:group>" sequence )
> ;
>
> annotation: #("<xsd:annotation>" documentation )
> ;
>
> documentation: "<xsd:documentation>"
> ;
>
> complexType: #( "<xsd:complexType>" ( annotation | sequence |
> attribute | simpleContent | complexContent )* )
> ;
>
> complexContent: #( "<xsd:complxContent>" extension )
> ;
>
> simpleContent: #( "<xsd:simpleContent>" extension )
> ;
>
> extension: #( "<xsd:extension>" ( attribute | sequence ) )
> ;
>
> sequence: #( "<xsd:sequence>" ( sequence | element | choice | groupRef
> )* )
> ;
>
> choice: #( "<xsd:choice>" ( element | sequence )* )
> ;
>
> groupRef: "<xsd:group>"
> ;
>
> attribute: #( "<xsd:attribute>" (simpleType)? )
> ;
>
> simpleType: #( "<xsd:simpleType>" restriction )
> ;
>
> restriction: #( "<xsd:restriction>" enumeration )
> ;
>
> enumeration: "<xsd:enumeration>"
> ;
>
>
>
>
>
>
>
> Yahoo! Groups Links
>
>
>
>
>
>
>
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/antlr-interest/
<*> To unsubscribe from this group, send an email to:
antlr-interest-unsubscribe at yahoogroups.com
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
More information about the antlr-interest
mailing list