XQueryParser.jay 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537
  1. %{
  2. //
  3. // XQueryParser.jay
  4. //
  5. // Author:
  6. // Atsushi Enomoto <[email protected]>
  7. //
  8. // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
  9. //
  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:
  17. //
  18. // The above copyright notice and this permission notice shall be
  19. // included in all copies or substantial portions of the Software.
  20. //
  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.
  28. //
  29. //
  30. // FIXME:
  31. // attribute value template
  32. // handle double literal
  33. //
  34. #if NET_2_0
  35. using System;
  36. using System.Collections;
  37. using System.IO;
  38. using System.Xml;
  39. using System.Xml.Query;
  40. using System.Xml.Schema;
  41. using System.Xml.XPath;
  42. using System.Security.Policy;
  43. using Mono.Xml.XPath2;
  44. using Mono.Xml.XQuery;
  45. namespace Mono.Xml.XQuery.Parser
  46. {
  47. internal class XQueryParser
  48. {
  49. // FIXME: Wait for recommendation
  50. public const string XdtNamespace = "http://www.w3.org/2003/11/xpath-datatypes";
  51. // See also FunctionCall production rule.
  52. static Hashtable reservedFunctionNames;
  53. static XQueryParser ()
  54. {
  55. reservedFunctionNames = new Hashtable ();
  56. reservedFunctionNames.Add ("attribute", "attribute");
  57. reservedFunctionNames.Add ("comment", "comment");
  58. reservedFunctionNames.Add ("document", "document");
  59. reservedFunctionNames.Add ("element", "element");
  60. reservedFunctionNames.Add ("empty", "empty");
  61. reservedFunctionNames.Add ("if", "if");
  62. reservedFunctionNames.Add ("item", "item");
  63. reservedFunctionNames.Add ("node", "node");
  64. reservedFunctionNames.Add ("processing-instruction", "processing-instruction");
  65. reservedFunctionNames.Add ("text", "text");
  66. reservedFunctionNames.Add ("type", "type");
  67. reservedFunctionNames.Add ("typeswitch", "typeswitch");
  68. }
  69. public static XQueryModule Parse (TextReader reader)
  70. {
  71. return new XQueryParser ().RunParse (reader);
  72. }
  73. private XQueryTokenizer tokenizer;
  74. private XQueryParser ()
  75. {
  76. }
  77. // FIXME: we don't need Evidence here at all. It is used only
  78. // to generate runnable IL (on loading resulting Assembly).
  79. public XQueryModule RunParse (TextReader source)
  80. {
  81. tokenizer = null;
  82. try {
  83. // debug = new yydebug.yyDebugSimple ();
  84. tokenizer = new XQueryTokenizer (source);
  85. XQueryModule mod = (XQueryModule) yyparse (tokenizer);
  86. mod.NSResolver = tokenizer.NSResolver;
  87. return mod;
  88. } catch (yyParser.yyException ex) {
  89. throw new XmlQueryCompileException (String.Format ("Tokenizer error at line {0}, column {1}: {2}", tokenizer.LineNumber, tokenizer.LinePosition, ex.Message), ex);
  90. }
  91. }
  92. public XmlTypeCode GetAtomicTypeCode (XmlQualifiedName name)
  93. {
  94. if (name.Namespace == XdtNamespace) {
  95. switch (name.Name) {
  96. case "anyAtomicType":
  97. return XmlTypeCode.AnyAtomicType;
  98. case "dayTimeDuration":
  99. return XmlTypeCode.DayTimeDuration;
  100. case "item":
  101. return XmlTypeCode.Item;
  102. case "untypedAtomic":
  103. return XmlTypeCode.UntypedAtomic;
  104. case "yearMonthDuration":
  105. return XmlTypeCode.YearMonthDuration;
  106. }
  107. } else if (name.Namespace == XmlSchema.Namespace) {
  108. switch (name.Name) {
  109. case "boolean":
  110. return XmlTypeCode.Boolean;
  111. case "byte":
  112. return XmlTypeCode.Byte;
  113. case "date":
  114. return XmlTypeCode.Date;
  115. case "dateTime":
  116. return XmlTypeCode.DateTime;
  117. case "decimal":
  118. return XmlTypeCode.Decimal;
  119. case "double":
  120. return XmlTypeCode.Double;
  121. case "duration":
  122. return XmlTypeCode.Duration;
  123. case "entity":
  124. return XmlTypeCode.Entity;
  125. case "float":
  126. return XmlTypeCode.Float;
  127. case "gDay":
  128. return XmlTypeCode.GDay;
  129. case "gMonth":
  130. return XmlTypeCode.GMonth;
  131. case "gMonthDay":
  132. return XmlTypeCode.GMonthDay;
  133. case "gYear":
  134. return XmlTypeCode.GYear;
  135. case "gYearMonth":
  136. return XmlTypeCode.GYearMonth;
  137. case "hexBinary":
  138. return XmlTypeCode.HexBinary;
  139. case "id":
  140. return XmlTypeCode.Id;
  141. case "idref":
  142. return XmlTypeCode.Idref;
  143. case "int":
  144. return XmlTypeCode.Int;
  145. case "integer":
  146. return XmlTypeCode.Integer;
  147. case "language":
  148. return XmlTypeCode.Language;
  149. case "long":
  150. return XmlTypeCode.Long;
  151. case "Name":
  152. return XmlTypeCode.Name;
  153. case "NCName":
  154. return XmlTypeCode.NCName;
  155. case "negativeInteger":
  156. return XmlTypeCode.NegativeInteger;
  157. case "NMTOKEN":
  158. return XmlTypeCode.NmToken;
  159. case "nonNegativeInteger":
  160. return XmlTypeCode.NonNegativeInteger;
  161. case "nonPositiveInteger":
  162. return XmlTypeCode.NonPositiveInteger;
  163. case "normalizedString":
  164. return XmlTypeCode.NormalizedString;
  165. case "NOTATION":
  166. return XmlTypeCode.Notation;
  167. case "positiveInteger":
  168. return XmlTypeCode.PositiveInteger;
  169. case "QName":
  170. return XmlTypeCode.QName;
  171. case "short":
  172. return XmlTypeCode.Short;
  173. case "string":
  174. return XmlTypeCode.String;
  175. case "time":
  176. return XmlTypeCode.Time;
  177. case "token":
  178. return XmlTypeCode.Token;
  179. case "unsignedByte":
  180. return XmlTypeCode.UnsignedByte;
  181. case "unsignedInt":
  182. return XmlTypeCode.UnsignedInt;
  183. case "unsignedLong":
  184. return XmlTypeCode.UnsignedLong;
  185. case "unsignedShort":
  186. return XmlTypeCode.UnsignedShort;
  187. }
  188. }
  189. throw new XmlQueryCompileException (String.Format ("Unexpected type name was specified as atomic type: {0}", name));
  190. }
  191. %}
  192. /* --------------------------------------------------------
  193. Tokens
  194. -------------------------------------------------------- */
  195. /* These are for numbers */
  196. //%token SMALL_E //"e"
  197. //%token LARGE_E //"E"
  198. %token DOT "."
  199. %token DOT2 ".."
  200. %token SEMICOLON ";"
  201. %token OPEN_PAREN "("
  202. %token OPEN_PAREN_COLON "(:"
  203. %token PRAGMA_OPEN "(::"
  204. %token CLOSE_PAREN ")"
  205. %token COLON ":"
  206. %token COLON2 "::"
  207. %token PRAGMA_CLOSE "::)"
  208. %token CLOSE_PAREN_COLON ":)"
  209. %token COLON_EQUAL ":="
  210. %token OPEN_BRACKET "["
  211. %token CLOSE_BRACKET "]"
  212. %token OPEN_CURLY "{"
  213. %token CLOSE_CURLY "}"
  214. %token COMMA ","
  215. %token DOLLAR "$"
  216. %token EQUAL "="
  217. %token NOT_EQUAL "!="
  218. %token LESSER "<"
  219. %token LESSER2 "<<"
  220. %token LESSER_EQUAL "<="
  221. %token GREATER ">"
  222. %token GREATER2 ">>"
  223. %token GREATER_EQUAL ">="
  224. %token BAR "|"
  225. %token ASTERISK "*"
  226. %token PLUS "+"
  227. %token MINUS "-"
  228. %token SLASH "/"
  229. %token SLASH2 "//"
  230. %token QUESTION "?"
  231. %token XQUERY //"xquery"
  232. %token VERSION //"version"
  233. %token PRAGMA //"pragma"
  234. %token EXTENSION //"extension"
  235. %token MODULE //"module"
  236. %token NAMESPACE //"namespace"
  237. %token DECLARE //"declare"
  238. %token XMLSPACE //"xmlspace"
  239. %token PRESERVE //"preserve"
  240. %token STRIP //"strip"
  241. %token DEFAULT //"default"
  242. %token DOCUMENT_NODE //"document-node"
  243. %token DOCUMENT //"document"
  244. %token ELEMENT //"element"
  245. %token ATTRIBUTE //"attribute"
  246. %token PROCESSING_INSTRUCTION //"processing-instruction"
  247. %token COMMENT //"comment"
  248. %token TEXT //"text"
  249. %token NODE //"node"
  250. %token FUNCTION //"function"
  251. %token COLLATION //"collation"
  252. %token CONSTRUCTION //"construction"
  253. %token ORDERING //"ordering"
  254. %token ORDERED //"ordered"
  255. %token UNORDERED //"unordered"
  256. %token BASEURI //"base-uri"
  257. %token IMPORT //"import"
  258. %token SCHEMA //"schema"
  259. %token AT //"at"
  260. %token VARIABLE //"variable"
  261. %token AS //"as"
  262. %token EXTERNAL //"external"
  263. %token VALIDATION //"validation"
  264. %token LAX //"lax"
  265. %token STRICT //"strict"
  266. %token SKIP //"skip"
  267. %token RETURN //"return"
  268. %token FOR //"for"
  269. %token LET //"let"
  270. %token IN //"in"
  271. %token WHERE //"where"
  272. %token ORDER //"order"
  273. %token BY //"by"
  274. %token STABLE //"stable"
  275. %token ASCENDING //"ascending"
  276. %token DESCENDING //"descending"
  277. %token EMPTY //"empty"
  278. %token GREATEST //"greatest"
  279. %token LEAST //"least"
  280. %token SOME //"some"
  281. %token EVERY //"every"
  282. %token SATISFIES //"satisfies"
  283. %token IS //"is"
  284. %token TO //"to"
  285. %token EQ //"eq"
  286. %token NE //"ne"
  287. %token LT //"lt"
  288. %token LE //"le"
  289. %token GT //"gt"
  290. %token GE //"ge"
  291. %token AND //"and"
  292. %token OR //"or"
  293. %token INSTANCE //"instance"
  294. %token OF //"of"
  295. %token IF //"if"
  296. %token THEN //"then"
  297. %token ELSE //"else"
  298. %token TYPESWITCH //"typeswitch"
  299. %token CASE //"case"
  300. %token TREAT //"treat"
  301. %token CASTABLE //"castable"
  302. %token CAST //"as"
  303. %token DIV //"div"
  304. %token IDIV //"idiv"
  305. %token MOD //"mod"
  306. %token UNION //"union"
  307. %token INTERSECT //"intersect"
  308. %token EXCEPT //"except"
  309. %token VALIDATE //"validate"
  310. %token CONTEXT //"context"
  311. %token NILLABLE //"nillable"
  312. %token ITEM //"item"
  313. %token GLOBAL //"global"
  314. %token TYPE //"type"
  315. %token CHILD //"child"
  316. %token DESCENDANT //"descendant"
  317. %token ATTRIBUTE //"attribute"
  318. %token SELF //"self"
  319. %token DESCENDANT_OR_SELF //"descendant-or-self"
  320. %token FOLLOWING_SIBLING //"following-sibling"
  321. %token FOLLOWING //"following"
  322. %token PARENT //"parent"
  323. %token ANCESTOR //"ancestor"
  324. %token PRECEDING_SIBLING //"preceding-sibling"
  325. %token PRECEDING //"preceding"
  326. %token ANCESTOR_OR_SELF //"ancestor-or-self"
  327. %token QNAME
  328. %token NCNAME
  329. %token WILD_LOCALNAME
  330. %token WILD_PREFIX
  331. %token STRING_LITERAL
  332. %token DECIMAL_LITERAL
  333. %token DOUBLE_LITERAL
  334. %token PRAGMA_CONTENTS // characters until "::)"
  335. %token PREDEFINED_ENTITY_REF
  336. %token CHAR_REF
  337. // Used only inside Constructor
  338. %token XML_COMMENT_START // "<!--"
  339. %token XML_COMMENT_TO_END // XML comment content immediate before "-->"
  340. %token XML_PI_START // "<?"
  341. %token XML_PI_TO_END // PI content immediate before "?>"
  342. %token XML_CDATA_START // <![CDATA[
  343. %token XML_CDATA_TO_END // CDATA section content immediate before "]]>"
  344. %token EMPTY_TAG_CLOSE // "/>"
  345. %token END_TAG_START // "</". Its appearance depends on the context
  346. %token ATT_VALUE_LITERAL
  347. %token ELEM_CONTENT_LITERAL
  348. %token EXT_CONTENT
  349. %token APOS "'"
  350. //%token APOS2 "''"
  351. %token QUOT //""""
  352. //%token QUOT2 //""""""
  353. %start Module
  354. %%
  355. /* --------------------------------------------------------
  356. Modules and Prologs
  357. -------------------------------------------------------- */
  358. Module // returns Module
  359. : VersionDecl MainModule
  360. {
  361. string version = (string) $1;
  362. XQueryMainModule module = (XQueryMainModule) $2;
  363. module.Version = version;
  364. $$ = module;
  365. }
  366. | VersionDecl LibraryModule
  367. {
  368. string version = (string) $1;
  369. XQueryLibraryModule module = (XQueryLibraryModule) $2;
  370. $$ = module;
  371. }
  372. ;
  373. VersionDecl // returns string
  374. : // empty
  375. {
  376. $$ = null;
  377. }
  378. | XQUERY VERSION STRING_LITERAL {
  379. tokenizer.State = ParseState.Operator;
  380. } SEMICOLON {
  381. tokenizer.State = ParseState.Default;
  382. }
  383. {
  384. $$ = (string) $3;
  385. }
  386. ;
  387. MainModule // returns MainModule
  388. : Prolog QueryBody
  389. {
  390. Prolog prolog = (Prolog) $1;
  391. ExprSequence body = (ExprSequence) $2;
  392. XQueryMainModule mod = new XQueryMainModule ();
  393. mod.Prolog = prolog;
  394. mod.QueryBody = body;
  395. $$ = mod;
  396. }
  397. ;
  398. LibraryModule // returns LibraryModule
  399. : ModuleDecl Prolog
  400. {
  401. XQueryLibraryModule mod = new XQueryLibraryModule ();
  402. mod.ModuleDecl = (ModuleDecl) $1;
  403. mod.Prolog = (Prolog) $2;
  404. $$ = mod;
  405. }
  406. ;
  407. ModuleDecl // returns ModuleDecl
  408. : MODULE NAMESPACE {
  409. tokenizer.State = ParseState.NamespaceDecl;
  410. } NCName EQUAL STRING_LITERAL {
  411. tokenizer.State = ParseState.Default;
  412. } SEMICOLON
  413. {
  414. ModuleDecl decl = new ModuleDecl ();
  415. decl.Prefix = (string) $4;
  416. decl.Namespace = (string) $6;
  417. tokenizer.AddNamespace (decl.Prefix, decl.Namespace);
  418. $$ = decl;
  419. }
  420. ;
  421. Prolog
  422. : // empty
  423. {
  424. $$ = new Prolog ();
  425. }
  426. | PrologContent SEMICOLON Prolog
  427. {
  428. Prolog p = (Prolog) $3;
  429. p.Add ($1);
  430. $$ = p;
  431. }
  432. ;
  433. PrologContent
  434. : Setter
  435. | DeclarationOrImport
  436. ;
  437. // FIXME: this production rule is the right one, but it brings
  438. // major shift/reduce conflicts.
  439. /*
  440. Prolog // returns Prolog
  441. : Setters DeclarationsAndImports
  442. {
  443. Prolog p = (Prolog) $1;
  444. ArrayList al = (ArrayList) $2;
  445. if (al != null) {
  446. foreach (object o in al)
  447. p.Add (o);
  448. }
  449. $$ = p;
  450. }
  451. ;
  452. Setters // returns Prolog
  453. : // empty
  454. {
  455. $$ = new Prolog ();
  456. }
  457. | Setter SEMICOLON Setters
  458. {
  459. Prolog p = (Prolog) $3;
  460. p.Add ($1);
  461. $$ = p;
  462. }
  463. ;
  464. DeclarationsAndImports // returns ArrayList
  465. : // empty
  466. {
  467. $$ = null;
  468. }
  469. | DeclarationOrImport SEMICOLON DeclarationsAndImports
  470. {
  471. ArrayList al = (ArrayList) $3;
  472. if (al == null)
  473. al = new ArrayList ();
  474. al.Add ($1);
  475. $$ = al;
  476. }
  477. ;
  478. */
  479. Setter // returns object
  480. : XmlSpaceDecl // XmlSpaceDecl
  481. | DefaultCollationDecl // SimplePrologContent
  482. | BaseURIDecl // SimplePrologContent
  483. | ConstructionDecl // ConstuctionDecl
  484. | DefaultNamespaceDecl // SimplePrologContent
  485. | DefaultOrderingDecl // bool
  486. ;
  487. DeclarationOrImport // returns object
  488. : SchemaImport
  489. | ModuleImport
  490. | NamespaceDecl
  491. | VarDecl
  492. | FunctionDecl
  493. ;
  494. NamespaceDecl // returns XmlQualifiedName
  495. : DECLARE NAMESPACE {
  496. tokenizer.State = ParseState.NamespaceDecl;
  497. } NCName EQUAL STRING_LITERAL {
  498. tokenizer.State = ParseState.Default;
  499. }
  500. {
  501. XmlQualifiedName name = new XmlQualifiedName ((string) $4, (string) $6);
  502. tokenizer.AddNamespace (name.Name, name.Namespace);
  503. $$ = name;
  504. }
  505. ;
  506. XmlSpaceDecl // returns XmlSpaceDecl
  507. : DECLARE XMLSPACE {
  508. tokenizer.State = ParseState.XmlSpaceDecl;
  509. } PRESERVE {
  510. tokenizer.State = ParseState.Default;
  511. }
  512. {
  513. $$ = new XmlSpaceDecl (XmlSpace.Preserve);
  514. }
  515. | DECLARE XMLSPACE {
  516. tokenizer.State = ParseState.XmlSpaceDecl;
  517. } STRIP {
  518. tokenizer.State = ParseState.Default;
  519. }
  520. {
  521. $$ = new XmlSpaceDecl (XmlSpace.Default);
  522. }
  523. ;
  524. ConstructionDecl // returns ConstructionDecl
  525. : DECLARE CONSTRUCTION {
  526. tokenizer.State = ParseState.Operator;
  527. } PRESERVE {
  528. tokenizer.State = ParseState.Default;
  529. }
  530. {
  531. $$ = new ConstructionDecl (XmlSpace.Preserve);
  532. }
  533. | DECLARE CONSTRUCTION {
  534. tokenizer.State = ParseState.Operator;
  535. } STRIP {
  536. tokenizer.State = ParseState.Default;
  537. }
  538. {
  539. $$ = new ConstructionDecl (XmlSpace.Default);
  540. }
  541. ;
  542. DefaultNamespaceDecl // returns SimplePrologContent
  543. : DECLARE DEFAULT ELEMENT {
  544. tokenizer.State = ParseState.NamespaceKeyword;
  545. } NAMESPACE {
  546. tokenizer.State = ParseState.NamespaceDecl;
  547. } STRING_LITERAL {
  548. tokenizer.State = ParseState.Default;
  549. }
  550. {
  551. tokenizer.AddNamespace (String.Empty, (string) $7);
  552. $$ = new SimplePrologContent (PrologContentType.DefaultElementNamespace, (string) $7);
  553. }
  554. | DECLARE DEFAULT FUNCTION {
  555. tokenizer.State = ParseState.NamespaceKeyword;
  556. } NAMESPACE {
  557. tokenizer.State = ParseState.NamespaceDecl;
  558. } STRING_LITERAL {
  559. tokenizer.State = ParseState.Default;
  560. }
  561. {
  562. tokenizer.DefaultFunctionNamespace = (string) $5;
  563. $$ = new SimplePrologContent (PrologContentType.DefaultFunctionNamespace, (string) $5);
  564. }
  565. ;
  566. DefaultCollationDecl // returns SimplePrologContent
  567. : DECLARE DEFAULT COLLATION {
  568. tokenizer.State = ParseState.NamespaceDecl;
  569. } STRING_LITERAL {
  570. tokenizer.State = ParseState.Default;
  571. }
  572. {
  573. $$ = new SimplePrologContent (PrologContentType.DefaultCollation, (string) $4);
  574. }
  575. ;
  576. DefaultOrderingDecl // returns bool
  577. : DECLARE DEFAULT ORDERING {
  578. tokenizer.State = ParseState.Operator;
  579. } ORDERED {
  580. tokenizer.State = ParseState.Default;
  581. }
  582. {
  583. $$ = true;
  584. }
  585. | DECLARE DEFAULT ORDERING {
  586. tokenizer.State = ParseState.Operator;
  587. } UNORDERED {
  588. tokenizer.State = ParseState.Default;
  589. }
  590. {
  591. $$ = false;
  592. }
  593. ;
  594. BaseURIDecl // returns SimplePrologContent
  595. : DECLARE BASEURI {
  596. tokenizer.State = ParseState.NamespaceDecl;
  597. } STRING_LITERAL {
  598. tokenizer.State = ParseState.Default;
  599. }
  600. {
  601. $$ = new SimplePrologContent (PrologContentType.BaseUri, (string) $3);
  602. }
  603. ;
  604. SchemaImport // returns SchemaImport
  605. : IMPORT SCHEMA {
  606. tokenizer.State = ParseState.NamespaceKeyword;
  607. } OptionalSchemaPrefix STRING_LITERAL {
  608. tokenizer.State = ParseState.Default;
  609. } OptionalLocations
  610. {
  611. if ($4 != null)
  612. tokenizer.AddNamespace ((string) $4, (string) $5);
  613. $$ = new SchemaImport ((string) $4, (string) $5, (ICollection) $7);
  614. }
  615. ;
  616. OptionalSchemaPrefix // returns string or null
  617. : // empty
  618. {
  619. $$ = null;
  620. }
  621. | SchemaPrefix
  622. ;
  623. SchemaPrefix // returns string
  624. : NAMESPACE {
  625. tokenizer.State = ParseState.NamespaceDecl;
  626. } NCName EQUAL {
  627. }
  628. {
  629. $$ = (string) $3;
  630. }
  631. | DEFAULT ELEMENT NAMESPACE {
  632. tokenizer.State = ParseState.NamespaceDecl;
  633. }
  634. {
  635. $$ = "";
  636. }
  637. ;
  638. ModuleImport // returns ModuleImport
  639. : IMPORT MODULE {
  640. tokenizer.State = ParseState.NamespaceKeyword;
  641. } OptionalModuleNamespace STRING_LITERAL {
  642. tokenizer.State = ParseState.Default;
  643. } OptionalLocations
  644. {
  645. $$ = new ModuleImport ((string) $4, (string) $5, (ICollection) $7);
  646. tokenizer.AddNamespace ((string) $4, (string) $5);
  647. }
  648. ;
  649. OptionalModuleNamespace // returns string
  650. : // empty
  651. {
  652. $$ = String.Empty;
  653. }
  654. | NAMESPACE {
  655. tokenizer.State = ParseState.NamespaceDecl;
  656. } NCName EQUAL
  657. {
  658. $$ = (string) $3;
  659. }
  660. ;
  661. OptionalLocations // returns ArrayList or null
  662. : // empty
  663. {
  664. $$ = null;
  665. }
  666. | AT STRING_LITERAL AdditionalLocations
  667. {
  668. ArrayList al = (ArrayList) $3;
  669. if (al != null)
  670. al = new ArrayList ();
  671. al.Add ((string) $2);
  672. $$ = al;
  673. }
  674. ;
  675. AdditionalLocations // returns ArrayList or null
  676. : // empty
  677. {
  678. $$ = null;
  679. }
  680. | COMMA STRING_LITERAL AdditionalLocations
  681. {
  682. ArrayList al = (ArrayList) $3;
  683. if (al == null)
  684. al = new ArrayList ();
  685. al.Add ((string) $2);
  686. $$ = al;
  687. }
  688. ;
  689. VarDecl // returns VariableDeclaration
  690. : DECLARE VARIABLE DOLLAR {
  691. tokenizer.PushState (ParseState.Default);
  692. tokenizer.State = ParseState.VarName;
  693. } VarName {
  694. tokenizer.State = ParseState.Operator;
  695. } OptionalTypeDeclaration VarDeclBody
  696. {
  697. $$ = new XQueryVariable ((XmlQualifiedName) $4, (SequenceType) $5, (ExprSequence) $6);
  698. }
  699. ;
  700. VarDeclBody // returns ExprSequence or null
  701. : OPEN_CURLY {
  702. tokenizer.State = ParseState.Default;
  703. } Expr CloseCurly
  704. {
  705. $$ = $2;
  706. }
  707. | EXTERNAL {
  708. // LAMESPEC: This state transition is not described in XQuery 1.0 spec
  709. tokenizer.PopState ();
  710. }
  711. {
  712. $$ = null;
  713. }
  714. ;
  715. VarName // returns XmlQualifiedName
  716. : QName {
  717. tokenizer.State = ParseState.Operator;
  718. }
  719. {
  720. $$ = $1;
  721. }
  722. ;
  723. OptionalTypeDeclaration // returns SequenceType or null
  724. : // empty
  725. {
  726. $$ = null;
  727. }
  728. | TypeDeclaration
  729. ;
  730. TypeDeclaration // returns SequenceType
  731. : AS { // Note that this transition applies only at Operator state.
  732. tokenizer.State = ParseState.ItemType;
  733. } SequenceType
  734. {
  735. $$ = $2;
  736. }
  737. ;
  738. FunctionDecl // returns FunctionDeclaration
  739. : DECLARE FUNCTION {
  740. tokenizer.PushState (ParseState.Default);
  741. tokenizer.State = ParseState.Default;
  742. } QName OPEN_PAREN OptionalParamList CLOSE_PAREN {
  743. tokenizer.State = ParseState.Operator;
  744. } OptionalTypeDeclaration FunctionBody
  745. {
  746. $$ = new FunctionDeclaration (
  747. (XmlQualifiedName) $4,
  748. (XQueryFunctionArgumentList) $6,
  749. (SequenceType) $9,
  750. (EnclosedExpr) $10);
  751. }
  752. ;
  753. FunctionBody // returns EnclosedExpr or null
  754. : EnclosedExpr
  755. | EXTERNAL
  756. {
  757. $$ = null;
  758. }
  759. ;
  760. SequenceType // returns SequenceType
  761. : ItemType OptionalOccurenceIndicator
  762. {
  763. $$ = new SequenceType ((ItemType) $1, (Occurence) $2);
  764. }
  765. | EMPTY OPEN_PAREN CLOSE_PAREN {
  766. tokenizer.State = ParseState.Operator;
  767. }
  768. {
  769. $$ = SequenceType.Create (XmlTypeCode.None, Occurence.One);
  770. }
  771. ;
  772. OptionalOccurenceIndicator // returns Occurence
  773. : // empty
  774. {
  775. $$ = Occurence.One;
  776. }
  777. | OccurenceIndicator
  778. ;
  779. OccurenceIndicator // returns Occurence
  780. : QUESTION
  781. {
  782. $$ = Occurence.Optional;
  783. }
  784. | ASTERISK
  785. {
  786. $$ = Occurence.ZeroOrMore;
  787. }
  788. | PLUS
  789. {
  790. $$ = Occurence.OneOrMore;
  791. }
  792. ;
  793. OptionalParamList // returns XQueryFunctionArgumentList
  794. : // empty
  795. {
  796. $$ = new XQueryFunctionArgumentList ();
  797. }
  798. | ParamList
  799. ;
  800. ParamList // returns XQueryFunctionArgumentList
  801. : Param
  802. {
  803. XQueryFunctionArgumentList pl = new XQueryFunctionArgumentList ();
  804. pl.Add ((XQueryFunctionArgument) $1);
  805. $$ = pl;
  806. }
  807. | Param COMMA ParamList
  808. {
  809. XQueryFunctionArgumentList pl = (XQueryFunctionArgumentList) $3;
  810. pl.Insert (0, (XQueryFunctionArgument) $1);
  811. $$ = pl;
  812. }
  813. ;
  814. Param // returns XQueryFunctionArgument
  815. : DOLLAR {
  816. tokenizer.State = ParseState.VarName;
  817. } VarName {
  818. tokenizer.State = ParseState.Operator;
  819. } OptionalTypeDeclaration
  820. {
  821. $$ = new XQueryFunctionArgument ((XmlQualifiedName) $3, (SequenceType) $5);
  822. }
  823. ;
  824. QueryBody
  825. : Expr
  826. ;
  827. /* --------------------------------------------------------
  828. Expressions
  829. -------------------------------------------------------- */
  830. Expr // returns ExprSequence
  831. : ExprSequence
  832. {
  833. ExprSequence seq = (ExprSequence) $1;
  834. $$ = seq;
  835. }
  836. ;
  837. ExprSequence // returns ExprSequence
  838. : ExprSingle
  839. {
  840. ExprSequence seq = new ExprSequence ();
  841. seq.Add ((ExprSingle) $1);
  842. $$ = seq;
  843. }
  844. | ExprSingle COMMA ExprSequence
  845. {
  846. ExprSequence seq = (ExprSequence) $3;
  847. seq.Insert (0, (ExprSingle) $1);
  848. $$ = seq;
  849. }
  850. ;
  851. ExprSingle // returns ExprSingle
  852. : FLWORExpr
  853. | QuantifiedExpr
  854. | TypeswitchExpr
  855. | IfExpr
  856. | OrExpr
  857. ;
  858. /* -------------------------------------
  859. FLWORExpr
  860. ------------------------------------- */
  861. FLWORExpr // returns FLWORExpr
  862. : RepeatedForLetClause OptionalWhereClause OptionalOrderByClause RETURN {
  863. tokenizer.State = ParseState.Default;
  864. } ExprSingle
  865. {
  866. ForLetClauseCollection col = (ForLetClauseCollection) $1;
  867. $$ = new FLWORExpr (col, (ExprSequence) $2, (OrderSpecList) $3, (ExprSingle) $6);
  868. }
  869. ;
  870. RepeatedForLetClause // returns ForLetClauseCollection
  871. : ForLetClause
  872. {
  873. ForLetClauseCollection col = new ForLetClauseCollection ();
  874. col.Add ((ForLetClause) $1);
  875. $$ = col;
  876. }
  877. | ForLetClause RepeatedForLetClause
  878. {
  879. ForLetClauseCollection col = (ForLetClauseCollection) $2;
  880. col.Insert (0, (ForLetClause) $1);
  881. $$ = col;
  882. }
  883. ;
  884. ForLetClause // returns ForLetClause
  885. : ForClause
  886. | LetClause
  887. ;
  888. OptionalWhereClause // returns ExprSequence or null
  889. : // empty
  890. {
  891. $$ = null;
  892. }
  893. | WhereClause
  894. ;
  895. OptionalOrderByClause
  896. : // empty
  897. {
  898. $$ = null;
  899. }
  900. | OrderByClause
  901. ;
  902. ForClause // returns ForClause
  903. : FOR ForBody
  904. {
  905. ForClause fc = (ForClause) $2;
  906. $$ = fc;
  907. }
  908. ;
  909. ForBody
  910. : ForSingleBody
  911. {
  912. ForClause fc = new ForClause ();
  913. fc.Add ((ForSingleBody) $1);
  914. $$ = fc;
  915. }
  916. | ForSingleBody COMMA ForBody
  917. {
  918. ForClause fc = (ForClause) $3;
  919. fc.Insert (0, (ForSingleBody) $1);
  920. $$ = fc;
  921. }
  922. ;
  923. ForSingleBody // returns ForSingleBody
  924. : DOLLAR {
  925. tokenizer.State = ParseState.VarName;
  926. } VarName {
  927. tokenizer.State = ParseState.Operator;
  928. } OptionalTypeDeclaration OptionalPositionalVar IN {
  929. tokenizer.State = ParseState.Default;
  930. } ExprSingle
  931. {
  932. $$ = new ForSingleBody ((XmlQualifiedName) $3, (SequenceType) $5, (XmlQualifiedName) $6, (ExprSingle) $9);
  933. }
  934. ;
  935. LetClause
  936. : LET LetBody
  937. {
  938. LetClause let = (LetClause) $2;
  939. $$ = let;
  940. }
  941. ;
  942. LetBody
  943. : LetSingleBody
  944. {
  945. LetClause lc = new LetClause ();
  946. lc.Add ((LetSingleBody) $1);
  947. $$ = lc;
  948. }
  949. | LetSingleBody COMMA LetBody
  950. {
  951. LetClause let = (LetClause) $3;
  952. let.Insert (0, (LetSingleBody) $1);
  953. $$ = let;
  954. }
  955. LetSingleBody
  956. : DOLLAR {
  957. tokenizer.State = ParseState.VarName;
  958. } VarName {
  959. tokenizer.State = ParseState.Operator;
  960. } OptionalTypeDeclaration COLON_EQUAL {
  961. tokenizer.State = ParseState.Default;
  962. } ExprSingle
  963. {
  964. $$ = new LetSingleBody ((XmlQualifiedName) $3, (SequenceType) $5, (ExprSingle) $8);
  965. }
  966. ;
  967. OptionalPositionalVar // returns XmlQualifiedName
  968. : // empty
  969. {
  970. $$ = XmlQualifiedName.Empty;
  971. }
  972. | PositionalVar
  973. ;
  974. PositionalVar
  975. : AT {
  976. tokenizer.State = ParseState.Default;
  977. } DOLLAR {
  978. tokenizer.State = ParseState.VarName;
  979. } VarName {
  980. tokenizer.State = ParseState.Operator;
  981. }
  982. {
  983. $$ = $5;
  984. }
  985. ;
  986. WhereClause // returns ExprSequence
  987. : WHERE {
  988. tokenizer.State = ParseState.Default;
  989. } Expr
  990. {
  991. $$ = $3;
  992. }
  993. ;
  994. OrderByClause // returns OrderSpecList
  995. : ORDER BY {
  996. tokenizer.State = ParseState.Default;
  997. } OrderSpecList
  998. {
  999. OrderSpecList l = (OrderSpecList) $4;
  1000. $$ = l;
  1001. }
  1002. | STABLE ORDER BY {
  1003. tokenizer.State = ParseState.Default;
  1004. } OrderSpecList
  1005. {
  1006. OrderSpecList l = (OrderSpecList) $5;
  1007. l.IsStable = true;
  1008. $$ = l;
  1009. }
  1010. ;
  1011. OrderSpecList // returns OrderSpecList
  1012. : OrderSpec
  1013. {
  1014. OrderSpecList osl = new OrderSpecList ();
  1015. osl.Add ((OrderSpec) $1);
  1016. $$ = osl;
  1017. }
  1018. | OrderSpec COMMA OrderSpecList
  1019. {
  1020. OrderSpecList l = (OrderSpecList) $3;
  1021. l.Insert (0, (OrderSpec) $1);
  1022. $$ = l;
  1023. }
  1024. ;
  1025. OrderSpec // returns OrderSpec
  1026. : ExprSingle OrderModifier
  1027. {
  1028. $$ = new OrderSpec ((ExprSingle) $1, (OrderModifier) $2);
  1029. }
  1030. ;
  1031. OrderModifier
  1032. : OrderSpecBase OrderEmptyHandling OptionalCollation
  1033. {
  1034. $$ = new OrderModifier ((XmlSortOrder) $1, (XmlSortOrder) $2, (string) $3);
  1035. }
  1036. ;
  1037. OrderSpecBase // returns XmlSortOrder
  1038. : // empty
  1039. {
  1040. $$ = XmlSortOrder.Ascending;
  1041. }
  1042. | ASCENDING
  1043. {
  1044. $$ = XmlSortOrder.Ascending;
  1045. }
  1046. | DESCENDING
  1047. {
  1048. $$ = XmlSortOrder.Descending;
  1049. }
  1050. ;
  1051. /* FIXME: check if it is correct (especially empty case) */
  1052. OrderEmptyHandling // returns XmlSortOrder
  1053. : // empty
  1054. {
  1055. $$ = XmlSortOrder.Ascending;
  1056. }
  1057. | EMPTY GREATEST
  1058. {
  1059. $$ = XmlSortOrder.Ascending;
  1060. }
  1061. | EMPTY LEAST
  1062. {
  1063. $$ = XmlSortOrder.Descending;
  1064. }
  1065. ;
  1066. OptionalCollation // returns string
  1067. : // empty
  1068. {
  1069. $$ = null;
  1070. }
  1071. | COLLATION STRING_LITERAL
  1072. {
  1073. $$ = $2;
  1074. }
  1075. ;
  1076. /* -------------------------------------
  1077. QuantifiedExpr
  1078. ------------------------------------- */
  1079. QuantifiedExpr
  1080. : SOME QuantifiedExprBody SATISFIES ExprSingle
  1081. {
  1082. QuantifiedExprBodyList l = (QuantifiedExprBodyList) $2;
  1083. $$ = new QuantifiedExpr (false, l, (ExprSingle) $4);
  1084. }
  1085. | EVERY QuantifiedExprBody SATISFIES ExprSingle
  1086. {
  1087. QuantifiedExprBodyList l = (QuantifiedExprBodyList) $2;
  1088. $$ = new QuantifiedExpr (true, l, (ExprSingle) $4);
  1089. }
  1090. ;
  1091. QuantifiedExprBody
  1092. : SingleQuantifiedExprBody
  1093. {
  1094. QuantifiedExprBodyList l = new QuantifiedExprBodyList ();
  1095. l.Add ((QuantifiedExprBody) $1);
  1096. $$ = l;
  1097. }
  1098. | SingleQuantifiedExprBody COMMA QuantifiedExprBody
  1099. {
  1100. QuantifiedExprBodyList l = (QuantifiedExprBodyList) $3;
  1101. l.Insert (0, (QuantifiedExprBody) $1);
  1102. $$ = l;
  1103. }
  1104. ;
  1105. SingleQuantifiedExprBody // returns QuantifiedExprBody
  1106. : DOLLAR {
  1107. tokenizer.State = ParseState.VarName;
  1108. } VarName {
  1109. tokenizer.State = ParseState.Operator;
  1110. } OptionalTypeDeclaration IN {
  1111. tokenizer.State = ParseState.Default;
  1112. } ExprSingle
  1113. {
  1114. $$ = new QuantifiedExprBody ((XmlQualifiedName) $3, (SequenceType) $5, (ExprSingle) $8);
  1115. }
  1116. ;
  1117. /* -------------------------------------
  1118. TypeswitchExpr
  1119. ------------------------------------- */
  1120. TypeswitchExpr // returns TypeswitchExpr
  1121. : TYPESWITCH OPEN_PAREN {
  1122. tokenizer.PushState (ParseState.Operator);
  1123. tokenizer.State = ParseState.Default;
  1124. } Expr CLOSE_PAREN {
  1125. tokenizer.State = ParseState.Operator;
  1126. } RepeatedCaseClause DEFAULT OptionalVarSpec RETURN {
  1127. tokenizer.State = ParseState.Default;
  1128. } ExprSingle
  1129. {
  1130. $$ = new TypeswitchExpr ((ExprSequence) $4, (CaseClauseList) $7, (XmlQualifiedName) $9, (ExprSingle) $12);
  1131. }
  1132. ;
  1133. RepeatedCaseClause // returns CaseClauseList
  1134. : CaseClause
  1135. {
  1136. CaseClauseList ccl = new CaseClauseList ();
  1137. ccl.Add ((CaseClause) $1);
  1138. $$ = ccl;
  1139. }
  1140. | CaseClause RepeatedCaseClause
  1141. {
  1142. CaseClauseList l = (CaseClauseList) $2;
  1143. l.Add ((CaseClause) $1);
  1144. $$ = l;
  1145. }
  1146. ;
  1147. CaseClause // returns CaseClause
  1148. : CASE {
  1149. tokenizer.State = ParseState.ItemType;
  1150. } SequenceType RETURN {
  1151. tokenizer.State = ParseState.Default;
  1152. } ExprSingle
  1153. {
  1154. $$ = new CaseClause ((SequenceType) $3, (ExprSingle) $6, XmlQualifiedName.Empty);
  1155. }
  1156. | CASE {
  1157. tokenizer.State = ParseState.ItemType;
  1158. } DOLLAR {
  1159. tokenizer.State = ParseState.VarName;
  1160. } VarName {
  1161. tokenizer.State = ParseState.Operator;
  1162. } AS {
  1163. tokenizer.State = ParseState.ItemType;
  1164. } SequenceType RETURN {
  1165. tokenizer.State = ParseState.Default;
  1166. } ExprSingle
  1167. {
  1168. $$ = new CaseClause ((SequenceType) $9, (ExprSingle) $12, (XmlQualifiedName) $5);
  1169. }
  1170. ;
  1171. OptionalVarSpec // returns XmlQualifiedName
  1172. : // empty
  1173. {
  1174. $$ = XmlQualifiedName.Empty;
  1175. }
  1176. | DOLLAR VarName
  1177. {
  1178. $$ = (XmlQualifiedName) $2;
  1179. }
  1180. ;
  1181. /* -------------------------------------
  1182. IfExpr
  1183. ------------------------------------- */
  1184. IfExpr
  1185. : IF OPEN_PAREN Expr CLOSE_PAREN {
  1186. tokenizer.State = ParseState.Operator;
  1187. } THEN {
  1188. tokenizer.State = ParseState.Default;
  1189. } ExprSingle ELSE {
  1190. tokenizer.State = ParseState.Default;
  1191. } ExprSingle
  1192. {
  1193. $$ = new IfExpr ((ExprSequence) $3, (ExprSingle) $8, (ExprSingle) $11);
  1194. }
  1195. ;
  1196. /* -------------------------------------
  1197. Logical Expressions
  1198. ------------------------------------- */
  1199. OrExpr
  1200. : AndExpr
  1201. | AndExpr OR {
  1202. tokenizer.State = ParseState.Default;
  1203. } OrExpr
  1204. {
  1205. $$ = new OrExpr ((ExprSingle) $1, (ExprSingle) $4);
  1206. }
  1207. ;
  1208. AndExpr
  1209. : InstanceOfExpr
  1210. | InstanceOfExpr AND {
  1211. tokenizer.State = ParseState.Default;
  1212. } AndExpr
  1213. {
  1214. $$ = new AndExpr ((ExprSingle) $1, (ExprSingle) $4);
  1215. }
  1216. ;
  1217. /* -------------------------------------
  1218. Typed Expressions
  1219. ------------------------------------- */
  1220. InstanceOfExpr
  1221. : TreatExpr
  1222. | TreatExpr INSTANCE OF {
  1223. tokenizer.State = ParseState.ItemType;
  1224. } SequenceType
  1225. {
  1226. $$ = new InstanceOfExpr ((ExprSingle) $1, (SequenceType) $5);
  1227. }
  1228. ;
  1229. TreatExpr
  1230. : CastableExpr
  1231. | CastableExpr TREAT AS {
  1232. tokenizer.State = ParseState.ItemType;
  1233. } SequenceType
  1234. {
  1235. $$ = new TreatExpr ((ExprSingle) $1, (SequenceType) $5);
  1236. }
  1237. ;
  1238. CastableExpr
  1239. : CastExpr
  1240. | CastExpr CASTABLE AS {
  1241. tokenizer.State = ParseState.ItemType;
  1242. } AtomicType OptionalQuestion
  1243. {
  1244. $$ = new CastableExpr ((ExprSingle) $1, (XmlTypeCode) $5, (bool)$6);
  1245. }
  1246. ;
  1247. OptionalQuestion
  1248. : // empty
  1249. {
  1250. $$ = false;
  1251. }
  1252. | QUESTION
  1253. {
  1254. $$ = true;
  1255. }
  1256. ;
  1257. CastExpr
  1258. : ComparisonExpr
  1259. | ComparisonExpr CAST AS {
  1260. tokenizer.State = ParseState.ItemType;
  1261. } AtomicType OptionalQuestion
  1262. {
  1263. $$ = new CastExpr ((ExprSingle) $1, (XmlTypeCode) $5, (bool) $6);
  1264. }
  1265. ;
  1266. /* -------------------------------------
  1267. Comparison Expressions
  1268. ------------------------------------- */
  1269. ComparisonExpr
  1270. : RangeExpr
  1271. | RangeExpr Comp {
  1272. tokenizer.State = ParseState.Default;
  1273. } RangeExpr
  1274. {
  1275. $$ = new ComparisonExpr ((ExprSingle) $1, (ExprSingle) $4, (ComparisonOperator) $2);
  1276. }
  1277. ;
  1278. Comp // returns ComparisonOperator
  1279. : ValueComp
  1280. | GeneralComp
  1281. | NodeComp
  1282. ;
  1283. ValueComp
  1284. : EQ
  1285. {
  1286. $$ = ComparisonOperator.ValueEQ;
  1287. }
  1288. | NE
  1289. {
  1290. $$ = ComparisonOperator.ValueNE;
  1291. }
  1292. | LT
  1293. {
  1294. $$ = ComparisonOperator.ValueLT;
  1295. }
  1296. | LE
  1297. {
  1298. $$ = ComparisonOperator.ValueLE;
  1299. }
  1300. | GT
  1301. {
  1302. $$ = ComparisonOperator.ValueGT;
  1303. }
  1304. | GE
  1305. {
  1306. $$ = ComparisonOperator.ValueGE;
  1307. }
  1308. ;
  1309. GeneralComp
  1310. : EQUAL
  1311. {
  1312. $$ = ComparisonOperator.GeneralEQ;
  1313. }
  1314. | NOT_EQUAL
  1315. {
  1316. $$ = ComparisonOperator.GeneralNE;
  1317. }
  1318. | LESSER
  1319. {
  1320. $$ = ComparisonOperator.GeneralLT;
  1321. }
  1322. | LESSER_EQUAL
  1323. {
  1324. $$ = ComparisonOperator.GeneralLE;
  1325. }
  1326. | GREATER
  1327. {
  1328. $$ = ComparisonOperator.GeneralGT;
  1329. }
  1330. | GREATER_EQUAL
  1331. {
  1332. $$ = ComparisonOperator.GeneralGE;
  1333. }
  1334. ;
  1335. NodeComp
  1336. : IS
  1337. {
  1338. $$ = ComparisonOperator.NodeIs;
  1339. }
  1340. | LESSER2
  1341. {
  1342. $$ = ComparisonOperator.NodeFWD;
  1343. }
  1344. | GREATER2
  1345. {
  1346. $$ = ComparisonOperator.NodeBWD;
  1347. }
  1348. ;
  1349. RangeExpr
  1350. : AdditiveExpr
  1351. | AdditiveExpr TO {
  1352. tokenizer.State = ParseState.Default;
  1353. } AdditiveExpr
  1354. {
  1355. $$ = new RangeExpr ((ExprSingle) $1, (ExprSingle)$4);
  1356. }
  1357. ;
  1358. /* -------------------------------------
  1359. Arithmetic Expressions
  1360. ------------------------------------- */
  1361. AdditiveExpr
  1362. : MultiplicativeExpr
  1363. | MultiplicativeExpr PLUS {
  1364. tokenizer.State = ParseState.Default;
  1365. } AdditiveExpr
  1366. {
  1367. $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Add);
  1368. }
  1369. | MultiplicativeExpr MINUS {
  1370. tokenizer.State = ParseState.Default;
  1371. } AdditiveExpr
  1372. {
  1373. $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Sub);
  1374. }
  1375. ;
  1376. MultiplicativeExpr
  1377. : UnaryExpr
  1378. | UnaryExpr ASTERISK {
  1379. tokenizer.State = ParseState.Default;
  1380. } MultiplicativeExpr
  1381. {
  1382. $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Mul);
  1383. }
  1384. | UnaryExpr DIV {
  1385. tokenizer.State = ParseState.Default;
  1386. } MultiplicativeExpr
  1387. {
  1388. $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Div);
  1389. }
  1390. | UnaryExpr IDIV {
  1391. tokenizer.State = ParseState.Default;
  1392. } MultiplicativeExpr
  1393. {
  1394. $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.IDiv);
  1395. }
  1396. | UnaryExpr MOD {
  1397. tokenizer.State = ParseState.Default;
  1398. } MultiplicativeExpr
  1399. {
  1400. $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.IMod);
  1401. }
  1402. ;
  1403. UnaryExpr
  1404. : UnionExpr
  1405. | MINUS UnionExpr
  1406. {
  1407. $$ = new MinusExpr ((ExprSingle) $2);
  1408. }
  1409. | PLUS UnionExpr
  1410. {
  1411. $$ = $2;
  1412. }
  1413. ;
  1414. UnionExpr
  1415. : IntersectExceptExpr
  1416. | IntersectExceptExpr UNION {
  1417. tokenizer.State = ParseState.Default;
  1418. } UnionExpr
  1419. {
  1420. $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Union);
  1421. }
  1422. | IntersectExceptExpr BAR {
  1423. tokenizer.State = ParseState.Default;
  1424. } UnionExpr
  1425. {
  1426. $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Union);
  1427. }
  1428. ;
  1429. IntersectExceptExpr
  1430. : ValueExpr
  1431. | ValueExpr INTERSECT {
  1432. tokenizer.State = ParseState.Default;
  1433. } IntersectExceptExpr
  1434. {
  1435. $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Intersect);
  1436. }
  1437. | ValueExpr EXCEPT {
  1438. tokenizer.State = ParseState.Default;
  1439. } IntersectExceptExpr
  1440. {
  1441. $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Except);
  1442. }
  1443. ;
  1444. ValueExpr
  1445. : ValidateExpr
  1446. | PathExpr
  1447. ;
  1448. /* -----------------
  1449. Validation Expressions
  1450. ----------------- */
  1451. // FIXME: Here state transition is not well-tracked.
  1452. ValidateExpr // returns ValidateExpr
  1453. : VALIDATE OptionalValidationMode OPEN_CURLY {
  1454. tokenizer.State = ParseState.Default;
  1455. tokenizer.PushState (ParseState.Operator);
  1456. } Expr CloseCurly
  1457. {
  1458. $$ = new ValidateExpr ((XmlSchemaContentProcessing) $2, (ExprSequence) $6);
  1459. }
  1460. ;
  1461. OptionalValidationMode // returns XmlSchemaContentProcessing
  1462. : // empty
  1463. {
  1464. $$ = XmlSchemaContentProcessing.Strict; // FIXME: confirm
  1465. }
  1466. | LAX
  1467. {
  1468. $$ = XmlSchemaContentProcessing.Lax;
  1469. }
  1470. | STRICT
  1471. {
  1472. $$ = XmlSchemaContentProcessing.Strict;
  1473. }
  1474. ;
  1475. /* -----------------
  1476. Path Expressions
  1477. ----------------- */
  1478. PathExpr // returns PathExpr
  1479. : Slash
  1480. {
  1481. $$ = new PathRootExpr ();
  1482. }
  1483. | Slash RelativePathExpr
  1484. {
  1485. $$ = new PathSlashExpr (new PathRootExpr (), (ExprSingle) $2);
  1486. }
  1487. | Slash2 RelativePathExpr
  1488. {
  1489. $$ = new PathSlash2Expr (new PathRootExpr (), (ExprSingle) $2);
  1490. }
  1491. | RelativePathExpr
  1492. ;
  1493. RelativePathExpr // returns PathExpr
  1494. : StepExpr
  1495. | StepExpr Slash RelativePathExpr
  1496. {
  1497. $$ = new PathSlashExpr ((ExprSingle) $1, (ExprSingle) $3);
  1498. }
  1499. | StepExpr Slash2 RelativePathExpr
  1500. {
  1501. $$ = new PathSlash2Expr ((ExprSingle) $1, (ExprSingle) $3);
  1502. }
  1503. ;
  1504. StepExpr // returns ExprSingle
  1505. : AxisStep
  1506. | FilterStep
  1507. ;
  1508. AxisStep // returns PathExpr
  1509. : ForwardOrReverseStep
  1510. | AxisStep Predicate
  1511. {
  1512. $$ = new FilterStepExpr ((ExprSingle) $1, (ExprSequence) $2);
  1513. }
  1514. ;
  1515. ForwardOrReverseStep // returns ExprSingle
  1516. : ForwardStep
  1517. | ReverseStep
  1518. ;
  1519. Predicate
  1520. : OPEN_BRACKET Expr CLOSE_BRACKET {
  1521. tokenizer.State = ParseState.Operator;
  1522. }
  1523. {
  1524. $$ = $2;
  1525. }
  1526. ;
  1527. FilterStep // returns ExprSingle
  1528. : PrimaryExpr
  1529. | FilterStep Predicate
  1530. {
  1531. $$ = new FilterStepExpr ((ExprSingle) $1, (ExprSequence) $2);
  1532. }
  1533. ;
  1534. ForwardStep // returns AxisStepExpr
  1535. : ForwardAxis NodeTest
  1536. {
  1537. $$ = new AxisStepExpr ((XPathAxis) $1, (XPath2NodeTest) $2);
  1538. }
  1539. | AbbrevForwardStep
  1540. ;
  1541. ReverseStep // returns AxisStepExpr
  1542. : ReverseAxis NodeTest
  1543. {
  1544. $$ = new AxisStepExpr ((XPathAxis) $1, (XPath2NodeTest) $2);
  1545. }
  1546. | AbbrevReverseStep
  1547. ;
  1548. ForwardAxis // returns XPathAxis
  1549. : CHILD COLON2
  1550. {
  1551. $$ = XPathAxis.Child;
  1552. }
  1553. | DESCENDANT COLON2
  1554. {
  1555. $$ = XPathAxis.Descendant;
  1556. }
  1557. | ATTRIBUTE COLON2
  1558. {
  1559. $$ = XPathAxis.Attribute;
  1560. }
  1561. | SELF COLON2
  1562. {
  1563. $$ = XPathAxis.Self;
  1564. }
  1565. | DESCENDANT_OR_SELF COLON2
  1566. {
  1567. $$ = XPathAxis.DescendantOrSelf;
  1568. }
  1569. | FOLLOWING_SIBLING COLON2
  1570. {
  1571. $$ = XPathAxis.FollowingSibling;
  1572. }
  1573. | FOLLOWING COLON2
  1574. {
  1575. $$ = XPathAxis.Following;
  1576. }
  1577. ;
  1578. ReverseAxis // returns XPathAxis
  1579. : PARENT COLON2
  1580. {
  1581. $$ = XPathAxis.Parent;
  1582. }
  1583. | ANCESTOR COLON2
  1584. {
  1585. $$ = XPathAxis.Ancestor;
  1586. }
  1587. | PRECEDING_SIBLING COLON2
  1588. {
  1589. $$ = XPathAxis.PrecedingSibling;
  1590. }
  1591. | PRECEDING COLON2
  1592. {
  1593. $$ = XPathAxis.Preceding;
  1594. }
  1595. | ANCESTOR_OR_SELF COLON2
  1596. {
  1597. $$ = XPathAxis.AncestorOrSelf;
  1598. }
  1599. ;
  1600. // LAMESPEC: in the XQuery spec, it is "@? NodeTest", but NodeKindTest
  1601. // should not appear after AT. (imagine @processing-instruction::(name)).
  1602. AbbrevForwardStep // returns NodeTestExpr
  1603. : NodeTest
  1604. {
  1605. $$ = new AxisStepExpr (XPathAxis.Child, (XPath2NodeTest) $1);
  1606. }
  1607. | AT NameTest
  1608. {
  1609. $$ = new AxisStepExpr (XPathAxis.Attribute, new XPath2NodeTest ((XmlQualifiedName) $2));
  1610. }
  1611. ;
  1612. AbbrevReverseStep // returns AxisStepExpr
  1613. : DOT2
  1614. {
  1615. $$ = new AxisStepExpr (XPathAxis.Parent, null);
  1616. }
  1617. ;
  1618. NodeTest // returns NodeTest
  1619. : KindTest
  1620. {
  1621. $$ = new XPath2NodeTest ((KindTest) $1);
  1622. }
  1623. | NameTest
  1624. {
  1625. $$ = new XPath2NodeTest ((XmlQualifiedName) $1);
  1626. }
  1627. ;
  1628. NameTest // returns XmlQualifiedName
  1629. : QName
  1630. | Wildcard {
  1631. tokenizer.State = ParseState.Operator;
  1632. }
  1633. ;
  1634. Wildcard // returns XmlQualifiedName /*ws:explicit*/
  1635. : ASTERISK
  1636. {
  1637. $$ = new XmlQualifiedName ("*", "*");
  1638. }
  1639. | WILD_LOCALNAME
  1640. {
  1641. $$ = (XmlQualifiedName) $1;
  1642. }
  1643. | WILD_PREFIX
  1644. {
  1645. $$ = (XmlQualifiedName) $1;
  1646. }
  1647. ;
  1648. AtomicType // returns XmlTypeCode
  1649. : QName
  1650. {
  1651. $$ = GetAtomicTypeCode ((XmlQualifiedName) $1);
  1652. }
  1653. ;
  1654. ItemType // returns ItemType
  1655. : AtomicType {
  1656. tokenizer.State = ParseState.OccurenceIndicator;
  1657. }
  1658. {
  1659. $$ = new ItemType ((XmlTypeCode) $1);
  1660. }
  1661. | KindTest
  1662. | ITEM OPEN_PAREN CLOSE_PAREN {
  1663. tokenizer.State = ParseState.OccurenceIndicator;
  1664. }
  1665. {
  1666. $$ = new ItemType (XmlTypeCode.Item);
  1667. }
  1668. ;
  1669. KindTest // returns KindTest
  1670. : DocumentTest
  1671. | ElementTest
  1672. | AttributeTest
  1673. | PITest
  1674. | CommentTest
  1675. | TextTest
  1676. | AnyKindTest
  1677. ;
  1678. PITest
  1679. : PROCESSING_INSTRUCTION OPEN_PAREN {
  1680. // LAMESPEC: push state is described as Operator, but should
  1681. // be OccurenceIndicator (as any KindTest could be followed by
  1682. // '?' '+' or '*')
  1683. tokenizer.PushState (ParseState.OccurenceIndicator);
  1684. tokenizer.State = ParseState.KindTestForPI;
  1685. } PITestContent CLOSE_PAREN {
  1686. tokenizer.PopState ();
  1687. }
  1688. {
  1689. $$ = $4;
  1690. }
  1691. ;
  1692. PITestContent // returns KindTest
  1693. : // empty
  1694. {
  1695. $$ = new KindTest (XmlTypeCode.ProcessingInstruction);
  1696. }
  1697. | NCName
  1698. {
  1699. $$ = new XmlPITest ((string) $1);
  1700. }
  1701. | STRING_LITERAL
  1702. {
  1703. $$ = new XmlPITest ((string) $1);
  1704. }
  1705. ;
  1706. CommentTest
  1707. : COMMENT OPEN_PAREN {
  1708. tokenizer.PushState (ParseState.OccurenceIndicator);
  1709. tokenizer.State = ParseState.KindTest;
  1710. } CLOSE_PAREN {
  1711. tokenizer.PopState ();
  1712. }
  1713. {
  1714. $$ = new KindTest (XmlTypeCode.Comment);
  1715. }
  1716. ;
  1717. TextTest
  1718. : TEXT OPEN_PAREN {
  1719. tokenizer.PushState (ParseState.OccurenceIndicator);
  1720. tokenizer.State = ParseState.KindTest;
  1721. } CLOSE_PAREN {
  1722. tokenizer.PopState ();
  1723. }
  1724. {
  1725. $$ = new KindTest (XmlTypeCode.Text);
  1726. }
  1727. ;
  1728. AnyKindTest
  1729. : NODE OPEN_PAREN {
  1730. tokenizer.PushState (ParseState.OccurenceIndicator);
  1731. tokenizer.State = ParseState.KindTest;
  1732. } CLOSE_PAREN {
  1733. tokenizer.PopState ();
  1734. }
  1735. {
  1736. $$ = new KindTest (XmlTypeCode.Node);
  1737. }
  1738. ;
  1739. DocumentTest // returns DocumentTest
  1740. : DOCUMENT_NODE OPEN_PAREN {
  1741. tokenizer.PushState (ParseState.OccurenceIndicator);
  1742. tokenizer.State = ParseState.KindTest;
  1743. } DocumentTestContent CLOSE_PAREN {
  1744. tokenizer.PopState ();
  1745. }
  1746. {
  1747. $$ = $4;
  1748. }
  1749. ;
  1750. DocumentTestContent // returns DocumentTest
  1751. : // empty
  1752. {
  1753. $$ = new KindTest (XmlTypeCode.Document);
  1754. }
  1755. | ElementTest
  1756. {
  1757. $$ = new DocumentTest ((ElementTest) $1);
  1758. }
  1759. ;
  1760. ElementTest // returns ElementTest
  1761. : ELEMENT OPEN_PAREN {
  1762. tokenizer.PushState (ParseState.OccurenceIndicator);
  1763. tokenizer.State = ParseState.KindTest;
  1764. } ElementTestContent CLOSE_PAREN {
  1765. tokenizer.PopState ();
  1766. }
  1767. {
  1768. $$ = $4;
  1769. }
  1770. ;
  1771. ElementTestContent // returns ElementTest
  1772. : // empty
  1773. {
  1774. $$ = new KindTest (XmlTypeCode.Element);
  1775. }
  1776. | ElementNameOrWildcard
  1777. {
  1778. $$ = new ElementTest ((XmlQualifiedName) $1);
  1779. }
  1780. | ElementNameOrWildcard COMMA TypeName OptionalQuestion
  1781. {
  1782. $$ = new ElementTest ((XmlQualifiedName) $1, (XmlQualifiedName) $3, (bool) $4);
  1783. }
  1784. ;
  1785. OptionalQuestion // returns bool
  1786. : // empty
  1787. {
  1788. $$ = false;
  1789. }
  1790. | QUESTION
  1791. {
  1792. $$ = true;
  1793. }
  1794. ;
  1795. AttributeTest // returns AttributeTest
  1796. : ATTRIBUTE OPEN_PAREN {
  1797. tokenizer.PushState (ParseState.OccurenceIndicator);
  1798. tokenizer.State = ParseState.KindTest;
  1799. } AttributeTestContent CLOSE_PAREN {
  1800. tokenizer.PopState ();
  1801. }
  1802. {
  1803. $$ = $4;
  1804. }
  1805. ;
  1806. AttributeTestContent // returns AttributeTest
  1807. : // empty
  1808. {
  1809. $$ = AttributeTest.AnyAttribute;
  1810. }
  1811. | AttributeNameOrWildcard
  1812. {
  1813. $$ = new AttributeTest ((XmlQualifiedName) $1);
  1814. }
  1815. | AttributeNameOrWildcard COMMA TypeNameOrWildcard
  1816. {
  1817. $$ = new AttributeTest ((XmlQualifiedName) $1, (XmlQualifiedName) $3);
  1818. }
  1819. ;
  1820. ElementName
  1821. : QName
  1822. ;
  1823. AttributeName
  1824. : QName
  1825. ;
  1826. TypeName
  1827. : QName
  1828. ;
  1829. ElementNameOrWildcard // returns XmlQualifiedName
  1830. : ElementName
  1831. | ASTERISK
  1832. {
  1833. $$ = new XmlQualifiedName ("*", "*");
  1834. }
  1835. ;
  1836. AttributeNameOrWildcard // returns XmlQualifiedName
  1837. : AttributeName
  1838. | ASTERISK
  1839. {
  1840. $$ = new XmlQualifiedName ("*", "*");
  1841. }
  1842. ;
  1843. TypeNameOrWildcard // returns XmlQualifiedName
  1844. : TypeName
  1845. | ASTERISK
  1846. {
  1847. $$ = new XmlQualifiedName ("*", "*");
  1848. }
  1849. ;
  1850. /* ----------------
  1851. Primary Expressions
  1852. ---------------- */
  1853. PrimaryExpr // returns ExprSingle
  1854. : Literal {
  1855. tokenizer.State = ParseState.Operator;
  1856. }
  1857. | VarRef
  1858. | ParenthesizedExpr
  1859. | ContextItemExpr
  1860. | FunctionCall
  1861. | Constructor
  1862. | OrderedExpr
  1863. | UnorderedExpr
  1864. ;
  1865. Literal
  1866. : DECIMAL_LITERAL
  1867. {
  1868. $$ = new DecimalLiteralExpr ((decimal) $1);
  1869. }
  1870. | DOUBLE_LITERAL
  1871. {
  1872. $$ = new DoubleLiteralExpr ((double) $1);
  1873. }
  1874. | STRING_LITERAL
  1875. {
  1876. $$ = new StringLiteralExpr ((string) $1);
  1877. }
  1878. ;
  1879. /*
  1880. NUMERIC_LITERAL
  1881. : IntegerLiteral
  1882. | DecimalLiteral
  1883. | DoubleLiteral
  1884. ;
  1885. IntegerLiteral
  1886. : Digits
  1887. ;
  1888. DecimalLiteral
  1889. : DOT Digits
  1890. | Digits DOT OptDigits
  1891. ;
  1892. DoubleLiteral
  1893. : DoubleDecimalPartSpec ExponentSpec
  1894. ;
  1895. DoubleDecimalPartSpec
  1896. : DOT Digits
  1897. | Digits
  1898. | Digits DOT OptDigits
  1899. ExponentSpec
  1900. : // empty/*
  1901. | ExponentAlpha Digits
  1902. | ExponentAlpha PLUS Digits
  1903. | ExponentAlpha MINUS Digits
  1904. ;
  1905. ExponentAlpha
  1906. : LARGE_E
  1907. | SMALL_E
  1908. ;
  1909. OptDigits
  1910. : // empty/*
  1911. | Digits
  1912. ;
  1913. Digits
  1914. : ZERO_TO_NINE_SEQ
  1915. ;
  1916. STRING_LITERAL
  1917. : QUOT STRING_LITERALContentQuot
  1918. | APOS STRING_LITERALContentApos
  1919. ;
  1920. STRING_LITERALContentQuot
  1921. : PREDEFINED_ENTITY_REF
  1922. | CHAR_REF
  1923. | QUOT2
  1924. | REMAINING_LITERAL
  1925. ;
  1926. STRING_LITERALContentApos
  1927. : PREDEFINED_ENTITY_REF
  1928. | CHAR_REF
  1929. | APOS2
  1930. | REMAINING_LITERAL
  1931. ;
  1932. */
  1933. VarRef // returns VariableReferenceExpr
  1934. : DOLLAR {
  1935. tokenizer.State = ParseState.VarName;
  1936. } VarName
  1937. {
  1938. $$ = new VariableReferenceExpr ((XmlQualifiedName) $3);
  1939. }
  1940. ;
  1941. VarName // returns XmlQualifiedName
  1942. : QName {
  1943. tokenizer.State = ParseState.Operator;
  1944. }
  1945. {
  1946. $$ = $1;
  1947. }
  1948. ;
  1949. ParenthesizedExpr // returns ParenthesizedExpr
  1950. : OPEN_PAREN OptionalExpr CLOSE_PAREN {
  1951. tokenizer.State = ParseState.Operator;
  1952. }
  1953. {
  1954. $$ = new ParenthesizedExpr ((ExprSequence) $2);
  1955. }
  1956. ;
  1957. OptionalExpr
  1958. : // empty
  1959. {
  1960. $$ = new ExprSequence ();
  1961. }
  1962. | Expr
  1963. ;
  1964. ContextItemExpr // returns ContextItemExpr
  1965. : DOT {
  1966. tokenizer.State = ParseState.Operator;
  1967. }
  1968. {
  1969. $$ = new ContextItemExpr ();
  1970. }
  1971. ;
  1972. FunctionCall
  1973. : QName OPEN_PAREN {
  1974. tokenizer.State = ParseState.Default;
  1975. } OptionalExpr CLOSE_PAREN {
  1976. tokenizer.State = ParseState.Operator;
  1977. }
  1978. {
  1979. XmlQualifiedName name = (XmlQualifiedName) $1;
  1980. if (name.Namespace == "")
  1981. name = new XmlQualifiedName (name.Name, tokenizer.DefaultFunctionNamespace);
  1982. if (name.Namespace != ""
  1983. && name.Namespace != XmlSchema.XdtNamespace
  1984. && reservedFunctionNames [name.Name] != null)
  1985. throw new XmlQueryCompileException (String.Format ("'{0}' is reserved and cannot be used as a function name.", name.Name));
  1986. $$ = new FunctionCallExpr (name, (ExprSequence) $4);
  1987. }
  1988. ;
  1989. OrderedExpr
  1990. : ORDERED OPEN_BRACKET Expr CLOSE_BRACKET
  1991. {
  1992. $$ = new OrderSpecifiedExpr ((ExprSequence) $3, true);
  1993. }
  1994. ;
  1995. UnorderedExpr
  1996. : UNORDERED OPEN_BRACKET {
  1997. tokenizer.PushState (ParseState.Operator);
  1998. tokenizer.State = ParseState.Default;
  1999. } Expr CLOSE_BRACKET {
  2000. tokenizer.PopState ();
  2001. }
  2002. {
  2003. $$ = new OrderSpecifiedExpr ((ExprSequence) $4, false);
  2004. }
  2005. ;
  2006. /* -----------------
  2007. Constructors
  2008. ----------------- */
  2009. Constructor // returns ExprSingle
  2010. : DirElemConstructor
  2011. | ComputedConstructor
  2012. | XmlComment
  2013. | XmlPI
  2014. | XmlCData
  2015. ;
  2016. DirElemConstructor // returns XmlElemConstructor
  2017. : LESSER {
  2018. if (tokenizer.State == ParseState.ElementContent)
  2019. tokenizer.PushState (tokenizer.State);
  2020. // if (tokenizer.State == ParseState.Default)
  2021. else // considering <foo></foo><bar></bar> there after </foo> state is Operator.
  2022. tokenizer.PushState (ParseState.Operator);
  2023. tokenizer.State = ParseState.StartTag;
  2024. // FIXME: tokenizer.Space = WhitespaceHandling.Significant;
  2025. } QName AttributeList FollowDirElemConstructor {
  2026. tokenizer.PopState ();
  2027. }
  2028. {
  2029. ExprSequence expr = new ExprSequence ();
  2030. expr.AddRange ((ICollection) $4);
  2031. expr.AddRange ((ICollection) $5);
  2032. $$ = new XmlElemConstructor ((XmlQualifiedName) $3, expr);
  2033. }
  2034. ;
  2035. FollowDirElemConstructor // returns ExprSequence
  2036. : EMPTY_TAG_CLOSE
  2037. {
  2038. $$ = new ExprSequence ();
  2039. }
  2040. | GREATER {
  2041. tokenizer.State = ParseState.ElementContent;
  2042. } ElementContentList END_TAG_START {
  2043. tokenizer.State = ParseState.EndTag;
  2044. } QName {
  2045. // tokenizer.Space = WhitespaceHandling.Arbitrary;
  2046. } GREATER
  2047. {
  2048. $$ = $3;
  2049. }
  2050. ;
  2051. ElementContentList // returns ExprSequence
  2052. : // empty
  2053. {
  2054. $$ = new ExprSequence ();
  2055. }
  2056. | ElementContent ElementContentList
  2057. {
  2058. ExprSequence el = (ExprSequence) $2;
  2059. el.Insert (0, (ExprSingle) $1);
  2060. $$ = el;
  2061. }
  2062. ;
  2063. AttributeList // returns XmlAttrConstructorList
  2064. : // empty
  2065. {
  2066. $$ = new XmlAttrConstructorList ();
  2067. }
  2068. | /* space */ Attribute AttributeList
  2069. {
  2070. XmlAttrConstructorList al = (XmlAttrConstructorList) $2;
  2071. al.Insert (0, (XmlAttrConstructor) $1);
  2072. $$ = al;
  2073. }
  2074. ;
  2075. Attribute // returns XmlAttrConstructor
  2076. : QName /* opt-space */ EQUAL /* opt-space */ AttributeValue
  2077. {
  2078. $$ = new XmlAttrConstructor ((XmlQualifiedName) $1, (ExprSequence) $3);
  2079. }
  2080. ;
  2081. /*
  2082. // FIXME: it should be more complex
  2083. AttributeValue // returns ExprSequence
  2084. : STRING_LITERAL
  2085. {
  2086. ExprSequence es = new ExprSequence ();
  2087. es.Insert (0, new StringLiteralExpr ((string) $1));
  2088. $$ = es;
  2089. }
  2090. ;
  2091. */
  2092. AttributeValue // returns ExprSequence
  2093. : QUOT {
  2094. tokenizer.State = ParseState.QuotAttributeContent;
  2095. } AttributeValueContentSequence QUOT {
  2096. tokenizer.State = ParseState.StartTag;
  2097. }
  2098. {
  2099. $$ = $3;
  2100. }
  2101. | APOS {
  2102. tokenizer.State = ParseState.AposAttributeContent;
  2103. } AttributeValueContentSequence APOS {
  2104. tokenizer.State = ParseState.StartTag;
  2105. }
  2106. {
  2107. $$ = $3;
  2108. }
  2109. ;
  2110. AttributeValueContentSequence // returns ExprSequence
  2111. : // empty
  2112. {
  2113. $$ = new ExprSequence ();
  2114. }
  2115. | AttributeValueContent AttributeValueContentSequence
  2116. {
  2117. ExprSequence es = (ExprSequence) $2;
  2118. es.Insert (0, (ExprSingle) $1);
  2119. $$ = es;
  2120. }
  2121. ;
  2122. AttributeValueContent // returns ExprSingle
  2123. : ATT_VALUE_LITERAL // including "{{", "}}" and char/predefined entities
  2124. {
  2125. $$ = new StringLiteralExpr ((string) $1);
  2126. }
  2127. | EnclosedExpr
  2128. ;
  2129. EnclosedExpr // returns EnclosedExpr
  2130. // FIXME: check if this state transition is valid for ElementContent and AttributeValueContent
  2131. : OPEN_CURLY {
  2132. switch (tokenizer.State) {
  2133. case ParseState.ElementContent:
  2134. case ParseState.QuotAttributeContent:
  2135. case ParseState.AposAttributeContent:
  2136. tokenizer.PushState (tokenizer.State);
  2137. break;
  2138. }
  2139. tokenizer.State = ParseState.Default;
  2140. } Expr CloseCurly
  2141. {
  2142. $$ = new EnclosedExpr ((ExprSequence) $3);
  2143. }
  2144. ;
  2145. ElementContent // returns ExprSingle
  2146. : ELEM_CONTENT_LITERAL // including "{{", "}}" and char/predefined entities
  2147. {
  2148. $$ = new XmlTextConstructor ((string) $1);
  2149. }
  2150. | DirElemConstructor
  2151. | EnclosedExpr
  2152. | XmlCData
  2153. | XmlComment
  2154. | XmlPI
  2155. ;
  2156. XmlCData
  2157. : XML_CDATA_START XML_CDATA_TO_END
  2158. {
  2159. $$ = new XmlTextConstructor ((string) $2);
  2160. }
  2161. ;
  2162. XmlComment // returns XmlCommentConstructor
  2163. : XML_COMMENT_START XML_COMMENT_TO_END
  2164. {
  2165. $$ = new XmlCommentConstructor ((string) $2);
  2166. }
  2167. ;
  2168. XmlPI // returns XmlPIConstructor
  2169. : XML_PI_START {
  2170. tokenizer.PushState (tokenizer.State);
  2171. tokenizer.State = ParseState.XmlPI;
  2172. } PITarget {
  2173. tokenizer.State = ParseState.XmlPIContent;
  2174. } XML_PI_TO_END {
  2175. tokenizer.PopState ();
  2176. }
  2177. {
  2178. string name = (string) $3;
  2179. $$ = new XmlPIConstructor (name, (string) $5);
  2180. }
  2181. ;
  2182. PITarget
  2183. : NCName
  2184. ;
  2185. ComputedConstructor // returns ExprSingle
  2186. : CompElemConstructor
  2187. | CompAttrConstructor
  2188. | CompDocConstructor
  2189. | CompTextConstructor
  2190. | CompXmlPI
  2191. | CompXmlComment
  2192. | CompNSConstructor
  2193. ;
  2194. CompElemConstructor
  2195. : ELEMENT QName OPEN_CURLY Expr CloseCurly
  2196. {
  2197. $$ = new XmlElemConstructor ((XmlQualifiedName) $2, (ExprSequence) $4);
  2198. }
  2199. | ELEMENT OPEN_CURLY Expr CloseCurly OPEN_CURLY Expr CloseCurly
  2200. {
  2201. $$ = new XmlElemConstructor ((ExprSequence) $3, (ExprSequence) $6);
  2202. }
  2203. ;
  2204. CompAttrConstructor
  2205. : ATTRIBUTE QName OPEN_CURLY Expr CloseCurly
  2206. {
  2207. $$ = new XmlAttrConstructor ((XmlQualifiedName) $2, (ExprSequence) $4);
  2208. }
  2209. | ATTRIBUTE OPEN_CURLY Expr CloseCurly OPEN_CURLY Expr CloseCurly
  2210. {
  2211. $$ = new XmlAttrConstructor ((ExprSequence) $3, (ExprSequence) $6);
  2212. }
  2213. ;
  2214. CompNSConstructor
  2215. : NAMESPACE NCName OPEN_CURLY Expr CloseCurly
  2216. {
  2217. $$ = new XmlNSConstructor ((string) $2, (ExprSequence) $4);
  2218. }
  2219. ;
  2220. CompDocConstructor
  2221. : DOCUMENT OPEN_CURLY Expr CloseCurly
  2222. {
  2223. $$ = new XmlDocConstructor ((ExprSequence) $3);
  2224. }
  2225. ;
  2226. CompTextConstructor
  2227. : TEXT OPEN_CURLY Expr CloseCurly
  2228. {
  2229. $$ = new XmlTextConstructor ((ExprSequence) $3);
  2230. }
  2231. ;
  2232. CompXmlComment
  2233. : COMMENT OPEN_CURLY Expr CloseCurly
  2234. {
  2235. $$ = new XmlCommentConstructor ((ExprSequence) $3);
  2236. }
  2237. ;
  2238. CompXmlPI
  2239. : PROCESSING_INSTRUCTION NCName OPEN_CURLY Expr CloseCurly
  2240. {
  2241. $$ = new XmlPIConstructor ((string) $2, (ExprSequence) $4);
  2242. }
  2243. | PROCESSING_INSTRUCTION OPEN_CURLY Expr CloseCurly OPEN_CURLY Expr CloseCurly
  2244. {
  2245. $$ = new XmlPIConstructor ((ExprSequence) $3, (ExprSequence) $6);
  2246. }
  2247. ;
  2248. /* -----------------
  2249. Terminal Wrappers
  2250. ----------------- */
  2251. NCName // returns string
  2252. : NCNAME
  2253. ;
  2254. QName // returns XmlQualifiedName. Note that this state is just a wrapper for state transition.
  2255. : QNAME {
  2256. switch (tokenizer.State) {
  2257. case ParseState.Default:
  2258. tokenizer.State = ParseState.Operator;
  2259. break;
  2260. case ParseState.ItemType:
  2261. tokenizer.State = ParseState.OccurenceIndicator;
  2262. break;
  2263. case ParseState.KindTest:
  2264. case ParseState.SchemaContextStep:
  2265. tokenizer.State = ParseState.CloseKindTest;
  2266. break;
  2267. case ParseState.ExtKey:
  2268. tokenizer.State = ParseState.ExprComment;
  2269. break;
  2270. }
  2271. }
  2272. ;
  2273. Slash
  2274. : SLASH {
  2275. switch (tokenizer.State) {
  2276. case ParseState.Operator:
  2277. tokenizer.State = ParseState.Default;
  2278. break;
  2279. case ParseState.KindTest:
  2280. tokenizer.State = ParseState.SchemaContextStep;
  2281. break;
  2282. }
  2283. }
  2284. ;
  2285. Slash2
  2286. : SLASH2 {
  2287. if (tokenizer.State == ParseState.Operator)
  2288. tokenizer.State = ParseState.Default;
  2289. }
  2290. ;
  2291. CloseCurly
  2292. : CLOSE_CURLY {
  2293. if (tokenizer.State == ParseState.Operator)
  2294. tokenizer.PopState ();
  2295. }
  2296. ;
  2297. %%
  2298. }
  2299. #endif