Newer
Older
* Copyright (C) 2007,2008,2009 Anders Nilsson <anders.nilsson@cs.lth.se>
* This file is part of XMLSchemaCompiler.
*
* XMLSchemaCompiler is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* XMLSchemaCompiler is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XMLSchemaCompiler. If not, see <http://www.gnu.org/licenses/>.
*/
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_TOKEN_MANAGER = true;
// DEBUG_LOOKAHEAD = true;
} // options
PARSER_BEGIN(SchemaParser)
package AST;
public class SchemaParser {
}
PARSER_END(SchemaParser)
//--------------------------------------------------------------------//
// LEXICAL TOKENS //
//--------------------------------------------------------------------//
// <DEFAULT, BOUNDS> SKIP : /* WHITE SPACE */
SPECIAL_TOKEN : /* WHITE SPACE */
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
{
" "
|
"\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_ANY : "xs:any" >
| < XS_ANYATTRIBUTE : "xs:anyAttribute" >
| < XS_ATTRIBUTE : "xs:attribute" >
| < XS_ATTRIBUTEGROUP : "xs:attributeGroup" >
| < XS_COMPLEXCONTENT : "xs:complexContent" >
| < XS_COMPLEXTYPE : "xs:complexType" >
| < XS_ELEMENT : "xs:element" >
| < XS_ENUMERATION : "xs:enumeration" >
| < XS_EXTENSION : "xs:extension" >
| < XS_GROUP : "xs:group" >
| < XS_MAXINCLUSIVE : "xs:maxInclusive" >
| < XS_MININCLUSIVE : "xs:minInclusive" >
| < XS_MINEXCLUSIVE : "xs:minExclusive" >
| < XS_MINLENGTH : "xs:minLength" >
| < XS_PATTERN : "xs:pattern" >
| < XS_SEQUENCE : "xs:sequence" >
Anders Nilsson
committed
| < XS_SIMPLECONTENT : "xs:simpleContent" >
| < XS_WHITESPACE : "xs:whiteSpace" >
| < ABSTRACT : "abstract" >
| < ATTRIBUTEFORMDEFAULT : "attributeFormDefault" >
| < BASE : "base" >
| < ELEMENTFORMDEFAULT : "elementFormDefault" >
| < ENCODING : "encoding" >
| < FIXED : "fixed" >
| < ITEMTYPE : "itemType" >
| < MINOCCURS : "minOccurs" >
| < MAXOCCURS : "maxOccurs" >
| < MIXED : "mixed" >
| < NAME : "name" >
| < NAMESPACE : "namespace" >
| < PROCESSCONTENTS : "processContents" >
| < SCHEMALOCATION : "schemaLocation" >
| < SOURCE : "source" >
| < VERSION : "version" >
| < XML : "xml" >
| < XMLNS_XS : "xmlns:xs" >
| < XMLNS_SCXML : "xmlns:scxml" >
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
}// 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"]
// )
// )
// )
// "'"
// >
|
"\'"
( (~["\'","\n","\r"])
)*
"\'"
// < 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",
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
"\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 */
{
| < CDATA_START : "<![CDATA[" >
| < CDATA_END : "]]>" >
| < RBRACE : "}" >
| < LBRACKET : "[" >
| < RBRACKET : "]" >
| < SEMICOLON : ";" >
| < COMMA : "," >
| < DOT : "." >
Anders Nilsson
committed
| < AT : "@" >
}// SEPARATORS
<DEFAULT,BOUNDS> TOKEN : /* OPERATORS */
{
< ASSIGN : "=" >
| < GT : ">" >
| < END_TAG : "</" >
| < LT : "<" >
// | < BANG : "!" >
// | < TILDE : "~" >
// | < HOOK : "?" >
| < COLON : ":" >
// | < EQ : "==" >
// | < LE : "<=" >
// | < GE : ">=" >
// | < NE : "!=" >
// | < SC_OR : "||" >
// | < SC_AND : "&&" >
// | < INCR : "++" >
// | < DECR : "--" >
| < PLUS : "+" >
| < MINUS : "-" >
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
// | < XOR : "^" >
// | < REM : "%" >
// | < LSHIFT : "<<" >
// | < RSIGNEDSHIFT : ">>" >
// | < RUNSIGNEDSHIFT : ">>>" >
// | < PLUSASSIGN : "+=" >
// | < MINUSASSIGN : "-=" >
// | < STARASSIGN : "*=" >
// | < SLASHASSIGN : "/=" >
// | < ANDASSIGN : "&=" >
// | < ORASSIGN : "|=" >
// | < XORASSIGN : "^=" >
// | < REMASSIGN : "%=" >
// | < LSHIFTASSIGN : "<<=" >
// | < RSIGNEDSHIFTASSIGN : ">>=" >
// | < RUNSIGNEDSHIFTASSIGN : ">>>=" >
}// OPERATORS
// <DEFAULT,BOUNDS> TOKEN : /* TEXT */
// {
// < TEXT : <LETTER> (~["<",">"])* >
// }// TEXT
//--------------------------------------------------------------------//
//--------------------------------------------------------------------//
Start Start() #Start : {}
{
Specification()
{ return jjtThis; }
}
void Specification() #Specification : {}
{
XmlHeader()
}
void XmlHeader() #XmlHeader : {}
{
"<?" <XML> AttributeList() "?>"
}
}
void ElementList() #List : {}
{
(Element())*
}
void Element() : {}
{
| XsAny()
| XsAnyAttribute()
| XsAppinfo()
| XsAttribute()
| XsAttributeGroup()
| XsChoice()
| XsComplexContent()
| XsComplexType()
| XsMaxInclusive()
| XsMinInclusive()
| XsMinExclusive()
Anders Nilsson
committed
| XsSimpleContent()
<XS_ANNOTATION> AttributeList()
(">" ElementList() "</" <XS_ANNOTATION> ">" | ElementList() "/>")
void XsAny() #XsAny : {}
{
<XS_ANY> AttributeList()
(">" ElementList() "</" <XS_ANY> ">" | ElementList() "/>")
}
void XsAnyAttribute() #XsAnyAttribute : {}
{
<XS_ANYATTRIBUTE> AttributeList()
(">" ElementList() "</" <XS_ANYATTRIBUTE> ">" | ElementList() "/>")
}
<XS_APPINFO> AttributeList()
(">" ElementList() "</" <XS_APPINFO> ">" | ElementList() "/>")
void XsAttribute() #XsAttribute : {}
{
<XS_ATTRIBUTE> AttributeList()
(">" ElementList() "</" <XS_ATTRIBUTE> ">" | ElementList() "/>")
}
void XsAttributeGroup() #XsAttributeGroup : {}
{
<XS_ATTRIBUTEGROUP> AttributeList()
(">" ElementList() "</" <XS_ATTRIBUTEGROUP> ">" | ElementList() "/>")
}
void XsChoice() #XsChoice : {}
{
<XS_CHOICE> AttributeList()
(">" ElementList() "</" <XS_CHOICE> ">" | ElementList() "/>")
}
void XsComplexContent() #XsComplexContent : {}
{
<XS_COMPLEXCONTENT> AttributeList()
(">" ElementList() "</" <XS_COMPLEXCONTENT> ">" | ElementList() "/>")
}
void XsComplexType() #XsComplexType : {}
{
<XS_COMPLEXTYPE> AttributeList()
(">" ElementList() "</" <XS_COMPLEXTYPE> ">" | ElementList() "/>")
}
void XsDocumentation() #XsDocumentation : {}
<XS_DOCUMENTATION> AttributeList()
(">" ElementList() "</" <XS_DOCUMENTATION> ">" | ElementList() "/>")
void XsElement() #XsElement : {}
{
<XS_ELEMENT> AttributeList()
(">" ElementList() "</" <XS_ELEMENT> ">" | ElementList() "/>")
}
void XsEnumeration() #XsEnumeration : {}
{
<XS_ENUMERATION> AttributeList()
(">" ElementList() "</" <XS_ENUMERATION> ">" | ElementList() "/>")
}
void XsExtension() #XsExtension : {}
{
<XS_EXTENSION> AttributeList()
(">" ElementList() "</" <XS_EXTENSION> ">" | ElementList() "/>")
}
void XsGroup() #XsGroup : {}
{
<XS_GROUP> AttributeList()
(">" ElementList() "</" <XS_GROUP> ">" | ElementList() "/>")
}
<XS_INCLUDE> AttributeList()
(">" ElementList() "</" <XS_INCLUDE> ">" | ElementList() "/>")
void XsMaxInclusive() #XsMaxInclusive : {}
{
<XS_MAXINCLUSIVE> AttributeList()
(">" ElementList() "</" <XS_MAXINCLUSIVE> ">" | ElementList() "/>")
}
void XsMinInclusive() #XsMinInclusive : {}
{
<XS_MININCLUSIVE> AttributeList()
(">" ElementList() "</" <XS_MININCLUSIVE> ">" | ElementList() "/>")
}
void XsMinExclusive() #XsMinExclusive : {}
{
<XS_MINEXCLUSIVE> AttributeList()
(">" ElementList() "</" <XS_MINEXCLUSIVE> ">" | ElementList() "/>")
}
void XsList() #XsList : {}
{
<XS_LIST> AttributeList()
(">" ElementList() "</" <XS_LIST> ">" | ElementList() "/>")
}
void XsMinLength() #XsMinLength : {}
{
<XS_MINLENGTH> AttributeList()
(">" ElementList() "</" <XS_MINLENGTH> ">" | ElementList() "/>")
}
void XsPattern() #XsPattern : {}
{
<XS_PATTERN> AttributeList()
(">" ElementList() "</" <XS_PATTERN> ">" | ElementList() "/>")
}
<XS_RESTRICTION> AttributeList()
(">" ElementList() "</" <XS_RESTRICTION> ">" | ElementList() "/>")
void XsSequence() #XsSequence : {}
{
<XS_SEQUENCE> AttributeList()
(">" ElementList() "</" <XS_SEQUENCE> ">" | ElementList() "/>")
}
Anders Nilsson
committed
void XsSimpleContent() #XsSimpleContent : {}
{
<XS_SIMPLECONTENT> AttributeList()
(">" ElementList() "</" <XS_SIMPLECONTENT> ">" | ElementList() "/>")
}
<XS_SIMPLETYPE> AttributeList()
(">" ElementList() "</" <XS_SIMPLETYPE> ">" | ElementList() "/>")
void XsWhiteSpace() #XsWhiteSpace : {}
{
<XS_WHITESPACE> AttributeList()
(">" ElementList() "</" <XS_WHITESPACE> ">" | ElementList() "/>")
}
| FloatElement()
| StringElement()
| CDataElement()
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>
{
s = t.image;
if (getToken(1).kind != LT ) {
while ((getToken(1)).kind != LT && (getToken(1)).kind != END_TAG) {
Token t = getNextToken();
if (t.specialToken != null) {
Token tmp_t = t.specialToken;
while (tmp_t.specialToken != null) {
tmp_t = tmp_t.specialToken;
while (tmp_t != null) {
s.append(tmp_t.image);
tmp_t = tmp_t.next;
}
}
s.append(t.image);
void CDataElement() #CDataElement : {String s; }
{
<CDATA_START>
{
s = new String();
if (getToken(1).kind != CDATA_END ) {
s += getCData();
}
}
<CDATA_END>
{jjtThis.setSTRING(s);}
}
JAVACODE
String getCData() {
StringBuffer s = new StringBuffer();
// jjtThis.someData = true;
while ((getToken(1)).kind != CDATA_END) {
Token t = getNextToken();
if (t.specialToken != null) {
Token tmp_t = t.specialToken;
while (tmp_t.specialToken != null) {
tmp_t = tmp_t.specialToken;
}
while (tmp_t != null) {
s.append(tmp_t.image);
tmp_t = tmp_t.next;
}
return s.toString();
}
void AttributeList() #List : {}
{
(Attribute())*
}
void Attribute() : {}
{
Version()
| Fixed()
| ItemType()
| MinOccurs()
| MaxOccurs()
| Mixed()
| Name()
void AttributeFormDefault() #AttributeFormDefault : {}
<ATTRIBUTEFORMDEFAULT> <ASSIGN> AttValue()
}
void Abstract() #Abstract : {}
{
<ABSTRACT> <ASSIGN> AttValue()
<BASE> <ASSIGN> AttValue()
}
void Default() #Default : {}
{
<DEFAULT_ATTR> <ASSIGN> AttValue()
void ElementFormDefault() #ElementFormDefault : {}
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
<ENCODING> <ASSIGN> AttValue()
}
void Fixed() #Fixed : {}
{
<FIXED> <ASSIGN> AttValue()
}
void MaxOccurs() #MaxOccurs : {}
{
<MAXOCCURS> <ASSIGN> AttValue()
}
void MinOccurs() #MinOccurs : {}
{
<MINOCCURS> <ASSIGN> AttValue()
}
void Mixed() #Mixed : {}
{
<MIXED> <ASSIGN> AttValue()
}
void Name() #Name : {}
{
<NAME> <ASSIGN> AttValue()
}
void Namespace() #Namespace : {}
{
<NAMESPACE> <ASSIGN> AttValue()
}
void ProcessContents() #ProcessContents : {}
{
<PROCESSCONTENTS> <ASSIGN> AttValue()
}
void ItemType() #ItemType : {}
{
<ITEMTYPE> <ASSIGN> AttValue()
}
void Ref() #Ref : {}
{
<REF> <ASSIGN> AttValue()
void TargetNamespace() #TargetNamespace : {}
{
<TARGETNAMESPACE> <ASSIGN> AttValue()
}
void Type() #Type : {}
{
<TYPE> <ASSIGN> AttValue()
}
void Use() #Use : {}
{
<USE> <ASSIGN> AttValue()
}
void Value() #Value : {}
{
<VALUE> <ASSIGN> AttValue()
void Xmlns() #Xmlns : {}
{
<XMLNS> <ASSIGN> AttValue()
}
void XmlnsScxml() #XmlnsScxml : {}
{
<XMLNS_SCXML> <ASSIGN> AttValue()
}
{
t = <STRING_LITERAL>
{jjtThis.setSTRING_LITERAL(t.image);}
}