Skip to content
Snippets Groups Projects
xmlschema.jjt 10.3 KiB
Newer Older
Anders Nilsson's avatar
Anders Nilsson committed
/* -*-Java-*- */

/* 
 * Copyright (C) 2007  Anders Nilsson <anders.nilsson@cs.lth.se>
 *
 * This file is part of XmlSchemaCompiler.
 */

options {
    MULTI                       = true;
    VISITOR                     = true;
    NODE_DEFAULT_VOID           = true;
    NODE_SCOPE_HOOK             = false;
    NODE_PREFIX                 = "";
    JAVA_UNICODE_ESCAPE         = true;
    STATIC                      = false;
  	DEBUG_PARSER                = true;
//  	DEBUG_LOOKAHEAD             = true;
  	DEBUG_TOKEN_MANAGER         = true;
Anders Nilsson's avatar
Anders Nilsson committed
} // options


PARSER_BEGIN(SchemaParser)
package AST;
public class SchemaParser {
}
PARSER_END(SchemaParser)


//--------------------------------------------------------------------//
//                           LEXICAL TOKENS                           //
//--------------------------------------------------------------------//

<DEFAULT, BOUNDS> SKIP : /* WHITE SPACE */
{
    " "
    |
    "\t"
    |
    "\n"
    |
    "\r"
    |
    "\f"
}// WHITE SPACE


// <DEFAULT,BOUNDS> SPECIAL_TOKEN : /* COMMENTS */
// {
//     <SLASH_SLASH_COMMENT :  "//" (~["\n","\r"])* >
// }

SPECIAL_TOKEN : /* COMMENTS */
{
//     <SLASH_STAR_COMMENT  :  "/*" (~["*"])* "*" ("*" | (~["*","/"] (~["*"])* "*"))* "/"  >
< "<!--" ( ~["-"] | ( "-" ~["-"] ) )* "-->">
// 	| < "<rdfs:comment" ( ~["<"] | ( "<" ~["/"] ) )* "</rdfs:comment>" >
//     <XML_COMMENT  :  "<!--" (~["-","-",">"])* "-->"  >
}// COMMENTS


// <BOUNDS> TOKEN: {
//     < BEGINCOMMENT : "<!--"     >
//   | < ENDCOMMENT   : "-->"     >
// }

<DEFAULT, BOUNDS> TOKEN : /* RESERVED WORDS AND LITERALS */
{
    < XS_ANNOTATION            : "xs:annotation" >
  | < XS_APPINFO               : "xs:appinfo" >
  | < XS_DOCUMENTATION         : "xs:documentation" >
  | < XS_INCLUDE               : "xs:include" >
  | < XS_RESTRICTION           : "xs:restriction" >
  | < XS_SCHEMA                : "xs:schema" >
  | < XS_SIMPLETYPE            : "xs:simpleType" >
  | < ATTRIBUTEFORMDEFAULT     : "attributeFormDefault" >
  | < BASE                     : "base" >
  | < ELEMENTFORMDEFAULT       : "elementFormDefault" >
  | < ENCODING                 : "encoding" >
  | < SCHEMALOCATION           : "schemaLocation" >
  | < SOURCE                   : "source" >
  | < VERSION                  : "version" >
  | < XML                      : "xml"          >
  | < XMLNS_XS                 : "xmlns:xs"          >
Anders Nilsson's avatar
Anders Nilsson committed

}// RESERVED WORDS AND LITERALS
<DEFAULT, BOUNDS> TOKEN : /* LITERALS */
{
    < INTEGER_LITERAL:
        <DECIMAL_LITERAL> (["l","L"])?
        |
        <HEX_LITERAL> (["l","L"])?
        |
        <OCTAL_LITERAL> (["l","L"])?
    >
    |
    < #DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* >
    |
    < #HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+ >
    |
    < #OCTAL_LITERAL: "0" (["0"-"7"])* >
    |
    < FLOAT_LITERAL:
        (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? (["f","F","d","D"])?
        |
        "." (["0"-"9"])+ (<EXPONENT>)? (["f","F","d","D"])?
        |
        (["0"-"9"])+ <EXPONENT> (["f","F","d","D"])?
        |
        (["0"-"9"])+ (<EXPONENT>)? ["f","F","d","D"]
    >
    |
    < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
    |
    < CHARACTER_LITERAL:
        "'"
        (   (~["'","\\","\n","\r"])
            |
            ("\\"
                (   ["n","t","b","r","f","\\","'","\""]
                    |
                    ["0"-"7"] ( ["0"-"7"] )?
                    |
                    ["0"-"3"] ["0"-"7"] ["0"-"7"]
                )
            )
        )
        "'"
    >
    |
    < STRING_LITERAL:
        "\""
        (   (~["\"","\\","\n","\r"])
            |
            ("\\"
                (    ["n","t","b","r","f","\\","'","\""]
                     |
                     ["0"-"7"] ( ["0"-"7"] )?
                     |
                     ["0"-"3"] ["0"-"7"] ["0"-"7"]
                )
            )
        )*
        "\""
    >
}// LITERALS

<DEFAULT, BOUNDS> TOKEN : /* IDENTIFIERS */
{
    < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>|"-")* >
    |
    < #LETTER:
        [
        "\u0024",
        "\u0041"-"\u005a",
        "\u005f",
        "\u0061"-"\u007a",
        "\u00c0"-"\u00d6",
        "\u00d8"-"\u00f6",
        "\u00f8"-"\u00ff",
        "\u0100"-"\u1fff",
        "\u3040"-"\u318f",
        "\u3300"-"\u337f",
        "\u3400"-"\u3d2d",
        "\u4e00"-"\u9fff",
        "\uf900"-"\ufaff"
        ]
    >
    |
    < #DIGIT:
        [
        "\u0030"-"\u0039",
        "\u0660"-"\u0669",
        "\u06f0"-"\u06f9",
        "\u0966"-"\u096f",
        "\u09e6"-"\u09ef",
        "\u0a66"-"\u0a6f",
        "\u0ae6"-"\u0aef",
        "\u0b66"-"\u0b6f",
        "\u0be7"-"\u0bef",
        "\u0c66"-"\u0c6f",
        "\u0ce6"-"\u0cef",
        "\u0d66"-"\u0d6f",
        "\u0e50"-"\u0e59",
        "\u0ed0"-"\u0ed9",
        "\u1040"-"\u1049"
        ]
    >
}// IDENTIFIERS

