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
39 using System.Collections;
42 using System.Xml.Query;
43 using System.Xml.Schema;
44 using System.Xml.XPath;
45 using System.Security.Policy;
46 using Mono.Xml.XPath2;
47 using Mono.Xml.XQuery;
50 namespace Mono.Xml.XQuery.Parser
52 internal class XQueryParser
54 // See also FunctionCall production rule.
55 static Hashtable reservedFunctionNames;
57 static XQueryParser ()
59 reservedFunctionNames = new Hashtable ();
60 reservedFunctionNames.Add ("attribute", "attribute");
61 reservedFunctionNames.Add ("comment", "comment");
62 reservedFunctionNames.Add ("document", "document");
63 reservedFunctionNames.Add ("element", "element");
64 reservedFunctionNames.Add ("empty", "empty");
65 reservedFunctionNames.Add ("if", "if");
66 reservedFunctionNames.Add ("item", "item");
67 reservedFunctionNames.Add ("node", "node");
68 reservedFunctionNames.Add ("processing-instruction", "processing-instruction");
69 reservedFunctionNames.Add ("text", "text");
70 reservedFunctionNames.Add ("type", "type");
71 reservedFunctionNames.Add ("typeswitch", "typeswitch");
74 public static XQueryModule Parse (TextReader reader)
76 return new XQueryParser ().RunParse (reader);
79 private XQueryTokenizer tokenizer;
81 private XQueryParser ()
85 // FIXME: we don't need Evidence here at all. It is used only
86 // to generate runnable IL (on loading resulting Assembly).
87 public XQueryModule RunParse (TextReader source)
91 // debug = new yydebug.yyDebugSimple ();
92 tokenizer = new XQueryTokenizer (source);
93 XQueryModule mod = (XQueryModule) yyparse (tokenizer);
94 mod.NSResolver = tokenizer.NSResolver;
96 } catch (yyParser.yyException ex) {
97 throw new XmlQueryCompileException (String.Format ("Tokenizer error at line {0}, column {1}: {2}", tokenizer.LineNumber, tokenizer.LinePosition, ex.Message), ex);
101 public XmlTypeCode GetAtomicTypeCode (XmlQualifiedName name)
103 if (name.Namespace == InternalPool.XdtNamespace) {
105 case "anyAtomicType":
106 return XmlTypeCode.AnyAtomicType;
107 case "dayTimeDuration":
108 return XmlTypeCode.DayTimeDuration;
110 return XmlTypeCode.Item;
111 case "untypedAtomic":
112 return XmlTypeCode.UntypedAtomic;
113 case "yearMonthDuration":
114 return XmlTypeCode.YearMonthDuration;
116 } else if (name.Namespace == XmlSchema.Namespace) {
119 return XmlTypeCode.Boolean;
121 return XmlTypeCode.Byte;
123 return XmlTypeCode.Date;
125 return XmlTypeCode.DateTime;
127 return XmlTypeCode.Decimal;
129 return XmlTypeCode.Double;
131 return XmlTypeCode.Duration;
133 return XmlTypeCode.Entity;
135 return XmlTypeCode.Float;
137 return XmlTypeCode.GDay;
139 return XmlTypeCode.GMonth;
141 return XmlTypeCode.GMonthDay;
143 return XmlTypeCode.GYear;
145 return XmlTypeCode.GYearMonth;
147 return XmlTypeCode.HexBinary;
149 return XmlTypeCode.Id;
151 return XmlTypeCode.Idref;
153 return XmlTypeCode.Int;
155 return XmlTypeCode.Integer;
157 return XmlTypeCode.Language;
159 return XmlTypeCode.Long;
161 return XmlTypeCode.Name;
163 return XmlTypeCode.NCName;
164 case "negativeInteger":
165 return XmlTypeCode.NegativeInteger;
167 return XmlTypeCode.NmToken;
168 case "nonNegativeInteger":
169 return XmlTypeCode.NonNegativeInteger;
170 case "nonPositiveInteger":
171 return XmlTypeCode.NonPositiveInteger;
172 case "normalizedString":
173 return XmlTypeCode.NormalizedString;
175 return XmlTypeCode.Notation;
176 case "positiveInteger":
177 return XmlTypeCode.PositiveInteger;
179 return XmlTypeCode.QName;
181 return XmlTypeCode.Short;
183 return XmlTypeCode.String;
185 return XmlTypeCode.Time;
187 return XmlTypeCode.Token;
189 return XmlTypeCode.UnsignedByte;
191 return XmlTypeCode.UnsignedInt;
193 return XmlTypeCode.UnsignedLong;
194 case "unsignedShort":
195 return XmlTypeCode.UnsignedShort;
198 throw new XmlQueryCompileException (String.Format ("Unexpected type name was specified as atomic type: {0}", name));
203 /* --------------------------------------------------------
205 -------------------------------------------------------- */
207 /* These are for numbers */
208 //%token SMALL_E //"e"
209 //%token LARGE_E //"E"
214 %token OPEN_PAREN "("
215 %token OPEN_PAREN_COLON "(:"
216 %token PRAGMA_OPEN "(::"
217 %token CLOSE_PAREN ")"
220 %token PRAGMA_CLOSE "::)"
221 %token CLOSE_PAREN_COLON ":)"
222 %token COLON_EQUAL ":="
223 %token OPEN_BRACKET "["
224 %token CLOSE_BRACKET "]"
225 %token OPEN_CURLY "{"
226 %token CLOSE_CURLY "}"
230 %token NOT_EQUAL "!="
233 %token LESSER_EQUAL "<="
236 %token GREATER_EQUAL ">="
246 %token XQUERY //"xquery"
247 %token VERSION //"version"
248 %token PRAGMA //"pragma"
249 %token EXTENSION //"extension"
250 %token MODULE //"module"
251 %token NAMESPACE //"namespace"
252 %token DECLARE //"declare"
253 %token XMLSPACE //"xmlspace"
254 %token PRESERVE //"preserve"
255 %token STRIP //"strip"
256 %token DEFAULT //"default"
257 %token DOCUMENT_NODE //"document-node"
258 %token DOCUMENT //"document"
259 %token ELEMENT //"element"
260 %token ATTRIBUTE //"attribute"
261 %token PROCESSING_INSTRUCTION //"processing-instruction"
262 %token COMMENT //"comment"
265 %token FUNCTION //"function"
266 %token COLLATION //"collation"
267 %token CONSTRUCTION //"construction"
268 %token ORDERING //"ordering"
269 %token ORDERED //"ordered"
270 %token UNORDERED //"unordered"
271 %token BASEURI //"base-uri"
272 %token IMPORT //"import"
273 %token SCHEMA //"schema"
275 %token VARIABLE //"variable"
277 %token EXTERNAL //"external"
278 %token VALIDATION //"validation"
280 %token STRICT //"strict"
282 %token RETURN //"return"
286 %token WHERE //"where"
287 %token ORDER //"order"
289 %token STABLE //"stable"
290 %token ASCENDING //"ascending"
291 %token DESCENDING //"descending"
292 %token EMPTY //"empty"
293 %token GREATEST //"greatest"
294 %token LEAST //"least"
296 %token EVERY //"every"
297 %token SATISFIES //"satisfies"
308 %token INSTANCE //"instance"
313 %token TYPESWITCH //"typeswitch"
315 %token TREAT //"treat"
316 %token CASTABLE //"castable"
321 %token UNION //"union"
322 %token INTERSECT //"intersect"
323 %token EXCEPT //"except"
324 %token VALIDATE //"validate"
325 %token CONTEXT //"context"
326 %token NILLABLE //"nillable"
330 %token GLOBAL //"global"
333 %token CHILD //"child"
334 %token DESCENDANT //"descendant"
335 %token ATTRIBUTE //"attribute"
337 %token DESCENDANT_OR_SELF //"descendant-or-self"
338 %token FOLLOWING_SIBLING //"following-sibling"
339 %token FOLLOWING //"following"
340 %token PARENT //"parent"
341 %token ANCESTOR //"ancestor"
342 %token PRECEDING_SIBLING //"preceding-sibling"
343 %token PRECEDING //"preceding"
344 %token ANCESTOR_OR_SELF //"ancestor-or-self"
350 %token WILD_LOCALNAME
353 %token STRING_LITERAL
354 %token DECIMAL_LITERAL
355 %token DOUBLE_LITERAL
357 %token PRAGMA_CONTENTS // characters until "::)"
360 %token PREDEFINED_ENTITY_REF
363 // Used only inside Constructor
364 %token XML_COMMENT_START // "<!--"
365 %token XML_COMMENT_TO_END // XML comment content immediate before "-->"
366 %token XML_PI_START // "<?"
367 %token XML_PI_TO_END // PI content immediate before "?>"
368 %token XML_CDATA_START // <![CDATA[
369 %token XML_CDATA_TO_END // CDATA section content immediate before "]]>"
370 %token EMPTY_TAG_CLOSE // "/>"
371 %token END_TAG_START // "</". Its appearance depends on the context
372 %token ATT_VALUE_LITERAL
373 %token ELEM_CONTENT_LITERAL
378 //%token QUOT2 //""""""
384 /* --------------------------------------------------------
386 -------------------------------------------------------- */
388 Module // returns Module
389 : VersionDecl MainModule
391 string version = (string) $1;
392 XQueryMainModule module = (XQueryMainModule) $2;
393 module.Version = version;
396 | VersionDecl LibraryModule
398 string version = (string) $1;
399 XQueryLibraryModule module = (XQueryLibraryModule) $2;
404 VersionDecl // returns string
409 | XQUERY VERSION STRING_LITERAL {
410 tokenizer.State = ParseState.Operator;
412 tokenizer.State = ParseState.Default;
419 MainModule // returns MainModule
422 Prolog prolog = (Prolog) $1;
423 ExprSequence body = (ExprSequence) $2;
425 XQueryMainModule mod = new XQueryMainModule ();
427 mod.QueryBody = body;
432 LibraryModule // returns LibraryModule
435 XQueryLibraryModule mod = new XQueryLibraryModule ();
436 mod.ModuleDecl = (ModuleDecl) $1;
437 mod.Prolog = (Prolog) $2;
442 ModuleDecl // returns ModuleDecl
444 tokenizer.State = ParseState.NamespaceDecl;
445 } NCName EQUAL STRING_LITERAL {
446 tokenizer.State = ParseState.Default;
449 ModuleDecl decl = new ModuleDecl ();
450 decl.Prefix = (string) $4;
451 decl.Namespace = (string) $6;
452 tokenizer.AddNamespace (decl.Prefix, decl.Namespace);
462 | PrologContent SEMICOLON Prolog
464 Prolog p = (Prolog) $3;
472 | DeclarationOrImport
475 // FIXME: this production rule is the right one, but it brings
476 // major shift/reduce conflicts.
478 Prolog // returns Prolog
479 : Setters DeclarationsAndImports
481 Prolog p = (Prolog) $1;
482 ArrayList al = (ArrayList) $2;
484 foreach (object o in al)
491 Setters // returns Prolog
496 | Setter SEMICOLON Setters
498 Prolog p = (Prolog) $3;
504 DeclarationsAndImports // returns ArrayList
509 | DeclarationOrImport SEMICOLON DeclarationsAndImports
511 ArrayList al = (ArrayList) $3;
513 al = new ArrayList ();
521 Setter // returns object
522 : XmlSpaceDecl // XmlSpaceDecl
523 | DefaultCollationDecl // SimplePrologContent
524 | BaseURIDecl // SimplePrologContent
525 | ConstructionDecl // ConstuctionDecl
526 | DefaultNamespaceDecl // SimplePrologContent
527 | DefaultOrderingDecl // bool
530 DeclarationOrImport // returns object
538 NamespaceDecl // returns XmlQualifiedName
539 : DECLARE NAMESPACE {
540 tokenizer.State = ParseState.NamespaceDecl;
541 } NCName EQUAL STRING_LITERAL {
542 tokenizer.State = ParseState.Default;
545 XmlQualifiedName name = new XmlQualifiedName ((string) $4, (string) $6);
546 tokenizer.AddNamespace (name.Name, name.Namespace);
551 XmlSpaceDecl // returns XmlSpaceDecl
553 tokenizer.State = ParseState.XmlSpaceDecl;
555 tokenizer.State = ParseState.Default;
558 $$ = new XmlSpaceDecl (XmlSpace.Preserve);
561 tokenizer.State = ParseState.XmlSpaceDecl;
563 tokenizer.State = ParseState.Default;
566 $$ = new XmlSpaceDecl (XmlSpace.Default);
570 ConstructionDecl // returns ConstructionDecl
571 : DECLARE CONSTRUCTION {
572 tokenizer.State = ParseState.Operator;
574 tokenizer.State = ParseState.Default;
577 $$ = new ConstructionDecl (XmlSpace.Preserve);
579 | DECLARE CONSTRUCTION {
580 tokenizer.State = ParseState.Operator;
582 tokenizer.State = ParseState.Default;
585 $$ = new ConstructionDecl (XmlSpace.Default);
589 DefaultNamespaceDecl // returns SimplePrologContent
590 : DECLARE DEFAULT ELEMENT {
591 tokenizer.State = ParseState.NamespaceKeyword;
593 tokenizer.State = ParseState.NamespaceDecl;
595 tokenizer.State = ParseState.Default;
598 tokenizer.AddNamespace (String.Empty, (string) $7);
599 $$ = new SimplePrologContent (PrologContentType.DefaultElementNamespace, (string) $7);
601 | DECLARE DEFAULT FUNCTION {
602 tokenizer.State = ParseState.NamespaceKeyword;
604 tokenizer.State = ParseState.NamespaceDecl;
606 tokenizer.State = ParseState.Default;
609 tokenizer.DefaultFunctionNamespace = (string) $5;
610 $$ = new SimplePrologContent (PrologContentType.DefaultFunctionNamespace, (string) $5);
614 DefaultCollationDecl // returns SimplePrologContent
615 : DECLARE DEFAULT COLLATION {
616 tokenizer.State = ParseState.NamespaceDecl;
618 tokenizer.State = ParseState.Default;
621 $$ = new SimplePrologContent (PrologContentType.DefaultCollation, (string) $4);
625 DefaultOrderingDecl // returns bool
626 : DECLARE DEFAULT ORDERING {
627 tokenizer.State = ParseState.Operator;
629 tokenizer.State = ParseState.Default;
634 | DECLARE DEFAULT ORDERING {
635 tokenizer.State = ParseState.Operator;
637 tokenizer.State = ParseState.Default;
644 BaseURIDecl // returns SimplePrologContent
646 tokenizer.State = ParseState.NamespaceDecl;
648 tokenizer.State = ParseState.Default;
651 $$ = new SimplePrologContent (PrologContentType.BaseUri, (string) $3);
655 SchemaImport // returns SchemaImport
657 tokenizer.State = ParseState.NamespaceKeyword;
658 } OptionalSchemaPrefix STRING_LITERAL {
659 tokenizer.State = ParseState.Default;
663 tokenizer.AddNamespace ((string) $4, (string) $5);
664 $$ = new SchemaImport ((string) $4, (string) $5, (ICollection) $7);
668 OptionalSchemaPrefix // returns string or null
676 SchemaPrefix // returns string
678 tokenizer.State = ParseState.NamespaceDecl;
684 | DEFAULT ELEMENT NAMESPACE {
685 tokenizer.State = ParseState.NamespaceDecl;
692 ModuleImport // returns ModuleImport
694 tokenizer.State = ParseState.NamespaceKeyword;
695 } OptionalModuleNamespace STRING_LITERAL {
696 tokenizer.State = ParseState.Default;
699 $$ = new ModuleImport ((string) $4, (string) $5, (ICollection) $7);
700 tokenizer.AddNamespace ((string) $4, (string) $5);
704 OptionalModuleNamespace // returns string
710 tokenizer.State = ParseState.NamespaceDecl;
717 OptionalLocations // returns ArrayList or null
722 | AT STRING_LITERAL AdditionalLocations
724 ArrayList al = (ArrayList) $3;
726 al = new ArrayList ();
727 al.Add ((string) $2);
732 AdditionalLocations // returns ArrayList or null
737 | COMMA STRING_LITERAL AdditionalLocations
739 ArrayList al = (ArrayList) $3;
741 al = new ArrayList ();
742 al.Add ((string) $2);
747 VarDecl // returns VariableDeclaration
748 : DECLARE VARIABLE DOLLAR {
749 tokenizer.PushState (ParseState.Default);
750 tokenizer.State = ParseState.VarName;
752 tokenizer.State = ParseState.Operator;
753 } OptionalTypeDeclaration VarDeclBody
755 $$ = new XQueryVariable ((XmlQualifiedName) $4, (SequenceType) $5, (ExprSequence) $6);
759 VarDeclBody // returns ExprSequence or null
761 tokenizer.State = ParseState.Default;
767 // LAMESPEC: This state transition is not described in XQuery 1.0 spec
768 tokenizer.PopState ();
775 VarName // returns XmlQualifiedName
777 tokenizer.State = ParseState.Operator;
784 OptionalTypeDeclaration // returns SequenceType or null
792 TypeDeclaration // returns SequenceType
793 : AS { // Note that this transition applies only at Operator state.
794 tokenizer.State = ParseState.ItemType;
801 FunctionDecl // returns FunctionDeclaration
803 tokenizer.PushState (ParseState.Default);
804 tokenizer.State = ParseState.Default;
805 } QName OPEN_PAREN OptionalParamList CLOSE_PAREN {
806 tokenizer.State = ParseState.Operator;
807 } OptionalTypeDeclaration FunctionBody
809 $$ = new FunctionDeclaration (
810 (XmlQualifiedName) $4,
811 (XQueryFunctionArgumentList) $6,
817 FunctionBody // returns EnclosedExpr or null
825 SequenceType // returns SequenceType
826 : ItemType OptionalOccurenceIndicator
828 $$ = new SequenceType ((ItemType) $1, (Occurence) $2);
830 | EMPTY OPEN_PAREN CLOSE_PAREN {
831 tokenizer.State = ParseState.Operator;
834 $$ = SequenceType.Create (XmlTypeCode.None, Occurence.One);
838 OptionalOccurenceIndicator // returns Occurence
846 OccurenceIndicator // returns Occurence
849 $$ = Occurence.Optional;
853 $$ = Occurence.ZeroOrMore;
857 $$ = Occurence.OneOrMore;
861 OptionalParamList // returns XQueryFunctionArgumentList
864 $$ = new XQueryFunctionArgumentList ();
869 ParamList // returns XQueryFunctionArgumentList
872 XQueryFunctionArgumentList pl = new XQueryFunctionArgumentList ();
873 pl.Add ((XQueryFunctionArgument) $1);
876 | Param COMMA ParamList
878 XQueryFunctionArgumentList pl = (XQueryFunctionArgumentList) $3;
879 pl.Insert (0, (XQueryFunctionArgument) $1);
884 Param // returns XQueryFunctionArgument
886 tokenizer.State = ParseState.VarName;
888 tokenizer.State = ParseState.Operator;
889 } OptionalTypeDeclaration
891 $$ = new XQueryFunctionArgument ((XmlQualifiedName) $3, (SequenceType) $5);
900 /* --------------------------------------------------------
902 -------------------------------------------------------- */
904 Expr // returns ExprSequence
907 ExprSequence seq = (ExprSequence) $1;
912 ExprSequence // returns ExprSequence
915 ExprSequence seq = new ExprSequence ();
916 seq.Add ((ExprSingle) $1);
919 | ExprSingle COMMA ExprSequence
921 ExprSequence seq = (ExprSequence) $3;
922 seq.Insert (0, (ExprSingle) $1);
927 ExprSingle // returns ExprSingle
935 /* -------------------------------------
937 ------------------------------------- */
939 FLWORExpr // returns FLWORExpr
940 : RepeatedForLetClause OptionalWhereClause OptionalOrderByClause RETURN {
941 tokenizer.State = ParseState.Default;
944 ForLetClauseCollection col = (ForLetClauseCollection) $1;
945 $$ = new FLWORExpr (col, (ExprSequence) $2, (OrderSpecList) $3, (ExprSingle) $6);
949 RepeatedForLetClause // returns ForLetClauseCollection
952 ForLetClauseCollection col = new ForLetClauseCollection ();
953 col.Add ((ForLetClause) $1);
956 | ForLetClause RepeatedForLetClause
958 ForLetClauseCollection col = (ForLetClauseCollection) $2;
959 col.Insert (0, (ForLetClause) $1);
964 ForLetClause // returns ForLetClause
969 OptionalWhereClause // returns ExprSequence or null
977 OptionalOrderByClause
985 ForClause // returns ForClause
988 ForClause fc = (ForClause) $2;
996 ForClause fc = new ForClause ();
997 fc.Add ((ForSingleBody) $1);
1000 | ForSingleBody COMMA ForBody
1002 ForClause fc = (ForClause) $3;
1003 fc.Insert (0, (ForSingleBody) $1);
1008 ForSingleBody // returns ForSingleBody
1010 tokenizer.State = ParseState.VarName;
1012 tokenizer.State = ParseState.Operator;
1013 } OptionalTypeDeclaration OptionalPositionalVar IN {
1014 tokenizer.State = ParseState.Default;
1017 $$ = new ForSingleBody ((XmlQualifiedName) $3, (SequenceType) $5, (XmlQualifiedName) $6, (ExprSingle) $9);
1024 LetClause let = (LetClause) $2;
1032 LetClause lc = new LetClause ();
1033 lc.Add ((LetSingleBody) $1);
1036 | LetSingleBody COMMA LetBody
1038 LetClause let = (LetClause) $3;
1039 let.Insert (0, (LetSingleBody) $1);
1045 tokenizer.State = ParseState.VarName;
1047 tokenizer.State = ParseState.Operator;
1048 } OptionalTypeDeclaration COLON_EQUAL {
1049 tokenizer.State = ParseState.Default;
1052 $$ = new LetSingleBody ((XmlQualifiedName) $3, (SequenceType) $5, (ExprSingle) $8);
1056 OptionalPositionalVar // returns XmlQualifiedName
1059 $$ = XmlQualifiedName.Empty;
1066 tokenizer.State = ParseState.Default;
1068 tokenizer.State = ParseState.VarName;
1070 tokenizer.State = ParseState.Operator;
1077 WhereClause // returns ExprSequence
1079 tokenizer.State = ParseState.Default;
1086 OrderByClause // returns OrderSpecList
1088 tokenizer.State = ParseState.Default;
1091 OrderSpecList l = (OrderSpecList) $4;
1095 tokenizer.State = ParseState.Default;
1098 OrderSpecList l = (OrderSpecList) $5;
1104 OrderSpecList // returns OrderSpecList
1107 OrderSpecList osl = new OrderSpecList ();
1108 osl.Add ((OrderSpec) $1);
1111 | OrderSpec COMMA OrderSpecList
1113 OrderSpecList l = (OrderSpecList) $3;
1114 l.Insert (0, (OrderSpec) $1);
1119 OrderSpec // returns OrderSpec
1120 : ExprSingle OrderModifier
1122 $$ = new OrderSpec ((ExprSingle) $1, (OrderModifier) $2);
1127 : OrderSpecBase OrderEmptyHandling OptionalCollation
1129 $$ = new OrderModifier ((XmlSortOrder) $1, (XmlSortOrder) $2, (string) $3);
1133 OrderSpecBase // returns XmlSortOrder
1136 $$ = XmlSortOrder.Ascending;
1140 $$ = XmlSortOrder.Ascending;
1144 $$ = XmlSortOrder.Descending;
1148 /* FIXME: check if it is correct (especially empty case) */
1149 OrderEmptyHandling // returns XmlSortOrder
1152 $$ = XmlSortOrder.Ascending;
1156 $$ = XmlSortOrder.Ascending;
1160 $$ = XmlSortOrder.Descending;
1164 OptionalCollation // returns string
1169 | COLLATION STRING_LITERAL
1175 /* -------------------------------------
1177 ------------------------------------- */
1180 : SOME QuantifiedExprBody SATISFIES ExprSingle
1182 QuantifiedExprBodyList l = (QuantifiedExprBodyList) $2;
1183 $$ = new QuantifiedExpr (false, l, (ExprSingle) $4);
1185 | EVERY QuantifiedExprBody SATISFIES ExprSingle
1187 QuantifiedExprBodyList l = (QuantifiedExprBodyList) $2;
1188 $$ = new QuantifiedExpr (true, l, (ExprSingle) $4);
1193 : SingleQuantifiedExprBody
1195 QuantifiedExprBodyList l = new QuantifiedExprBodyList ();
1196 l.Add ((QuantifiedExprBody) $1);
1199 | SingleQuantifiedExprBody COMMA QuantifiedExprBody
1201 QuantifiedExprBodyList l = (QuantifiedExprBodyList) $3;
1202 l.Insert (0, (QuantifiedExprBody) $1);
1207 SingleQuantifiedExprBody // returns QuantifiedExprBody
1209 tokenizer.State = ParseState.VarName;
1211 tokenizer.State = ParseState.Operator;
1212 } OptionalTypeDeclaration IN {
1213 tokenizer.State = ParseState.Default;
1216 $$ = new QuantifiedExprBody ((XmlQualifiedName) $3, (SequenceType) $5, (ExprSingle) $8);
1220 /* -------------------------------------
1222 ------------------------------------- */
1224 TypeswitchExpr // returns TypeswitchExpr
1225 : TYPESWITCH OPEN_PAREN {
1226 tokenizer.PushState (ParseState.Operator);
1227 tokenizer.State = ParseState.Default;
1228 } Expr CLOSE_PAREN {
1229 tokenizer.State = ParseState.Operator;
1230 } RepeatedCaseClause DEFAULT OptionalVarSpec RETURN {
1231 tokenizer.State = ParseState.Default;
1234 $$ = new TypeswitchExpr ((ExprSequence) $4, (CaseClauseList) $7, (XmlQualifiedName) $9, (ExprSingle) $12);
1238 RepeatedCaseClause // returns CaseClauseList
1241 CaseClauseList ccl = new CaseClauseList ();
1242 ccl.Add ((CaseClause) $1);
1245 | CaseClause RepeatedCaseClause
1247 CaseClauseList l = (CaseClauseList) $2;
1248 l.Add ((CaseClause) $1);
1253 CaseClause // returns CaseClause
1255 tokenizer.State = ParseState.ItemType;
1256 } SequenceType RETURN {
1257 tokenizer.State = ParseState.Default;
1260 $$ = new CaseClause ((SequenceType) $3, (ExprSingle) $6, XmlQualifiedName.Empty);
1263 tokenizer.State = ParseState.ItemType;
1265 tokenizer.State = ParseState.VarName;
1267 tokenizer.State = ParseState.Operator;
1269 tokenizer.State = ParseState.ItemType;
1270 } SequenceType RETURN {
1271 tokenizer.State = ParseState.Default;
1274 $$ = new CaseClause ((SequenceType) $9, (ExprSingle) $12, (XmlQualifiedName) $5);
1278 OptionalVarSpec // returns XmlQualifiedName
1281 $$ = XmlQualifiedName.Empty;
1285 $$ = (XmlQualifiedName) $2;
1289 /* -------------------------------------
1291 ------------------------------------- */
1294 : IF OPEN_PAREN Expr CLOSE_PAREN {
1295 tokenizer.State = ParseState.Operator;
1297 tokenizer.State = ParseState.Default;
1299 tokenizer.State = ParseState.Default;
1302 $$ = new IfExpr ((ExprSequence) $3, (ExprSingle) $8, (ExprSingle) $11);
1306 /* -------------------------------------
1308 ------------------------------------- */
1313 tokenizer.State = ParseState.Default;
1316 $$ = new OrExpr ((ExprSingle) $1, (ExprSingle) $4);
1322 | InstanceOfExpr AND {
1323 tokenizer.State = ParseState.Default;
1326 $$ = new AndExpr ((ExprSingle) $1, (ExprSingle) $4);
1330 /* -------------------------------------
1332 ------------------------------------- */
1336 | TreatExpr INSTANCE OF {
1337 tokenizer.State = ParseState.ItemType;
1340 $$ = new InstanceOfExpr ((ExprSingle) $1, (SequenceType) $5);
1346 | CastableExpr TREAT AS {
1347 tokenizer.State = ParseState.ItemType;
1350 $$ = new TreatExpr ((ExprSingle) $1, (SequenceType) $5);
1356 | CastExpr CASTABLE AS {
1357 tokenizer.State = ParseState.ItemType;
1358 } AtomicType OptionalQuestion
1360 $$ = new CastableExpr ((ExprSingle) $1, (XmlTypeCode) $5, (bool)$6);
1377 | ComparisonExpr CAST AS {
1378 tokenizer.State = ParseState.ItemType;
1379 } AtomicType OptionalQuestion
1381 $$ = new CastExpr ((ExprSingle) $1, (XmlTypeCode) $5, (bool) $6);
1385 /* -------------------------------------
1386 Comparison Expressions
1387 ------------------------------------- */
1392 tokenizer.State = ParseState.Default;
1395 $$ = new ComparisonExpr ((ExprSingle) $1, (ExprSingle) $4, (ComparisonOperator) $2);
1399 Comp // returns ComparisonOperator
1408 $$ = ComparisonOperator.ValueEQ;
1412 $$ = ComparisonOperator.ValueNE;
1416 $$ = ComparisonOperator.ValueLT;
1420 $$ = ComparisonOperator.ValueLE;
1424 $$ = ComparisonOperator.ValueGT;
1428 $$ = ComparisonOperator.ValueGE;
1435 $$ = ComparisonOperator.GeneralEQ;
1439 $$ = ComparisonOperator.GeneralNE;
1443 $$ = ComparisonOperator.GeneralLT;
1447 $$ = ComparisonOperator.GeneralLE;
1451 $$ = ComparisonOperator.GeneralGT;
1455 $$ = ComparisonOperator.GeneralGE;
1462 $$ = ComparisonOperator.NodeIs;
1466 $$ = ComparisonOperator.NodeFWD;
1470 $$ = ComparisonOperator.NodeBWD;
1477 tokenizer.State = ParseState.Default;
1480 $$ = new RangeExpr ((ExprSingle) $1, (ExprSingle)$4);
1484 /* -------------------------------------
1485 Arithmetic Expressions
1486 ------------------------------------- */
1489 : MultiplicativeExpr
1490 | MultiplicativeExpr PLUS {
1491 tokenizer.State = ParseState.Default;
1494 $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Add);
1496 | MultiplicativeExpr MINUS {
1497 tokenizer.State = ParseState.Default;
1500 $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Sub);
1506 | UnaryExpr ASTERISK {
1507 tokenizer.State = ParseState.Default;
1508 } MultiplicativeExpr
1510 $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Mul);
1513 tokenizer.State = ParseState.Default;
1514 } MultiplicativeExpr
1516 $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Div);
1519 tokenizer.State = ParseState.Default;
1520 } MultiplicativeExpr
1522 $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.IDiv);
1525 tokenizer.State = ParseState.Default;
1526 } MultiplicativeExpr
1528 $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.IMod);
1536 $$ = new MinusExpr ((ExprSingle) $2);
1545 : IntersectExceptExpr
1546 | IntersectExceptExpr UNION {
1547 tokenizer.State = ParseState.Default;
1550 $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Union);
1552 | IntersectExceptExpr BAR {
1553 tokenizer.State = ParseState.Default;
1556 $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Union);
1562 | ValueExpr INTERSECT {
1563 tokenizer.State = ParseState.Default;
1564 } IntersectExceptExpr
1566 $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Intersect);
1568 | ValueExpr EXCEPT {
1569 tokenizer.State = ParseState.Default;
1570 } IntersectExceptExpr
1572 $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Except);
1581 /* -----------------
1582 Validation Expressions
1583 ----------------- */
1585 // FIXME: Here state transition is not well-tracked.
1587 ValidateExpr // returns ValidateExpr
1588 : VALIDATE OptionalValidationMode OPEN_CURLY {
1589 tokenizer.State = ParseState.Default;
1590 tokenizer.PushState (ParseState.Operator);
1593 $$ = new ValidateExpr ((XmlSchemaContentProcessing) $2, (ExprSequence) $6);
1597 OptionalValidationMode // returns XmlSchemaContentProcessing
1600 $$ = XmlSchemaContentProcessing.Strict; // FIXME: confirm
1604 $$ = XmlSchemaContentProcessing.Lax;
1608 $$ = XmlSchemaContentProcessing.Strict;
1612 /* -----------------
1614 ----------------- */
1616 PathExpr // returns PathExpr
1619 $$ = new PathRootExpr ();
1621 | Slash RelativePathExpr
1623 $$ = new PathSlashExpr (new PathRootExpr (), (ExprSingle) $2);
1625 | Slash2 RelativePathExpr
1627 $$ = new PathSlash2Expr (new PathRootExpr (), (ExprSingle) $2);
1632 RelativePathExpr // returns PathExpr
1634 | StepExpr Slash RelativePathExpr
1636 $$ = new PathSlashExpr ((ExprSingle) $1, (ExprSingle) $3);
1638 | StepExpr Slash2 RelativePathExpr
1640 $$ = new PathSlash2Expr ((ExprSingle) $1, (ExprSingle) $3);
1644 StepExpr // returns ExprSingle
1649 AxisStep // returns PathExpr
1650 : ForwardOrReverseStep
1651 | AxisStep Predicate
1653 $$ = new FilterStepExpr ((ExprSingle) $1, (ExprSequence) $2);
1657 ForwardOrReverseStep // returns ExprSingle
1663 : OPEN_BRACKET Expr CLOSE_BRACKET {
1664 tokenizer.State = ParseState.Operator;
1671 FilterStep // returns ExprSingle
1673 | FilterStep Predicate
1675 $$ = new FilterStepExpr ((ExprSingle) $1, (ExprSequence) $2);
1679 ForwardStep // returns AxisStepExpr
1680 : ForwardAxis NodeTest
1682 $$ = new AxisStepExpr ((XPathAxis) $1, (XPath2NodeTest) $2);
1687 ReverseStep // returns AxisStepExpr
1688 : ReverseAxis NodeTest
1690 $$ = new AxisStepExpr ((XPathAxis) $1, (XPath2NodeTest) $2);
1695 ForwardAxis // returns XPathAxis
1698 $$ = XPathAxis.Child;
1702 $$ = XPathAxis.Descendant;
1706 $$ = XPathAxis.Attribute;
1710 $$ = XPathAxis.Self;
1712 | DESCENDANT_OR_SELF COLON2
1714 $$ = XPathAxis.DescendantOrSelf;
1716 | FOLLOWING_SIBLING COLON2
1718 $$ = XPathAxis.FollowingSibling;
1722 $$ = XPathAxis.Following;
1726 ReverseAxis // returns XPathAxis
1729 $$ = XPathAxis.Parent;
1733 $$ = XPathAxis.Ancestor;
1735 | PRECEDING_SIBLING COLON2
1737 $$ = XPathAxis.PrecedingSibling;
1741 $$ = XPathAxis.Preceding;
1743 | ANCESTOR_OR_SELF COLON2
1745 $$ = XPathAxis.AncestorOrSelf;
1749 // LAMESPEC: in the XQuery spec, it is "@? NodeTest", but NodeKindTest
1750 // should not appear after AT. (imagine @processing-instruction::(name)).
1751 AbbrevForwardStep // returns NodeTestExpr
1754 $$ = new AxisStepExpr (XPathAxis.Child, (XPath2NodeTest) $1);
1758 $$ = new AxisStepExpr (XPathAxis.Attribute, new XPath2NodeTest ((XmlQualifiedName) $2));
1762 AbbrevReverseStep // returns AxisStepExpr
1765 $$ = new AxisStepExpr (XPathAxis.Parent, null);
1769 NodeTest // returns NodeTest
1772 $$ = new XPath2NodeTest ((KindTest) $1);
1776 $$ = new XPath2NodeTest ((XmlQualifiedName) $1);
1780 NameTest // returns XmlQualifiedName
1783 tokenizer.State = ParseState.Operator;
1787 Wildcard // returns XmlQualifiedName /*ws:explicit*/
1790 $$ = new XmlQualifiedName ("*", "*");
1794 $$ = (XmlQualifiedName) $1;
1798 $$ = (XmlQualifiedName) $1;
1802 AtomicType // returns XmlTypeCode
1805 $$ = GetAtomicTypeCode ((XmlQualifiedName) $1);
1809 ItemType // returns ItemType
1811 tokenizer.State = ParseState.OccurenceIndicator;
1814 $$ = new ItemType ((XmlTypeCode) $1);
1817 | ITEM OPEN_PAREN CLOSE_PAREN {
1818 tokenizer.State = ParseState.OccurenceIndicator;
1821 $$ = new ItemType (XmlTypeCode.Item);
1825 KindTest // returns KindTest
1836 : PROCESSING_INSTRUCTION OPEN_PAREN {
1837 // LAMESPEC: push state is described as Operator, but should
1838 // be OccurenceIndicator (as any KindTest could be followed by
1840 tokenizer.PushState (ParseState.OccurenceIndicator);
1841 tokenizer.State = ParseState.KindTestForPI;
1842 } PITestContent CLOSE_PAREN {
1843 tokenizer.PopState ();
1850 PITestContent // returns KindTest
1853 $$ = new KindTest (XmlTypeCode.ProcessingInstruction);
1857 $$ = new XmlPITest ((string) $1);
1861 $$ = new XmlPITest ((string) $1);
1866 : COMMENT OPEN_PAREN {
1867 tokenizer.PushState (ParseState.OccurenceIndicator);
1868 tokenizer.State = ParseState.KindTest;
1870 tokenizer.PopState ();
1873 $$ = new KindTest (XmlTypeCode.Comment);
1879 tokenizer.PushState (ParseState.OccurenceIndicator);
1880 tokenizer.State = ParseState.KindTest;
1882 tokenizer.PopState ();
1885 $$ = new KindTest (XmlTypeCode.Text);
1891 tokenizer.PushState (ParseState.OccurenceIndicator);
1892 tokenizer.State = ParseState.KindTest;
1894 tokenizer.PopState ();
1897 $$ = new KindTest (XmlTypeCode.Node);
1901 DocumentTest // returns DocumentTest
1902 : DOCUMENT_NODE OPEN_PAREN {
1903 tokenizer.PushState (ParseState.OccurenceIndicator);
1904 tokenizer.State = ParseState.KindTest;
1905 } DocumentTestContent CLOSE_PAREN {
1906 tokenizer.PopState ();
1913 DocumentTestContent // returns DocumentTest
1916 $$ = new KindTest (XmlTypeCode.Document);
1920 $$ = new DocumentTest ((ElementTest) $1);
1924 ElementTest // returns ElementTest
1925 : ELEMENT OPEN_PAREN {
1926 tokenizer.PushState (ParseState.OccurenceIndicator);
1927 tokenizer.State = ParseState.KindTest;
1928 } ElementTestContent CLOSE_PAREN {
1929 tokenizer.PopState ();
1936 ElementTestContent // returns ElementTest
1939 $$ = new KindTest (XmlTypeCode.Element);
1941 | ElementNameOrWildcard
1943 $$ = new ElementTest ((XmlQualifiedName) $1);
1945 | ElementNameOrWildcard COMMA TypeName OptionalQuestion
1947 $$ = new ElementTest ((XmlQualifiedName) $1, (XmlQualifiedName) $3, (bool) $4);
1951 OptionalQuestion // returns bool
1962 AttributeTest // returns AttributeTest
1963 : ATTRIBUTE OPEN_PAREN {
1964 tokenizer.PushState (ParseState.OccurenceIndicator);
1965 tokenizer.State = ParseState.KindTest;
1966 } AttributeTestContent CLOSE_PAREN {
1967 tokenizer.PopState ();
1974 AttributeTestContent // returns AttributeTest
1977 $$ = AttributeTest.AnyAttribute;
1979 | AttributeNameOrWildcard
1981 $$ = new AttributeTest ((XmlQualifiedName) $1);
1983 | AttributeNameOrWildcard COMMA TypeNameOrWildcard
1985 $$ = new AttributeTest ((XmlQualifiedName) $1, (XmlQualifiedName) $3);
2001 ElementNameOrWildcard // returns XmlQualifiedName
2005 $$ = new XmlQualifiedName ("*", "*");
2009 AttributeNameOrWildcard // returns XmlQualifiedName
2013 $$ = new XmlQualifiedName ("*", "*");
2017 TypeNameOrWildcard // returns XmlQualifiedName
2021 $$ = new XmlQualifiedName ("*", "*");
2029 PrimaryExpr // returns ExprSingle
2031 tokenizer.State = ParseState.Operator;
2045 $$ = new DecimalLiteralExpr ((decimal) $1);
2049 $$ = new DoubleLiteralExpr ((double) $1);
2053 $$ = new StringLiteralExpr ((string) $1);
2070 | Digits DOT OptDigits
2074 : DoubleDecimalPartSpec ExponentSpec
2077 DoubleDecimalPartSpec
2080 | Digits DOT OptDigits
2084 | ExponentAlpha Digits
2085 | ExponentAlpha PLUS Digits
2086 | ExponentAlpha MINUS Digits
2104 : QUOT STRING_LITERALContentQuot
2105 | APOS STRING_LITERALContentApos
2108 STRING_LITERALContentQuot
2109 : PREDEFINED_ENTITY_REF
2115 STRING_LITERALContentApos
2116 : PREDEFINED_ENTITY_REF
2123 VarRef // returns VariableReferenceExpr
2125 tokenizer.State = ParseState.VarName;
2128 $$ = new VariableReferenceExpr ((XmlQualifiedName) $3);
2132 VarName // returns XmlQualifiedName
2134 tokenizer.State = ParseState.Operator;
2141 ParenthesizedExpr // returns ParenthesizedExpr
2142 : OPEN_PAREN OptionalExpr CLOSE_PAREN {
2143 tokenizer.State = ParseState.Operator;
2146 $$ = new ParenthesizedExpr ((ExprSequence) $2);
2153 $$ = new ExprSequence ();
2158 ContextItemExpr // returns ContextItemExpr
2160 tokenizer.State = ParseState.Operator;
2163 $$ = new ContextItemExpr ();
2168 : QName OPEN_PAREN {
2169 tokenizer.State = ParseState.Default;
2170 } OptionalExpr CLOSE_PAREN {
2171 tokenizer.State = ParseState.Operator;
2174 XmlQualifiedName name = (XmlQualifiedName) $1;
2175 if (name.Namespace == "")
2176 name = new XmlQualifiedName (name.Name, tokenizer.DefaultFunctionNamespace);
2177 if (name.Namespace != ""
2178 && name.Namespace != InternalPool.XdtNamespace
2179 && reservedFunctionNames [name.Name] != null)
2180 throw new XmlQueryCompileException (String.Format ("'{0}' is reserved and cannot be used as a function name.", name.Name));
2182 $$ = new FunctionCallExpr (name, (ExprSequence) $4);
2187 : ORDERED OPEN_BRACKET Expr CLOSE_BRACKET
2189 $$ = new OrderSpecifiedExpr ((ExprSequence) $3, true);
2194 : UNORDERED OPEN_BRACKET {
2195 tokenizer.PushState (ParseState.Operator);
2196 tokenizer.State = ParseState.Default;
2197 } Expr CLOSE_BRACKET {
2198 tokenizer.PopState ();
2201 $$ = new OrderSpecifiedExpr ((ExprSequence) $4, false);
2206 /* -----------------
2208 ----------------- */
2211 Constructor // returns ExprSingle
2212 : DirElemConstructor
2213 | ComputedConstructor
2219 DirElemConstructor // returns XmlElemConstructor
2221 if (tokenizer.State == ParseState.ElementContent)
2222 tokenizer.PushState (tokenizer.State);
2223 // if (tokenizer.State == ParseState.Default)
2224 else // considering <foo></foo><bar></bar> there after </foo> state is Operator.
2225 tokenizer.PushState (ParseState.Operator);
2226 tokenizer.State = ParseState.StartTag;
2227 // FIXME: tokenizer.Space = WhitespaceHandling.Significant;
2228 } QName AttributeList FollowDirElemConstructor {
2229 tokenizer.PopState ();
2232 ExprSequence expr = new ExprSequence ();
2233 expr.AddRange ((ICollection) $4);
2234 expr.AddRange ((ICollection) $5);
2235 $$ = new XmlElemConstructor ((XmlQualifiedName) $3, expr);
2239 FollowDirElemConstructor // returns ExprSequence
2242 $$ = new ExprSequence ();
2245 tokenizer.State = ParseState.ElementContent;
2246 } ElementContentList END_TAG_START {
2247 tokenizer.State = ParseState.EndTag;
2249 // tokenizer.Space = WhitespaceHandling.Arbitrary;
2256 ElementContentList // returns ExprSequence
2259 $$ = new ExprSequence ();
2261 | ElementContent ElementContentList
2263 ExprSequence el = (ExprSequence) $2;
2264 el.Insert (0, (ExprSingle) $1);
2269 AttributeList // returns XmlAttrConstructorList
2272 $$ = new XmlAttrConstructorList ();
2274 | /* space */ Attribute AttributeList
2276 XmlAttrConstructorList al = (XmlAttrConstructorList) $2;
2277 al.Insert (0, (XmlAttrConstructor) $1);
2282 Attribute // returns XmlAttrConstructor
2283 : QName /* opt-space */ EQUAL /* opt-space */ AttributeValue
2285 $$ = new XmlAttrConstructor ((XmlQualifiedName) $1, (ExprSequence) $3);
2290 // FIXME: it should be more complex
2291 AttributeValue // returns ExprSequence
2294 ExprSequence es = new ExprSequence ();
2295 es.Insert (0, new StringLiteralExpr ((string) $1));
2301 AttributeValue // returns ExprSequence
2303 tokenizer.State = ParseState.QuotAttributeContent;
2304 } AttributeValueContentSequence QUOT {
2305 tokenizer.State = ParseState.StartTag;
2311 tokenizer.State = ParseState.AposAttributeContent;
2312 } AttributeValueContentSequence APOS {
2313 tokenizer.State = ParseState.StartTag;
2321 AttributeValueContentSequence // returns ExprSequence
2324 $$ = new ExprSequence ();
2326 | AttributeValueContent AttributeValueContentSequence
2328 ExprSequence es = (ExprSequence) $2;
2329 es.Insert (0, (ExprSingle) $1);
2334 AttributeValueContent // returns ExprSingle
2335 : ATT_VALUE_LITERAL // including "{{", "}}" and char/predefined entities
2337 $$ = new StringLiteralExpr ((string) $1);
2342 EnclosedExpr // returns EnclosedExpr
2343 // FIXME: check if this state transition is valid for ElementContent and AttributeValueContent
2345 switch (tokenizer.State) {
2346 case ParseState.ElementContent:
2347 case ParseState.QuotAttributeContent:
2348 case ParseState.AposAttributeContent:
2349 tokenizer.PushState (tokenizer.State);
2352 tokenizer.State = ParseState.Default;
2355 $$ = new EnclosedExpr ((ExprSequence) $3);
2359 ElementContent // returns ExprSingle
2360 : ELEM_CONTENT_LITERAL // including "{{", "}}" and char/predefined entities
2362 $$ = new XmlTextConstructor ((string) $1);
2364 | DirElemConstructor
2372 : XML_CDATA_START XML_CDATA_TO_END
2374 $$ = new XmlTextConstructor ((string) $2);
2378 XmlComment // returns XmlCommentConstructor
2379 : XML_COMMENT_START XML_COMMENT_TO_END
2381 $$ = new XmlCommentConstructor ((string) $2);
2385 XmlPI // returns XmlPIConstructor
2387 tokenizer.PushState (tokenizer.State);
2388 tokenizer.State = ParseState.XmlPI;
2390 tokenizer.State = ParseState.XmlPIContent;
2392 tokenizer.PopState ();
2395 string name = (string) $3;
2396 $$ = new XmlPIConstructor (name, (string) $5);
2404 ComputedConstructor // returns ExprSingle
2405 : CompElemConstructor
2406 | CompAttrConstructor
2407 | CompDocConstructor
2408 | CompTextConstructor
2415 : ELEMENT QName OPEN_CURLY Expr CloseCurly
2417 $$ = new XmlElemConstructor ((XmlQualifiedName) $2, (ExprSequence) $4);
2419 | ELEMENT OPEN_CURLY Expr CloseCurly OPEN_CURLY Expr CloseCurly
2421 $$ = new XmlElemConstructor ((ExprSequence) $3, (ExprSequence) $6);
2426 : ATTRIBUTE QName OPEN_CURLY Expr CloseCurly
2428 $$ = new XmlAttrConstructor ((XmlQualifiedName) $2, (ExprSequence) $4);
2430 | ATTRIBUTE OPEN_CURLY Expr CloseCurly OPEN_CURLY Expr CloseCurly
2432 $$ = new XmlAttrConstructor ((ExprSequence) $3, (ExprSequence) $6);
2437 : NAMESPACE NCName OPEN_CURLY Expr CloseCurly
2439 $$ = new XmlNSConstructor ((string) $2, (ExprSequence) $4);
2444 : DOCUMENT OPEN_CURLY Expr CloseCurly
2446 $$ = new XmlDocConstructor ((ExprSequence) $3);
2451 : TEXT OPEN_CURLY Expr CloseCurly
2453 $$ = new XmlTextConstructor ((ExprSequence) $3);
2458 : COMMENT OPEN_CURLY Expr CloseCurly
2460 $$ = new XmlCommentConstructor ((ExprSequence) $3);
2465 : PROCESSING_INSTRUCTION NCName OPEN_CURLY Expr CloseCurly
2467 $$ = new XmlPIConstructor ((string) $2, (ExprSequence) $4);
2469 | PROCESSING_INSTRUCTION OPEN_CURLY Expr CloseCurly OPEN_CURLY Expr CloseCurly
2471 $$ = new XmlPIConstructor ((ExprSequence) $3, (ExprSequence) $6);
2475 /* -----------------
2477 ----------------- */
2480 NCName // returns string
2484 QName // returns XmlQualifiedName. Note that this state is just a wrapper for state transition.
2486 switch (tokenizer.State) {
2487 case ParseState.Default:
2488 tokenizer.State = ParseState.Operator;
2490 case ParseState.ItemType:
2491 tokenizer.State = ParseState.OccurenceIndicator;
2493 case ParseState.KindTest:
2494 case ParseState.SchemaContextStep:
2495 tokenizer.State = ParseState.CloseKindTest;
2497 case ParseState.ExtKey:
2498 tokenizer.State = ParseState.ExprComment;
2506 switch (tokenizer.State) {
2507 case ParseState.Operator:
2508 tokenizer.State = ParseState.Default;
2510 case ParseState.KindTest:
2511 tokenizer.State = ParseState.SchemaContextStep;
2519 if (tokenizer.State == ParseState.Operator)
2520 tokenizer.State = ParseState.Default;
2526 if (tokenizer.State == ParseState.Operator)
2527 tokenizer.PopState ();