6 // Atsushi Enomoto <atsushi@ximian.com>
8 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 // attribute value template
33 // handle double literal
34 // string literal in XQuery and XPath2 are different
40 using System.Collections;
43 using System.Xml.Query;
44 using System.Xml.Schema;
45 using System.Xml.XPath;
46 using System.Security.Policy;
47 using Mono.Xml.XPath2;
48 using Mono.Xml.XQuery;
52 namespace Mono.Xml.XQuery.Parser
54 namespace Mono.Xml.XPath2.Parser
59 // See also FunctionCall production rule.
60 static Hashtable reservedFunctionNames;
61 static int yacc_verbose_flag;
65 reservedFunctionNames = new Hashtable ();
66 reservedFunctionNames.Add ("attribute", "attribute");
67 reservedFunctionNames.Add ("comment", "comment");
68 reservedFunctionNames.Add ("document", "document");
69 reservedFunctionNames.Add ("element", "element");
70 reservedFunctionNames.Add ("empty", "empty");
71 reservedFunctionNames.Add ("if", "if");
72 reservedFunctionNames.Add ("item", "item");
73 reservedFunctionNames.Add ("node", "node");
74 reservedFunctionNames.Add ("processing-instruction", "processing-instruction");
75 reservedFunctionNames.Add ("text", "text");
76 reservedFunctionNames.Add ("type", "type");
77 reservedFunctionNames.Add ("typeswitch", "typeswitch");
80 public static XQueryModule Parse (TextReader reader)
82 return new Parser ().RunParse (reader);
85 private XQueryTokenizer tokenizer;
86 private bool isXQueryMode;
93 private Parser (bool isXQueryMode)
95 this.isXQueryMode = isXQueryMode;
96 ErrorOutput = TextWriter.Null;
99 // FIXME: we don't need Evidence here at all. It is used only
100 // to generate runnable IL (on loading resulting Assembly).
101 public XQueryModule RunParse (TextReader source)
105 if (Environment.GetEnvironmentVariable ("MONO_DEBUG_XPATH2") == "yes")
106 debug = new yydebug.yyDebugSimple ();
107 tokenizer = new XQueryTokenizer (source);
108 XQueryModule mod = (XQueryModule) yyparse (tokenizer);
109 mod.NSResolver = tokenizer.NSResolver;
111 } catch (yyParser.yyException ex) {
112 throw new XmlQueryCompileException (String.Format ("Tokenizer error at line {0}, column {1}: {2}", tokenizer.LineNumber, tokenizer.LinePosition, ex.Message), ex);
116 public XmlTypeCode GetAtomicTypeCode (XmlQualifiedName name)
118 if (name.Namespace == InternalPool.XdtNamespace) {
120 case "anyAtomicType":
121 return XmlTypeCode.AnyAtomicType;
122 case "dayTimeDuration":
123 return XmlTypeCode.DayTimeDuration;
125 return XmlTypeCode.Item;
126 case "untypedAtomic":
127 return XmlTypeCode.UntypedAtomic;
128 case "yearMonthDuration":
129 return XmlTypeCode.YearMonthDuration;
131 } else if (name.Namespace == XmlSchema.Namespace) {
134 return XmlTypeCode.Boolean;
136 return XmlTypeCode.Byte;
138 return XmlTypeCode.Date;
140 return XmlTypeCode.DateTime;
142 return XmlTypeCode.Decimal;
144 return XmlTypeCode.Double;
146 return XmlTypeCode.Duration;
148 return XmlTypeCode.Entity;
150 return XmlTypeCode.Float;
152 return XmlTypeCode.GDay;
154 return XmlTypeCode.GMonth;
156 return XmlTypeCode.GMonthDay;
158 return XmlTypeCode.GYear;
160 return XmlTypeCode.GYearMonth;
162 return XmlTypeCode.HexBinary;
164 return XmlTypeCode.Id;
166 return XmlTypeCode.Idref;
168 return XmlTypeCode.Int;
170 return XmlTypeCode.Integer;
172 return XmlTypeCode.Language;
174 return XmlTypeCode.Long;
176 return XmlTypeCode.Name;
178 return XmlTypeCode.NCName;
179 case "negativeInteger":
180 return XmlTypeCode.NegativeInteger;
182 return XmlTypeCode.NmToken;
183 case "nonNegativeInteger":
184 return XmlTypeCode.NonNegativeInteger;
185 case "nonPositiveInteger":
186 return XmlTypeCode.NonPositiveInteger;
187 case "normalizedString":
188 return XmlTypeCode.NormalizedString;
190 return XmlTypeCode.Notation;
191 case "positiveInteger":
192 return XmlTypeCode.PositiveInteger;
194 return XmlTypeCode.QName;
196 return XmlTypeCode.Short;
198 return XmlTypeCode.String;
200 return XmlTypeCode.Time;
202 return XmlTypeCode.Token;
204 return XmlTypeCode.UnsignedByte;
206 return XmlTypeCode.UnsignedInt;
208 return XmlTypeCode.UnsignedLong;
209 case "unsignedShort":
210 return XmlTypeCode.UnsignedShort;
213 throw new XmlQueryCompileException (String.Format ("Unexpected type name was specified as atomic type: {0}", name));
218 /* --------------------------------------------------------
220 -------------------------------------------------------- */
222 /* These are for numbers */
223 //%token SMALL_E //"e"
224 //%token LARGE_E //"E"
229 %token OPEN_PAREN "("
230 %token OPEN_PAREN_COLON "(:"
231 %token PRAGMA_OPEN "(::"
232 %token CLOSE_PAREN ")"
235 %token PRAGMA_CLOSE "::)"
236 %token CLOSE_PAREN_COLON ":)"
237 %token COLON_EQUAL ":="
238 %token OPEN_BRACKET "["
239 %token CLOSE_BRACKET "]"
240 %token OPEN_CURLY "{"
241 %token CLOSE_CURLY "}"
245 %token NOT_EQUAL "!="
248 %token LESSER_EQUAL "<="
251 %token GREATER_EQUAL ">="
261 %token XQUERY //"xquery"
262 %token VERSION //"version"
263 %token PRAGMA //"pragma"
264 %token EXTENSION //"extension"
265 %token MODULE //"module"
266 %token NAMESPACE //"namespace"
267 %token DECLARE //"declare"
268 %token XMLSPACE //"xmlspace"
269 %token PRESERVE //"preserve"
270 %token STRIP //"strip"
271 %token DEFAULT //"default"
272 %token DOCUMENT_NODE //"document-node"
273 %token DOCUMENT //"document"
274 %token ELEMENT //"element"
275 %token ATTRIBUTE //"attribute"
276 %token PROCESSING_INSTRUCTION //"processing-instruction"
277 %token COMMENT //"comment"
280 %token FUNCTION //"function"
281 %token COLLATION //"collation"
282 %token CONSTRUCTION //"construction"
283 %token ORDERING //"ordering"
284 %token ORDERED //"ordered"
285 %token UNORDERED //"unordered"
286 %token BASEURI //"base-uri"
287 %token IMPORT //"import"
288 %token SCHEMA //"schema"
290 %token VARIABLE //"variable"
292 %token EXTERNAL //"external"
293 %token VALIDATION //"validation"
295 %token STRICT //"strict"
297 %token RETURN //"return"
301 %token WHERE //"where"
302 %token ORDER //"order"
304 %token STABLE //"stable"
305 %token ASCENDING //"ascending"
306 %token DESCENDING //"descending"
307 %token EMPTY //"empty"
308 %token GREATEST //"greatest"
309 %token LEAST //"least"
311 %token EVERY //"every"
312 %token SATISFIES //"satisfies"
323 %token INSTANCE //"instance"
328 %token TYPESWITCH //"typeswitch"
330 %token TREAT //"treat"
331 %token CASTABLE //"castable"
336 %token UNION //"union"
337 %token INTERSECT //"intersect"
338 %token EXCEPT //"except"
339 %token VALIDATE //"validate"
340 %token CONTEXT //"context"
341 %token NILLABLE //"nillable"
345 %token GLOBAL //"global"
348 %token CHILD //"child"
349 %token DESCENDANT //"descendant"
350 %token ATTRIBUTE //"attribute"
352 %token DESCENDANT_OR_SELF //"descendant-or-self"
353 %token FOLLOWING_SIBLING //"following-sibling"
354 %token FOLLOWING //"following"
355 %token PARENT //"parent"
356 %token ANCESTOR //"ancestor"
357 %token PRECEDING_SIBLING //"preceding-sibling"
358 %token PRECEDING //"preceding"
359 %token ANCESTOR_OR_SELF //"ancestor-or-self"
361 %token PRAGMA_START "(#"
362 %token PRAGMA_END "#)"
363 %token PragmaContents
368 %token WILD_LOCALNAME
371 %token STRING_LITERAL
372 %token DECIMAL_LITERAL
373 %token DOUBLE_LITERAL
375 %token PRAGMA_CONTENTS // characters until "::)"
378 %token PREDEFINED_ENTITY_REF
381 // Used only inside Constructor
382 %token XML_COMMENT_START // "<!--"
383 %token XML_COMMENT_TO_END // XML comment content immediate before "-->"
384 %token XML_PI_START // "<?"
385 %token XML_PI_TO_END // PI content immediate before "?>"
386 %token XML_CDATA_START // <![CDATA[
387 %token XML_CDATA_TO_END // CDATA section content immediate before "]]>"
388 %token EMPTY_TAG_CLOSE // "/>"
389 %token END_TAG_START // "</". Its appearance depends on the context
390 %token ATT_VALUE_LITERAL
391 %token ELEM_CONTENT_LITERAL
396 //%token QUOT2 //""""""
402 /* --------------------------------------------------------
404 -------------------------------------------------------- */
406 Module // returns Module
407 : VersionDecl MainModule
409 string version = (string) $1;
410 XQueryMainModule module = (XQueryMainModule) $2;
411 module.Version = version;
414 | VersionDecl LibraryModule
416 string version = (string) $1;
417 XQueryLibraryModule module = (XQueryLibraryModule) $2;
422 VersionDecl // returns string
427 | XQUERY VERSION STRING_LITERAL {
428 tokenizer.State = ParseState.Operator;
430 tokenizer.State = ParseState.Default;
437 MainModule // returns MainModule
440 Prolog prolog = (Prolog) $1;
441 ExprSequence body = (ExprSequence) $2;
443 XQueryMainModule mod = new XQueryMainModule ();
445 mod.QueryBody = body;
450 LibraryModule // returns LibraryModule
453 XQueryLibraryModule mod = new XQueryLibraryModule ();
454 mod.ModuleDecl = (ModuleDecl) $1;
455 mod.Prolog = (Prolog) $2;
460 ModuleDecl // returns ModuleDecl
462 tokenizer.State = ParseState.NamespaceDecl;
463 } NCName EQUAL STRING_LITERAL {
464 tokenizer.State = ParseState.Default;
467 ModuleDecl decl = new ModuleDecl ();
468 decl.Prefix = (string) $4;
469 decl.Namespace = (string) $6;
470 tokenizer.AddNamespace (decl.Prefix, decl.Namespace);
480 | PrologContent SEMICOLON Prolog
482 Prolog p = (Prolog) $3;
490 | DeclarationOrImport
493 // FIXME: this production rule is the right one, but it brings
494 // major shift/reduce conflicts.
496 Prolog // returns Prolog
497 : Setters DeclarationsAndImports
499 Prolog p = (Prolog) $1;
500 ArrayList al = (ArrayList) $2;
502 foreach (object o in al)
509 Setters // returns Prolog
514 | Setter SEMICOLON Setters
516 Prolog p = (Prolog) $3;
522 DeclarationsAndImports // returns ArrayList
527 | DeclarationOrImport SEMICOLON DeclarationsAndImports
529 ArrayList al = (ArrayList) $3;
531 al = new ArrayList ();
539 Setter // returns object
540 : XmlSpaceDecl // XmlSpaceDecl
541 | DefaultCollationDecl // SimplePrologContent
542 | BaseURIDecl // SimplePrologContent
543 | ConstructionDecl // ConstuctionDecl
544 | DefaultNamespaceDecl // SimplePrologContent
545 | DefaultOrderingDecl // bool
548 DeclarationOrImport // returns object
556 NamespaceDecl // returns XmlQualifiedName
557 : DECLARE NAMESPACE {
558 tokenizer.State = ParseState.NamespaceDecl;
559 } NCName EQUAL STRING_LITERAL {
560 tokenizer.State = ParseState.Default;
563 XmlQualifiedName name = new XmlQualifiedName ((string) $4, (string) $6);
564 tokenizer.AddNamespace (name.Name, name.Namespace);
569 XmlSpaceDecl // returns XmlSpaceDecl
571 tokenizer.State = ParseState.XmlSpaceDecl;
573 tokenizer.State = ParseState.Default;
576 $$ = new XmlSpaceDecl (XmlSpace.Preserve);
579 tokenizer.State = ParseState.XmlSpaceDecl;
581 tokenizer.State = ParseState.Default;
584 $$ = new XmlSpaceDecl (XmlSpace.Default);
588 ConstructionDecl // returns ConstructionDecl
589 : DECLARE CONSTRUCTION {
590 tokenizer.State = ParseState.Operator;
592 tokenizer.State = ParseState.Default;
595 $$ = new ConstructionDecl (XmlSpace.Preserve);
597 | DECLARE CONSTRUCTION {
598 tokenizer.State = ParseState.Operator;
600 tokenizer.State = ParseState.Default;
603 $$ = new ConstructionDecl (XmlSpace.Default);
607 DefaultNamespaceDecl // returns SimplePrologContent
608 : DECLARE DEFAULT ELEMENT {
609 tokenizer.State = ParseState.NamespaceKeyword;
611 tokenizer.State = ParseState.NamespaceDecl;
613 tokenizer.State = ParseState.Default;
616 tokenizer.AddNamespace (String.Empty, (string) $7);
617 $$ = new SimplePrologContent (PrologContentType.DefaultElementNamespace, (string) $7);
619 | DECLARE DEFAULT FUNCTION {
620 tokenizer.State = ParseState.NamespaceKeyword;
622 tokenizer.State = ParseState.NamespaceDecl;
624 tokenizer.State = ParseState.Default;
627 tokenizer.DefaultFunctionNamespace = (string) $5;
628 $$ = new SimplePrologContent (PrologContentType.DefaultFunctionNamespace, (string) $5);
632 DefaultCollationDecl // returns SimplePrologContent
633 : DECLARE DEFAULT COLLATION {
634 tokenizer.State = ParseState.NamespaceDecl;
636 tokenizer.State = ParseState.Default;
639 $$ = new SimplePrologContent (PrologContentType.DefaultCollation, (string) $4);
643 DefaultOrderingDecl // returns bool
644 : DECLARE DEFAULT ORDERING {
645 tokenizer.State = ParseState.Operator;
647 tokenizer.State = ParseState.Default;
652 | DECLARE DEFAULT ORDERING {
653 tokenizer.State = ParseState.Operator;
655 tokenizer.State = ParseState.Default;
662 BaseURIDecl // returns SimplePrologContent
664 tokenizer.State = ParseState.NamespaceDecl;
666 tokenizer.State = ParseState.Default;
669 $$ = new SimplePrologContent (PrologContentType.BaseUri, (string) $3);
673 SchemaImport // returns SchemaImport
675 tokenizer.State = ParseState.NamespaceKeyword;
676 } OptionalSchemaPrefix STRING_LITERAL {
677 tokenizer.State = ParseState.Default;
681 tokenizer.AddNamespace ((string) $4, (string) $5);
682 $$ = new SchemaImport ((string) $4, (string) $5, (ICollection) $7);
686 OptionalSchemaPrefix // returns string or null
694 SchemaPrefix // returns string
696 tokenizer.State = ParseState.NamespaceDecl;
702 | DEFAULT ELEMENT NAMESPACE {
703 tokenizer.State = ParseState.NamespaceDecl;
710 ModuleImport // returns ModuleImport
712 tokenizer.State = ParseState.NamespaceKeyword;
713 } OptionalModuleNamespace STRING_LITERAL {
714 tokenizer.State = ParseState.Default;
717 $$ = new ModuleImport ((string) $4, (string) $5, (ICollection) $7);
718 tokenizer.AddNamespace ((string) $4, (string) $5);
722 OptionalModuleNamespace // returns string
728 tokenizer.State = ParseState.NamespaceDecl;
735 OptionalLocations // returns ArrayList or null
740 | AT STRING_LITERAL AdditionalLocations
742 ArrayList al = (ArrayList) $3;
744 al = new ArrayList ();
745 al.Add ((string) $2);
750 AdditionalLocations // returns ArrayList or null
755 | COMMA STRING_LITERAL AdditionalLocations
757 ArrayList al = (ArrayList) $3;
759 al = new ArrayList ();
760 al.Add ((string) $2);
765 VarDecl // returns VariableDeclaration
766 : DECLARE VARIABLE DOLLAR {
767 tokenizer.PushState (ParseState.Default);
768 tokenizer.State = ParseState.VarName;
770 tokenizer.State = ParseState.Operator;
771 } OptionalTypeDeclaration VarDeclBody
773 $$ = new XQueryVariable ((XmlQualifiedName) $4, (SequenceType) $5, (ExprSequence) $6);
777 VarDeclBody // returns ExprSequence or null
779 tokenizer.State = ParseState.Default;
785 // LAMESPEC: This state transition is not described in XQuery 1.0 spec
786 tokenizer.PopState ();
793 VarName // returns XmlQualifiedName
795 tokenizer.State = ParseState.Operator;
802 OptionalTypeDeclaration // returns SequenceType or null
810 TypeDeclaration // returns SequenceType
811 : AS { // Note that this transition applies only at Operator state.
812 tokenizer.State = ParseState.ItemType;
819 FunctionDecl // returns FunctionDeclaration
821 tokenizer.PushState (ParseState.Default);
822 tokenizer.State = ParseState.Default;
823 } QName OPEN_PAREN OptionalParamList CLOSE_PAREN {
824 tokenizer.State = ParseState.Operator;
825 } OptionalTypeDeclaration FunctionBody
827 $$ = new FunctionDeclaration (
828 (XmlQualifiedName) $4,
829 (XQueryFunctionArgumentList) $6,
835 FunctionBody // returns EnclosedExpr or null
843 SequenceType // returns SequenceType
844 : ItemType OptionalOccurenceIndicator
846 $$ = new SequenceType ((ItemType) $1, (Occurence) $2);
848 | EMPTY OPEN_PAREN CLOSE_PAREN {
849 tokenizer.State = ParseState.Operator;
852 $$ = SequenceType.Create (XmlTypeCode.None, Occurence.One);
856 OptionalOccurenceIndicator // returns Occurence
864 OccurenceIndicator // returns Occurence
867 $$ = Occurence.Optional;
871 $$ = Occurence.ZeroOrMore;
875 $$ = Occurence.OneOrMore;
879 OptionalParamList // returns XQueryFunctionArgumentList
882 $$ = new XQueryFunctionArgumentList ();
887 ParamList // returns XQueryFunctionArgumentList
890 XQueryFunctionArgumentList pl = new XQueryFunctionArgumentList ();
891 pl.Add ((XQueryFunctionArgument) $1);
894 | Param COMMA ParamList
896 XQueryFunctionArgumentList pl = (XQueryFunctionArgumentList) $3;
897 pl.Insert (0, (XQueryFunctionArgument) $1);
902 Param // returns XQueryFunctionArgument
904 tokenizer.State = ParseState.VarName;
906 tokenizer.State = ParseState.Operator;
907 } OptionalTypeDeclaration
909 $$ = new XQueryFunctionArgument ((XmlQualifiedName) $3, (SequenceType) $5);
918 /* --------------------------------------------------------
920 -------------------------------------------------------- */
922 Expr // returns ExprSequence
925 ExprSequence seq = (ExprSequence) $1;
930 ExprSequence // returns ExprSequence
933 ExprSequence seq = new ExprSequence ();
934 seq.Add ((ExprSingle) $1);
937 | ExprSingle COMMA ExprSequence
939 ExprSequence seq = (ExprSequence) $3;
940 seq.Insert (0, (ExprSingle) $1);
946 ExprSingle // returns ExprSingle
955 ExprSingle // returns ExprSingle
965 /* -------------------------------------
967 ------------------------------------- */
970 : SimpleForClause RETURN ExprSingle {
972 throw new XmlQueryCompileException ("XQuery does not support for expression.");
973 ForLetClauseCollection col = new ForLetClauseCollection ();
974 col.Add ((ForClause) $1);
975 $$ = new FLWORExpr (col, null, null, (ExprSingle) $3);
979 SimpleForClause // returns ForClause
986 SimpleForBody // returns ForClause
987 : SimpleForSingleBody
989 ForClause fc = new ForClause ();
990 fc.Add ((ForSingleBody) $1);
993 | SimpleForSingleBody COMMA SimpleForBody
995 ForClause fc = (ForClause) $3;
996 fc.Insert (0, (ForSingleBody) $1);
1001 SimpleForSingleBody // returns ForSingleBody
1003 tokenizer.State = ParseState.VarName;
1005 tokenizer.State = ParseState.Operator;
1007 tokenizer.State = ParseState.Default;
1010 $$ = new ForSingleBody ((XmlQualifiedName) $3, (SequenceType) $5, null, (ExprSingle) $7);
1015 /* -------------------------------------
1017 ------------------------------------- */
1019 FLWORExpr // returns FLWORExpr
1020 : RepeatedForLetClause OptionalWhereClause OptionalOrderByClause RETURN {
1021 tokenizer.State = ParseState.Default;
1025 throw new XmlQueryCompileException ("XPath2 does not support FLWOR expression.");
1026 ForLetClauseCollection col = (ForLetClauseCollection) $1;
1027 $$ = new FLWORExpr (col, (ExprSequence) $2, (OrderSpecList) $3, (ExprSingle) $6);
1031 RepeatedForLetClause // returns ForLetClauseCollection
1034 ForLetClauseCollection col = new ForLetClauseCollection ();
1035 col.Add ((ForLetClause) $1);
1038 | ForLetClause RepeatedForLetClause
1040 ForLetClauseCollection col = (ForLetClauseCollection) $2;
1041 col.Insert (0, (ForLetClause) $1);
1046 ForLetClause // returns ForLetClause
1051 OptionalWhereClause // returns ExprSequence or null
1059 OptionalOrderByClause
1067 ForClause // returns ForClause
1070 ForClause fc = (ForClause) $2;
1078 ForClause fc = new ForClause ();
1079 fc.Add ((ForSingleBody) $1);
1082 | ForSingleBody COMMA ForBody
1084 ForClause fc = (ForClause) $3;
1085 fc.Insert (0, (ForSingleBody) $1);
1090 ForSingleBody // returns ForSingleBody
1092 tokenizer.State = ParseState.VarName;
1094 tokenizer.State = ParseState.Operator;
1095 } OptionalTypeDeclaration OptionalPositionalVar IN {
1096 tokenizer.State = ParseState.Default;
1099 $$ = new ForSingleBody ((XmlQualifiedName) $3, (SequenceType) $5, (XmlQualifiedName) $6, (ExprSingle) $9);
1106 LetClause let = (LetClause) $2;
1114 LetClause lc = new LetClause ();
1115 lc.Add ((LetSingleBody) $1);
1118 | LetSingleBody COMMA LetBody
1120 LetClause let = (LetClause) $3;
1121 let.Insert (0, (LetSingleBody) $1);
1127 tokenizer.State = ParseState.VarName;
1129 tokenizer.State = ParseState.Operator;
1130 } OptionalTypeDeclaration COLON_EQUAL {
1131 tokenizer.State = ParseState.Default;
1134 $$ = new LetSingleBody ((XmlQualifiedName) $3, (SequenceType) $5, (ExprSingle) $8);
1138 OptionalPositionalVar // returns XmlQualifiedName
1141 $$ = XmlQualifiedName.Empty;
1148 tokenizer.State = ParseState.Default;
1150 tokenizer.State = ParseState.VarName;
1152 tokenizer.State = ParseState.Operator;
1159 WhereClause // returns ExprSequence
1161 tokenizer.State = ParseState.Default;
1168 OrderByClause // returns OrderSpecList
1170 tokenizer.State = ParseState.Default;
1173 OrderSpecList l = (OrderSpecList) $4;
1177 tokenizer.State = ParseState.Default;
1180 OrderSpecList l = (OrderSpecList) $5;
1186 OrderSpecList // returns OrderSpecList
1189 OrderSpecList osl = new OrderSpecList ();
1190 osl.Add ((OrderSpec) $1);
1193 | OrderSpec COMMA OrderSpecList
1195 OrderSpecList l = (OrderSpecList) $3;
1196 l.Insert (0, (OrderSpec) $1);
1201 OrderSpec // returns OrderSpec
1202 : ExprSingle OrderModifier
1204 $$ = new OrderSpec ((ExprSingle) $1, (OrderModifier) $2);
1209 : OrderSpecBase OrderEmptyHandling OptionalCollation
1211 $$ = new OrderModifier ((XmlSortOrder) $1, (XmlSortOrder) $2, (string) $3);
1215 OrderSpecBase // returns XmlSortOrder
1218 $$ = XmlSortOrder.Ascending;
1222 $$ = XmlSortOrder.Ascending;
1226 $$ = XmlSortOrder.Descending;
1230 /* FIXME: check if it is correct (especially empty case) */
1231 OrderEmptyHandling // returns XmlSortOrder
1234 $$ = XmlSortOrder.Ascending;
1238 $$ = XmlSortOrder.Ascending;
1242 $$ = XmlSortOrder.Descending;
1246 OptionalCollation // returns string
1251 | COLLATION STRING_LITERAL
1257 /* -------------------------------------
1259 ------------------------------------- */
1262 : SOME QuantifiedExprBody SATISFIES ExprSingle
1264 QuantifiedExprBodyList l = (QuantifiedExprBodyList) $2;
1265 $$ = new QuantifiedExpr (false, l, (ExprSingle) $4);
1267 | EVERY QuantifiedExprBody SATISFIES ExprSingle
1269 QuantifiedExprBodyList l = (QuantifiedExprBodyList) $2;
1270 $$ = new QuantifiedExpr (true, l, (ExprSingle) $4);
1275 : SingleQuantifiedExprBody
1277 QuantifiedExprBodyList l = new QuantifiedExprBodyList ();
1278 l.Add ((QuantifiedExprBody) $1);
1281 | SingleQuantifiedExprBody COMMA QuantifiedExprBody
1283 QuantifiedExprBodyList l = (QuantifiedExprBodyList) $3;
1284 l.Insert (0, (QuantifiedExprBody) $1);
1289 SingleQuantifiedExprBody // returns QuantifiedExprBody
1291 tokenizer.State = ParseState.VarName;
1293 tokenizer.State = ParseState.Operator;
1294 } OptionalTypeDeclaration IN {
1295 tokenizer.State = ParseState.Default;
1298 $$ = new QuantifiedExprBody ((XmlQualifiedName) $3, (SequenceType) $5, (ExprSingle) $8);
1302 /* -------------------------------------
1304 ------------------------------------- */
1306 TypeswitchExpr // returns TypeswitchExpr
1307 : TYPESWITCH OPEN_PAREN {
1308 tokenizer.PushState (ParseState.Operator);
1309 tokenizer.State = ParseState.Default;
1310 } Expr CLOSE_PAREN {
1311 tokenizer.State = ParseState.Operator;
1312 } RepeatedCaseClause DEFAULT OptionalVarSpec RETURN {
1313 tokenizer.State = ParseState.Default;
1317 throw new XmlQueryCompileException ("XPath2 does not support typeswitch.");
1318 $$ = new TypeswitchExpr ((ExprSequence) $4, (CaseClauseList) $7, (XmlQualifiedName) $9, (ExprSingle) $12);
1322 RepeatedCaseClause // returns CaseClauseList
1325 CaseClauseList ccl = new CaseClauseList ();
1326 ccl.Add ((CaseClause) $1);
1329 | CaseClause RepeatedCaseClause
1331 CaseClauseList l = (CaseClauseList) $2;
1332 l.Add ((CaseClause) $1);
1337 CaseClause // returns CaseClause
1339 tokenizer.State = ParseState.ItemType;
1340 } SequenceType RETURN {
1341 tokenizer.State = ParseState.Default;
1344 $$ = new CaseClause ((SequenceType) $3, (ExprSingle) $6, XmlQualifiedName.Empty);
1347 tokenizer.State = ParseState.ItemType;
1349 tokenizer.State = ParseState.VarName;
1351 tokenizer.State = ParseState.Operator;
1353 tokenizer.State = ParseState.ItemType;
1354 } SequenceType RETURN {
1355 tokenizer.State = ParseState.Default;
1358 $$ = new CaseClause ((SequenceType) $9, (ExprSingle) $12, (XmlQualifiedName) $5);
1362 OptionalVarSpec // returns XmlQualifiedName
1365 $$ = XmlQualifiedName.Empty;
1369 $$ = (XmlQualifiedName) $2;
1373 /* -------------------------------------
1375 ------------------------------------- */
1378 : IF OPEN_PAREN Expr CLOSE_PAREN {
1379 tokenizer.State = ParseState.Operator;
1381 tokenizer.State = ParseState.Default;
1383 tokenizer.State = ParseState.Default;
1386 $$ = new IfExpr ((ExprSequence) $3, (ExprSingle) $8, (ExprSingle) $11);
1390 /* -------------------------------------
1392 ------------------------------------- */
1397 tokenizer.State = ParseState.Default;
1400 $$ = new OrExpr ((ExprSingle) $1, (ExprSingle) $4);
1406 | InstanceOfExpr AND {
1407 tokenizer.State = ParseState.Default;
1410 $$ = new AndExpr ((ExprSingle) $1, (ExprSingle) $4);
1414 /* -------------------------------------
1416 ------------------------------------- */
1420 | TreatExpr INSTANCE OF {
1421 tokenizer.State = ParseState.ItemType;
1424 $$ = new InstanceOfExpr ((ExprSingle) $1, (SequenceType) $5);
1430 | CastableExpr TREAT AS {
1431 tokenizer.State = ParseState.ItemType;
1434 $$ = new TreatExpr ((ExprSingle) $1, (SequenceType) $5);
1440 | CastExpr CASTABLE AS {
1441 tokenizer.State = ParseState.ItemType;
1442 } AtomicType OptionalQuestion
1444 $$ = new CastableExpr ((ExprSingle) $1, (XmlTypeCode) $5, (bool)$6);
1461 | ComparisonExpr CAST AS {
1462 tokenizer.State = ParseState.ItemType;
1463 } AtomicType OptionalQuestion
1465 $$ = new CastExpr ((ExprSingle) $1, (XmlTypeCode) $5, (bool) $6);
1469 /* -------------------------------------
1470 Comparison Expressions
1471 ------------------------------------- */
1476 tokenizer.State = ParseState.Default;
1479 $$ = new ComparisonExpr ((ExprSingle) $1, (ExprSingle) $4, (ComparisonOperator) $2);
1483 Comp // returns ComparisonOperator
1492 $$ = ComparisonOperator.ValueEQ;
1496 $$ = ComparisonOperator.ValueNE;
1500 $$ = ComparisonOperator.ValueLT;
1504 $$ = ComparisonOperator.ValueLE;
1508 $$ = ComparisonOperator.ValueGT;
1512 $$ = ComparisonOperator.ValueGE;
1519 $$ = ComparisonOperator.GeneralEQ;
1523 $$ = ComparisonOperator.GeneralNE;
1527 $$ = ComparisonOperator.GeneralLT;
1531 $$ = ComparisonOperator.GeneralLE;
1535 $$ = ComparisonOperator.GeneralGT;
1539 $$ = ComparisonOperator.GeneralGE;
1546 $$ = ComparisonOperator.NodeIs;
1550 $$ = ComparisonOperator.NodeFWD;
1554 $$ = ComparisonOperator.NodeBWD;
1561 tokenizer.State = ParseState.Default;
1564 $$ = new RangeExpr ((ExprSingle) $1, (ExprSingle)$4);
1568 /* -------------------------------------
1569 Arithmetic Expressions
1570 ------------------------------------- */
1573 : MultiplicativeExpr
1574 | MultiplicativeExpr PLUS {
1575 tokenizer.State = ParseState.Default;
1578 $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Add);
1580 | MultiplicativeExpr MINUS {
1581 tokenizer.State = ParseState.Default;
1584 $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Sub);
1590 | UnaryExpr ASTERISK {
1591 tokenizer.State = ParseState.Default;
1592 } MultiplicativeExpr
1594 $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Mul);
1597 tokenizer.State = ParseState.Default;
1598 } MultiplicativeExpr
1600 $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Div);
1603 tokenizer.State = ParseState.Default;
1604 } MultiplicativeExpr
1606 $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.IDiv);
1609 tokenizer.State = ParseState.Default;
1610 } MultiplicativeExpr
1612 $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.IMod);
1620 $$ = new MinusExpr ((ExprSingle) $2);
1629 : IntersectExceptExpr
1630 | IntersectExceptExpr UNION {
1631 tokenizer.State = ParseState.Default;
1634 $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Union);
1636 | IntersectExceptExpr BAR {
1637 tokenizer.State = ParseState.Default;
1640 $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Union);
1646 | ValueExpr INTERSECT {
1647 tokenizer.State = ParseState.Default;
1648 } IntersectExceptExpr
1650 $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Intersect);
1652 | ValueExpr EXCEPT {
1653 tokenizer.State = ParseState.Default;
1654 } IntersectExceptExpr
1656 $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Except);
1666 /* -----------------
1667 Extension Expressions
1668 ----------------- */
1671 : PragmaList OPEN_CURLY OptionalExpr CLOSE_CURLY
1674 throw new XmlQueryCompileException ("XPath2 does not suport extension expression.");
1675 throw new NotImplementedException ();
1687 throw new NotImplementedException ();
1691 throw new NotImplementedException ();
1696 : PRAGMA_START QName PragmaContents PRAGMA_END
1698 throw new NotImplementedException ();
1703 /* -----------------
1704 Validation Expressions
1705 ----------------- */
1707 // FIXME: Here state transition is not well-tracked.
1709 ValidateExpr // returns ValidateExpr
1710 : VALIDATE OptionalValidationMode OPEN_CURLY {
1711 tokenizer.State = ParseState.Default;
1712 tokenizer.PushState (ParseState.Operator);
1716 throw new XmlQueryCompileException ("XPath2 does not support validate expression.");
1717 $$ = new ValidateExpr ((XmlSchemaContentProcessing) $2, (ExprSequence) $6);
1721 OptionalValidationMode // returns XmlSchemaContentProcessing
1724 $$ = XmlSchemaContentProcessing.Strict; // FIXME: confirm
1728 $$ = XmlSchemaContentProcessing.Lax;
1732 $$ = XmlSchemaContentProcessing.Strict;
1736 /* -----------------
1738 ----------------- */
1740 PathExpr // returns PathExpr
1743 $$ = new PathRootExpr ();
1745 | Slash RelativePathExpr
1747 $$ = new PathSlashExpr (new PathRootExpr (), (ExprSingle) $2);
1749 | Slash2 RelativePathExpr
1751 $$ = new PathSlash2Expr (new PathRootExpr (), (ExprSingle) $2);
1756 RelativePathExpr // returns PathExpr
1758 | StepExpr Slash RelativePathExpr
1760 $$ = new PathSlashExpr ((ExprSingle) $1, (ExprSingle) $3);
1762 | StepExpr Slash2 RelativePathExpr
1764 $$ = new PathSlash2Expr ((ExprSingle) $1, (ExprSingle) $3);
1768 StepExpr // returns ExprSingle
1773 AxisStep // returns PathExpr
1774 : ForwardOrReverseStep
1775 | AxisStep Predicate
1777 $$ = new FilterStepExpr ((ExprSingle) $1, (ExprSequence) $2);
1781 ForwardOrReverseStep // returns ExprSingle
1787 : OPEN_BRACKET Expr CLOSE_BRACKET {
1788 tokenizer.State = ParseState.Operator;
1795 FilterStep // returns ExprSingle
1797 | FilterStep Predicate
1799 $$ = new FilterStepExpr ((ExprSingle) $1, (ExprSequence) $2);
1803 ForwardStep // returns AxisStepExpr
1804 : ForwardAxis NodeTest
1806 $$ = new AxisStepExpr ((XPathAxis) $1, (XPath2NodeTest) $2);
1811 ReverseStep // returns AxisStepExpr
1812 : ReverseAxis NodeTest
1814 $$ = new AxisStepExpr ((XPathAxis) $1, (XPath2NodeTest) $2);
1819 ForwardAxis // returns XPathAxis
1822 $$ = XPathAxis.Child;
1826 $$ = XPathAxis.Descendant;
1830 $$ = XPathAxis.Attribute;
1834 $$ = XPathAxis.Self;
1836 | DESCENDANT_OR_SELF COLON2
1838 $$ = XPathAxis.DescendantOrSelf;
1840 | FOLLOWING_SIBLING COLON2
1842 $$ = XPathAxis.FollowingSibling;
1846 $$ = XPathAxis.Following;
1851 throw new XmlQueryCompileException ("XQuery does not support namespace axis.");
1852 $$ = XPathAxis.NamespaceAxis;
1856 ReverseAxis // returns XPathAxis
1859 $$ = XPathAxis.Parent;
1863 $$ = XPathAxis.Ancestor;
1865 | PRECEDING_SIBLING COLON2
1867 $$ = XPathAxis.PrecedingSibling;
1871 $$ = XPathAxis.Preceding;
1873 | ANCESTOR_OR_SELF COLON2
1875 $$ = XPathAxis.AncestorOrSelf;
1879 // LAMESPEC: in the XQuery spec, it is "@? NodeTest", but NodeKindTest
1880 // should not appear after AT. (imagine @processing-instruction::(name)).
1881 AbbrevForwardStep // returns NodeTestExpr
1884 $$ = new AxisStepExpr (XPathAxis.Child, (XPath2NodeTest) $1);
1888 $$ = new AxisStepExpr (XPathAxis.Attribute, new XPath2NodeTest ((XmlQualifiedName) $2));
1892 AbbrevReverseStep // returns AxisStepExpr
1895 $$ = new AxisStepExpr (XPathAxis.Parent, null);
1899 NodeTest // returns NodeTest
1902 $$ = new XPath2NodeTest ((KindTest) $1);
1906 $$ = new XPath2NodeTest ((XmlQualifiedName) $1);
1910 NameTest // returns XmlQualifiedName
1913 tokenizer.State = ParseState.Operator;
1917 Wildcard // returns XmlQualifiedName /*ws:explicit*/
1920 $$ = new XmlQualifiedName ("*", "*");
1924 $$ = (XmlQualifiedName) $1;
1928 $$ = (XmlQualifiedName) $1;
1932 AtomicType // returns XmlTypeCode
1935 $$ = GetAtomicTypeCode ((XmlQualifiedName) $1);
1939 ItemType // returns ItemType
1941 tokenizer.State = ParseState.OccurenceIndicator;
1944 $$ = new ItemType ((XmlTypeCode) $1);
1947 | ITEM OPEN_PAREN CLOSE_PAREN {
1948 tokenizer.State = ParseState.OccurenceIndicator;
1951 $$ = new ItemType (XmlTypeCode.Item);
1955 KindTest // returns KindTest
1966 : PROCESSING_INSTRUCTION OPEN_PAREN {
1967 // LAMESPEC: push state is described as Operator, but should
1968 // be OccurenceIndicator (as any KindTest could be followed by
1970 tokenizer.PushState (ParseState.OccurenceIndicator);
1971 tokenizer.State = ParseState.KindTestForPI;
1972 } PITestContent CLOSE_PAREN {
1973 tokenizer.PopState ();
1980 PITestContent // returns KindTest
1983 $$ = new KindTest (XmlTypeCode.ProcessingInstruction);
1987 $$ = new XmlPITest ((string) $1);
1991 $$ = new XmlPITest ((string) $1);
1996 : COMMENT OPEN_PAREN {
1997 tokenizer.PushState (ParseState.OccurenceIndicator);
1998 tokenizer.State = ParseState.KindTest;
2000 tokenizer.PopState ();
2003 $$ = new KindTest (XmlTypeCode.Comment);
2009 tokenizer.PushState (ParseState.OccurenceIndicator);
2010 tokenizer.State = ParseState.KindTest;
2012 tokenizer.PopState ();
2015 $$ = new KindTest (XmlTypeCode.Text);
2021 tokenizer.PushState (ParseState.OccurenceIndicator);
2022 tokenizer.State = ParseState.KindTest;
2024 tokenizer.PopState ();
2027 $$ = new KindTest (XmlTypeCode.Node);
2031 DocumentTest // returns DocumentTest
2032 : DOCUMENT_NODE OPEN_PAREN {
2033 tokenizer.PushState (ParseState.OccurenceIndicator);
2034 tokenizer.State = ParseState.KindTest;
2035 } DocumentTestContent CLOSE_PAREN {
2036 tokenizer.PopState ();
2043 DocumentTestContent // returns DocumentTest
2046 $$ = new KindTest (XmlTypeCode.Document);
2050 $$ = new DocumentTest ((ElementTest) $1);
2054 ElementTest // returns ElementTest
2055 : ELEMENT OPEN_PAREN {
2056 tokenizer.PushState (ParseState.OccurenceIndicator);
2057 tokenizer.State = ParseState.KindTest;
2058 } ElementTestContent CLOSE_PAREN {
2059 tokenizer.PopState ();
2066 ElementTestContent // returns ElementTest
2069 $$ = new KindTest (XmlTypeCode.Element);
2071 | ElementNameOrWildcard
2073 $$ = new ElementTest ((XmlQualifiedName) $1);
2075 | ElementNameOrWildcard COMMA TypeName OptionalQuestion
2077 $$ = new ElementTest ((XmlQualifiedName) $1, (XmlQualifiedName) $3, (bool) $4);
2081 OptionalQuestion // returns bool
2092 AttributeTest // returns AttributeTest
2093 : ATTRIBUTE OPEN_PAREN {
2094 tokenizer.PushState (ParseState.OccurenceIndicator);
2095 tokenizer.State = ParseState.KindTest;
2096 } AttributeTestContent CLOSE_PAREN {
2097 tokenizer.PopState ();
2104 AttributeTestContent // returns AttributeTest
2107 $$ = AttributeTest.AnyAttribute;
2109 | AttributeNameOrWildcard
2111 $$ = new AttributeTest ((XmlQualifiedName) $1);
2113 | AttributeNameOrWildcard COMMA TypeNameOrWildcard
2115 $$ = new AttributeTest ((XmlQualifiedName) $1, (XmlQualifiedName) $3);
2131 ElementNameOrWildcard // returns XmlQualifiedName
2135 $$ = new XmlQualifiedName ("*", "*");
2139 AttributeNameOrWildcard // returns XmlQualifiedName
2143 $$ = new XmlQualifiedName ("*", "*");
2147 TypeNameOrWildcard // returns XmlQualifiedName
2151 $$ = new XmlQualifiedName ("*", "*");
2159 PrimaryExpr // returns ExprSingle
2161 tokenizer.State = ParseState.Operator;
2170 throw new XmlQueryCompileException ("XPath2 does not support constructor expression.");
2176 throw new XmlQueryCompileException ("XPath2 does not support ordered expression.");
2182 throw new XmlQueryCompileException ("XPath2 does not support unordered expression.");
2190 $$ = new DecimalLiteralExpr ((decimal) $1);
2194 $$ = new DoubleLiteralExpr ((double) $1);
2198 $$ = new StringLiteralExpr ((string) $1);
2215 | Digits DOT OptDigits
2219 : DoubleDecimalPartSpec ExponentSpec
2222 DoubleDecimalPartSpec
2225 | Digits DOT OptDigits
2229 | ExponentAlpha Digits
2230 | ExponentAlpha PLUS Digits
2231 | ExponentAlpha MINUS Digits
2249 : QUOT STRING_LITERALContentQuot
2250 | APOS STRING_LITERALContentApos
2253 STRING_LITERALContentQuot
2254 : PREDEFINED_ENTITY_REF
2260 STRING_LITERALContentApos
2261 : PREDEFINED_ENTITY_REF
2268 VarRef // returns VariableReferenceExpr
2270 tokenizer.State = ParseState.VarName;
2273 $$ = new VariableReferenceExpr ((XmlQualifiedName) $3);
2277 VarName // returns XmlQualifiedName
2279 tokenizer.State = ParseState.Operator;
2286 ParenthesizedExpr // returns ParenthesizedExpr
2287 : OPEN_PAREN OptionalExpr CLOSE_PAREN {
2288 tokenizer.State = ParseState.Operator;
2291 $$ = new ParenthesizedExpr ((ExprSequence) $2);
2298 $$ = new ExprSequence ();
2303 ContextItemExpr // returns ContextItemExpr
2305 tokenizer.State = ParseState.Operator;
2308 $$ = new ContextItemExpr ();
2313 : QName OPEN_PAREN {
2314 tokenizer.State = ParseState.Default;
2315 } OptionalExpr CLOSE_PAREN {
2316 tokenizer.State = ParseState.Operator;
2319 XmlQualifiedName name = (XmlQualifiedName) $1;
2320 if (name.Namespace == "")
2321 name = new XmlQualifiedName (name.Name, tokenizer.DefaultFunctionNamespace);
2322 if (name.Namespace != ""
2323 && name.Namespace != InternalPool.XdtNamespace
2324 && reservedFunctionNames [name.Name] != null)
2325 throw new XmlQueryCompileException (String.Format ("'{0}' is reserved and cannot be used as a function name.", name.Name));
2327 $$ = new FunctionCallExpr (name, (ExprSequence) $4);
2332 : ORDERED OPEN_BRACKET Expr CLOSE_BRACKET
2334 $$ = new OrderSpecifiedExpr ((ExprSequence) $3, true);
2339 : UNORDERED OPEN_BRACKET {
2340 tokenizer.PushState (ParseState.Operator);
2341 tokenizer.State = ParseState.Default;
2342 } Expr CLOSE_BRACKET {
2343 tokenizer.PopState ();
2346 $$ = new OrderSpecifiedExpr ((ExprSequence) $4, false);
2351 /* -----------------
2353 ----------------- */
2356 Constructor // returns ExprSingle
2357 : DirElemConstructor
2358 | ComputedConstructor
2364 DirElemConstructor // returns XmlElemConstructor
2366 if (tokenizer.State == ParseState.ElementContent)
2367 tokenizer.PushState (tokenizer.State);
2368 // if (tokenizer.State == ParseState.Default)
2369 else // considering <foo></foo><bar></bar> there after </foo> state is Operator.
2370 tokenizer.PushState (ParseState.Operator);
2371 tokenizer.State = ParseState.StartTag;
2372 // FIXME: tokenizer.Space = WhitespaceHandling.Significant;
2373 } QName AttributeList FollowDirElemConstructor {
2374 tokenizer.PopState ();
2377 ExprSequence expr = new ExprSequence ();
2378 expr.AddRange ((ICollection) $4);
2379 expr.AddRange ((ICollection) $5);
2380 $$ = new XmlElemConstructor ((XmlQualifiedName) $3, expr);
2384 FollowDirElemConstructor // returns ExprSequence
2387 $$ = new ExprSequence ();
2390 tokenizer.State = ParseState.ElementContent;
2391 } ElementContentList END_TAG_START {
2392 tokenizer.State = ParseState.EndTag;
2394 // tokenizer.Space = WhitespaceHandling.Arbitrary;
2401 ElementContentList // returns ExprSequence
2404 $$ = new ExprSequence ();
2406 | ElementContent ElementContentList
2408 ExprSequence el = (ExprSequence) $2;
2409 el.Insert (0, (ExprSingle) $1);
2414 AttributeList // returns XmlAttrConstructorList
2417 $$ = new XmlAttrConstructorList ();
2419 | /* space */ Attribute AttributeList
2421 XmlAttrConstructorList al = (XmlAttrConstructorList) $2;
2422 al.Insert (0, (XmlAttrConstructor) $1);
2427 Attribute // returns XmlAttrConstructor
2428 : QName /* opt-space */ EQUAL /* opt-space */ AttributeValue
2430 $$ = new XmlAttrConstructor ((XmlQualifiedName) $1, (ExprSequence) $3);
2435 // FIXME: it should be more complex
2436 AttributeValue // returns ExprSequence
2439 ExprSequence es = new ExprSequence ();
2440 es.Insert (0, new StringLiteralExpr ((string) $1));
2446 AttributeValue // returns ExprSequence
2448 tokenizer.State = ParseState.QuotAttributeContent;
2449 } AttributeValueContentSequence QUOT {
2450 tokenizer.State = ParseState.StartTag;
2456 tokenizer.State = ParseState.AposAttributeContent;
2457 } AttributeValueContentSequence APOS {
2458 tokenizer.State = ParseState.StartTag;
2466 AttributeValueContentSequence // returns ExprSequence
2469 $$ = new ExprSequence ();
2471 | AttributeValueContent AttributeValueContentSequence
2473 ExprSequence es = (ExprSequence) $2;
2474 es.Insert (0, (ExprSingle) $1);
2479 AttributeValueContent // returns ExprSingle
2480 : ATT_VALUE_LITERAL // including "{{", "}}" and char/predefined entities
2482 $$ = new StringLiteralExpr ((string) $1);
2487 EnclosedExpr // returns EnclosedExpr
2488 // FIXME: check if this state transition is valid for ElementContent and AttributeValueContent
2490 switch (tokenizer.State) {
2491 case ParseState.ElementContent:
2492 case ParseState.QuotAttributeContent:
2493 case ParseState.AposAttributeContent:
2494 tokenizer.PushState (tokenizer.State);
2497 tokenizer.State = ParseState.Default;
2500 $$ = new EnclosedExpr ((ExprSequence) $3);
2504 ElementContent // returns ExprSingle
2505 : ELEM_CONTENT_LITERAL // including "{{", "}}" and char/predefined entities
2507 $$ = new XmlTextConstructor ((string) $1);
2509 | DirElemConstructor
2517 : XML_CDATA_START XML_CDATA_TO_END
2519 $$ = new XmlTextConstructor ((string) $2);
2523 XmlComment // returns XmlCommentConstructor
2524 : XML_COMMENT_START XML_COMMENT_TO_END
2526 $$ = new XmlCommentConstructor ((string) $2);
2530 XmlPI // returns XmlPIConstructor
2532 tokenizer.PushState (tokenizer.State);
2533 tokenizer.State = ParseState.XmlPI;
2535 tokenizer.State = ParseState.XmlPIContent;
2537 tokenizer.PopState ();
2540 string name = (string) $3;
2541 $$ = new XmlPIConstructor (name, (string) $5);
2549 ComputedConstructor // returns ExprSingle
2550 : CompElemConstructor
2551 | CompAttrConstructor
2552 | CompDocConstructor
2553 | CompTextConstructor
2560 : ELEMENT QName OPEN_CURLY Expr CloseCurly
2562 $$ = new XmlElemConstructor ((XmlQualifiedName) $2, (ExprSequence) $4);
2564 | ELEMENT OPEN_CURLY Expr CloseCurly OPEN_CURLY Expr CloseCurly
2566 $$ = new XmlElemConstructor ((ExprSequence) $3, (ExprSequence) $6);
2571 : ATTRIBUTE QName OPEN_CURLY Expr CloseCurly
2573 $$ = new XmlAttrConstructor ((XmlQualifiedName) $2, (ExprSequence) $4);
2575 | ATTRIBUTE OPEN_CURLY Expr CloseCurly OPEN_CURLY Expr CloseCurly
2577 $$ = new XmlAttrConstructor ((ExprSequence) $3, (ExprSequence) $6);
2582 : NAMESPACE NCName OPEN_CURLY Expr CloseCurly
2584 $$ = new XmlNSConstructor ((string) $2, (ExprSequence) $4);
2589 : DOCUMENT OPEN_CURLY Expr CloseCurly
2591 $$ = new XmlDocConstructor ((ExprSequence) $3);
2596 : TEXT OPEN_CURLY Expr CloseCurly
2598 $$ = new XmlTextConstructor ((ExprSequence) $3);
2603 : COMMENT OPEN_CURLY Expr CloseCurly
2605 $$ = new XmlCommentConstructor ((ExprSequence) $3);
2610 : PROCESSING_INSTRUCTION NCName OPEN_CURLY Expr CloseCurly
2612 $$ = new XmlPIConstructor ((string) $2, (ExprSequence) $4);
2614 | PROCESSING_INSTRUCTION OPEN_CURLY Expr CloseCurly OPEN_CURLY Expr CloseCurly
2616 $$ = new XmlPIConstructor ((ExprSequence) $3, (ExprSequence) $6);
2620 /* -----------------
2622 ----------------- */
2625 NCName // returns string
2629 QName // returns XmlQualifiedName. Note that this state is just a wrapper for state transition.
2631 switch (tokenizer.State) {
2632 case ParseState.Default:
2633 tokenizer.State = ParseState.Operator;
2635 case ParseState.ItemType:
2636 tokenizer.State = ParseState.OccurenceIndicator;
2638 case ParseState.KindTest:
2639 case ParseState.SchemaContextStep:
2640 tokenizer.State = ParseState.CloseKindTest;
2642 case ParseState.ExtKey:
2643 tokenizer.State = ParseState.ExprComment;
2651 switch (tokenizer.State) {
2652 case ParseState.Operator:
2653 tokenizer.State = ParseState.Default;
2655 case ParseState.KindTest:
2656 tokenizer.State = ParseState.SchemaContextStep;
2664 if (tokenizer.State == ParseState.Operator)
2665 tokenizer.State = ParseState.Default;
2671 if (tokenizer.State == ParseState.Operator)
2672 tokenizer.PopState ();