<DEFAULT,BOUNDS> TOKEN : /* SEPARATORS */
{
      < LPAREN               : "("    >
    | < RPAREN               : ")"    >
    | < LBRACE               : "{"    >
Anders Nilsson's avatar
Anders Nilsson committed
    | < RBRACE               : "}"    >
    | < LBRACKET             : "["    >
    | < RBRACKET             : "]"    >
    | < SEMICOLON            : ";"    >
    | < COMMA                : ","    >
    | < DOT                  : "."    >
}// SEPARATORS


<DEFAULT,BOUNDS> TOKEN : /* OPERATORS */
{
      < ASSIGN               : "="    >
     | < GT                  : ">"    >
     | < END_TAG             : "</"    >
     | < LT                   : "<"    >
Anders Nilsson's avatar
Anders Nilsson committed
//     | < BANG                 : "!"    >
//     | < TILDE                : "~"    >
//     | < HOOK                 : "?"    >
     | < COLON                : ":"    >
//     | < EQ                   : "=="   >
//     | < LE                   : "<="   >
//     | < GE                   : ">="   >
//     | < NE                   : "!="   >
//     | < SC_OR                : "||"   >
//     | < SC_AND               : "&&"   >
//     | < INCR                 : "++"   >
//     | < DECR                 : "--"   >
     | < PLUS                 : "+"    >
     | < MINUS                : "-"    >
//     | < STAR                 : "*"    >
     | < SLASH                : "/"    >
//     | < BIT_AND              : "&"    >
//     | < BIT_OR               : "|"    >
//     | < XOR                  : "^"    >
//     | < REM                  : "%"    >
//     | < LSHIFT               : "<<"   >
//     | < RSIGNEDSHIFT         : ">>"   >
//     | < RUNSIGNEDSHIFT       : ">>>"  >
//     | < PLUSASSIGN           : "+="   >
//     | < MINUSASSIGN          : "-="   >
//     | < STARASSIGN           : "*="   >
//     | < SLASHASSIGN          : "/="   >
//     | < ANDASSIGN            : "&="   >
//     | < ORASSIGN             : "|="   >
//     | < XORASSIGN            : "^="   >
//     | < REMASSIGN            : "%="   >
//     | < LSHIFTASSIGN         : "<<="  >
//     | < RSIGNEDSHIFTASSIGN   : ">>="  >
//     | < RUNSIGNEDSHIFTASSIGN : ">>>=" >
}// OPERATORS


// <DEFAULT,BOUNDS> TOKEN : /* TEXT */
// {
//     < TEXT : <LETTER> (~["<",">"])*    >
// }// TEXT


//--------------------------------------------------------------------//
//                      THE OWL LANGUAGE GRAMMAR                     //
//--------------------------------------------------------------------//

Start Start() #Start : {}
{
    Specification()
  { return jjtThis; }
}

void Specification() #Specification : {}
{
    XmlHeader()
 	XsSchema()
Anders Nilsson's avatar
Anders Nilsson committed
}

void XmlHeader() #XmlHeader : {}
{
    "<?" <XML> AttributeList() "?>"
}

void XsSchema() #XsSchema : {}
    "<"  <XS_SCHEMA> AttributeList() ">"
Anders Nilsson's avatar
Anders Nilsson committed
	ElementList()
    "</" <XS_SCHEMA> ">"
Anders Nilsson's avatar
Anders Nilsson committed
}

void ElementList() #List : {}
{
    (Element())*    
}

void Element() : {}
{
    ( "<" (XsAnnotation()
		| XsAppinfo()
        | XsDocumentation()
        | XsInclude()
        | XsRestriction()
        | XsSimpleType()
 	| SimpleElement()
void XsAnnotation() #XsAnnotation : {}
    <XS_ANNOTATION> AttributeList() 
		 (">" ElementList() "</" <XS_ANNOTATION> ">" | ElementList() "/>")
void XsAppinfo() #XsAppinfo : {}
    <XS_APPINFO> AttributeList() 
		 (">" ElementList() "</" <XS_APPINFO> ">" | ElementList() "/>")
void XsDocumentation() #XsDocumentation : {}
    <XS_DOCUMENTATION> AttributeList() 
		 (">" ElementList() "</" <XS_DOCUMENTATION> ">" | ElementList() "/>")
void XsInclude() #XsInclude : {}
    <XS_INCLUDE> AttributeList() 
		 (">" ElementList() "</" <XS_INCLUDE> ">" | ElementList() "/>")
void XsRestriction() #XsRestriction : {}
    <XS_RESTRICTION> AttributeList() 
		 (">" ElementList() "</" <XS_RESTRICTION> ">" | ElementList() "/>")
void XsSimpleType() #XsSimpleType : {}
    <XS_SIMPLETYPE> AttributeList() 
		 (">" ElementList() "</" <XS_SIMPLETYPE> ">" | ElementList() "/>")
void SimpleElement() : {}
    IntElement()
        | FloatElement()
        | StringElement()
void IntElement() #IntElement : { Token t; }
    t = <INTEGER_LITERAL>
        {jjtThis.setINTEGER_LITERAL(t.image);}
void FloatElement() #FloatElement : { Token t; }
    t = <FLOAT_LITERAL>
        {jjtThis.setFLOAT_LITERAL(t.image);}
void StringElement() #StringElement : { Token t;String s; }
//     t = <IDENTIFIER> | t = <COMMA> | t = <MINUS> | t = <DOT> | t = <PLUS> | t = <SLASH>
//                 | t = <COLON>
	t = <IDENTIFIER>
	{
		s = t.image;
		if (getToken(1).kind != LT ) {
		getData(s);
	}
	}
        {jjtThis.setIDENTIFIER(t.image);}
JAVACODE
void getData(String s) {
//     jjtThis.someData = true;
    while ((getToken(1)).kind != END_TAG)
        s += getNextToken().image;
Anders Nilsson's avatar
Anders Nilsson committed
}

void AttributeList() #List : {}
{
    (Attribute())*
}

void Attribute() : {}
{
    Version()
  |	AttributeFormDefault()
  |	Base()
  |	ElementFormDefault()
  |	Encoding()
  |	Source()
  |	SchemaLocation()
  |	XmlnsXs()
void AttributeFormDefault() #AttributeFormDefault : {}
    <ATTRIBUTEFORMDEFAULT> <ASSIGN> Value()
void Base() #Base : {}
    <BASE> <ASSIGN> Value()
void ElementFormDefault() #ElementFormDefault : {}
    <ELEMENTFORMDEFAULT> <ASSIGN> Value()
void Encoding() #Encoding : {}
    <ENCODING> <ASSIGN> Value()
void Source() #Source : {}
    <SOURCE> <ASSIGN> Value()
void SchemaLocation() #SchemaLocation : {}
    <SCHEMALOCATION> <ASSIGN> Value()
void Version() #Version : {}
    <VERSION> <ASSIGN> Value()
void XmlnsXs() #XmlnsXs : {}
    <XMLNS_XS> <ASSIGN> Value()
Anders Nilsson's avatar
Anders Nilsson committed
}



void Value() #Value : { Token t; }
{
    t = <STRING_LITERAL>
	{jjtThis.setSTRING_LITERAL(t.image);}
}