XQueryParser.jay 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534
  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
  794. : // empty
  795. | ParamList
  796. ;
  797. ParamList // returns XQueryFunctionArgumentList
  798. : Param
  799. {
  800. XQueryFunctionArgumentList pl = new XQueryFunctionArgumentList ();
  801. pl.Add ((XQueryFunctionArgument) $1);
  802. $$ = pl;
  803. }
  804. | Param COMMA ParamList
  805. {
  806. XQueryFunctionArgumentList pl = (XQueryFunctionArgumentList) $3;
  807. pl.Insert (0, (XQueryFunctionArgument) $1);
  808. $$ = pl;
  809. }
  810. ;
  811. Param // returns XQueryFunctionArgument
  812. : DOLLAR {
  813. tokenizer.State = ParseState.VarName;
  814. } VarName {
  815. tokenizer.State = ParseState.Operator;
  816. } OptionalTypeDeclaration
  817. {
  818. $$ = new XQueryFunctionArgument ((XmlQualifiedName) $3, (SequenceType) $5);
  819. }
  820. ;
  821. QueryBody
  822. : Expr
  823. ;
  824. /* --------------------------------------------------------
  825. Expressions
  826. -------------------------------------------------------- */
  827. Expr // returns ExprSequence
  828. : ExprSequence
  829. {
  830. ExprSequence seq = (ExprSequence) $1;
  831. $$ = seq;
  832. }
  833. ;
  834. ExprSequence // returns ExprSequence
  835. : ExprSingle
  836. {
  837. ExprSequence seq = new ExprSequence ();
  838. seq.Add ((ExprSingle) $1);
  839. $$ = seq;
  840. }
  841. | ExprSingle COMMA ExprSequence
  842. {
  843. ExprSequence seq = (ExprSequence) $3;
  844. seq.Insert (0, (ExprSingle) $1);
  845. $$ = seq;
  846. }
  847. ;
  848. ExprSingle // returns ExprSingle
  849. : FLWORExpr
  850. | QuantifiedExpr
  851. | TypeswitchExpr
  852. | IfExpr
  853. | OrExpr
  854. ;
  855. /* -------------------------------------
  856. FLWORExpr
  857. ------------------------------------- */
  858. FLWORExpr // returns FLWORExpr
  859. : RepeatedForLetClause OptionalWhereClause OptionalOrderByClause RETURN {
  860. tokenizer.State = ParseState.Default;
  861. } ExprSingle
  862. {
  863. ForLetClauseCollection col = (ForLetClauseCollection) $1;
  864. $$ = new FLWORExpr (col, (ExprSequence) $2, (OrderSpecList) $3, (ExprSingle) $6);
  865. }
  866. ;
  867. RepeatedForLetClause // returns ForLetClauseCollection
  868. : ForLetClause
  869. {
  870. ForLetClauseCollection col = new ForLetClauseCollection ();
  871. col.Add ((ForLetClause) $1);
  872. $$ = col;
  873. }
  874. | ForLetClause RepeatedForLetClause
  875. {
  876. ForLetClauseCollection col = (ForLetClauseCollection) $2;
  877. col.Insert (0, (ForLetClause) $1);
  878. $$ = col;
  879. }
  880. ;
  881. ForLetClause // returns ForLetClause
  882. : ForClause
  883. | LetClause
  884. ;
  885. OptionalWhereClause // returns ExprSequence or null
  886. : // empty
  887. {
  888. $$ = null;
  889. }
  890. | WhereClause
  891. ;
  892. OptionalOrderByClause
  893. : // empty
  894. {
  895. $$ = null;
  896. }
  897. | OrderByClause
  898. ;
  899. ForClause // returns ForClause
  900. : FOR ForBody
  901. {
  902. ForClause fc = (ForClause) $2;
  903. $$ = fc;
  904. }
  905. ;
  906. ForBody
  907. : ForSingleBody
  908. {
  909. ForClause fc = new ForClause ();
  910. fc.Add ((ForSingleBody) $1);
  911. $$ = fc;
  912. }
  913. | ForSingleBody COMMA ForBody
  914. {
  915. ForClause fc = (ForClause) $3;
  916. fc.Insert (0, (ForSingleBody) $1);
  917. $$ = fc;
  918. }
  919. ;
  920. ForSingleBody // returns ForSingleBody
  921. : DOLLAR {
  922. tokenizer.State = ParseState.VarName;
  923. } VarName {
  924. tokenizer.State = ParseState.Operator;
  925. } OptionalTypeDeclaration OptionalPositionalVar IN {
  926. tokenizer.State = ParseState.Default;
  927. } ExprSingle
  928. {
  929. $$ = new ForSingleBody ((XmlQualifiedName) $3, (SequenceType) $5, (XmlQualifiedName) $6, (ExprSingle) $9);
  930. }
  931. ;
  932. LetClause
  933. : LET LetBody
  934. {
  935. LetClause let = (LetClause) $2;
  936. $$ = let;
  937. }
  938. ;
  939. LetBody
  940. : LetSingleBody
  941. {
  942. LetClause lc = new LetClause ();
  943. lc.Add ((LetSingleBody) $1);
  944. $$ = lc;
  945. }
  946. | LetSingleBody COMMA LetBody
  947. {
  948. LetClause let = (LetClause) $3;
  949. let.Insert (0, (LetSingleBody) $1);
  950. $$ = let;
  951. }
  952. LetSingleBody
  953. : DOLLAR {
  954. tokenizer.State = ParseState.VarName;
  955. } VarName {
  956. tokenizer.State = ParseState.Operator;
  957. } OptionalTypeDeclaration COLON_EQUAL {
  958. tokenizer.State = ParseState.Default;
  959. } ExprSingle
  960. {
  961. $$ = new LetSingleBody ((XmlQualifiedName) $3, (SequenceType) $5, (ExprSingle) $8);
  962. }
  963. ;
  964. OptionalPositionalVar // returns XmlQualifiedName
  965. : // empty
  966. {
  967. $$ = XmlQualifiedName.Empty;
  968. }
  969. | PositionalVar
  970. ;
  971. PositionalVar
  972. : AT {
  973. tokenizer.State = ParseState.Default;
  974. } DOLLAR {
  975. tokenizer.State = ParseState.VarName;
  976. } VarName {
  977. tokenizer.State = ParseState.Operator;
  978. }
  979. {
  980. $$ = $5;
  981. }
  982. ;
  983. WhereClause // returns ExprSequence
  984. : WHERE {
  985. tokenizer.State = ParseState.Default;
  986. } Expr
  987. {
  988. $$ = $3;
  989. }
  990. ;
  991. OrderByClause // returns OrderSpecList
  992. : ORDER BY {
  993. tokenizer.State = ParseState.Default;
  994. } OrderSpecList
  995. {
  996. OrderSpecList l = (OrderSpecList) $4;
  997. $$ = l;
  998. }
  999. | STABLE ORDER BY {
  1000. tokenizer.State = ParseState.Default;
  1001. } OrderSpecList
  1002. {
  1003. OrderSpecList l = (OrderSpecList) $5;
  1004. l.IsStable = true;
  1005. $$ = l;
  1006. }
  1007. ;
  1008. OrderSpecList // returns OrderSpecList
  1009. : OrderSpec
  1010. {
  1011. OrderSpecList osl = new OrderSpecList ();
  1012. osl.Add ((OrderSpec) $1);
  1013. $$ = osl;
  1014. }
  1015. | OrderSpec COMMA OrderSpecList
  1016. {
  1017. OrderSpecList l = (OrderSpecList) $3;
  1018. l.Insert (0, (OrderSpec) $1);
  1019. $$ = l;
  1020. }
  1021. ;
  1022. OrderSpec // returns OrderSpec
  1023. : ExprSingle OrderModifier
  1024. {
  1025. $$ = new OrderSpec ((ExprSingle) $1, (OrderModifier) $2);
  1026. }
  1027. ;
  1028. OrderModifier
  1029. : OrderSpecBase OrderEmptyHandling OptionalCollation
  1030. {
  1031. $$ = new OrderModifier ((XmlSortOrder) $1, (XmlSortOrder) $2, (string) $3);
  1032. }
  1033. ;
  1034. OrderSpecBase // returns XmlSortOrder
  1035. : // empty
  1036. {
  1037. $$ = XmlSortOrder.Ascending;
  1038. }
  1039. | ASCENDING
  1040. {
  1041. $$ = XmlSortOrder.Ascending;
  1042. }
  1043. | DESCENDING
  1044. {
  1045. $$ = XmlSortOrder.Descending;
  1046. }
  1047. ;
  1048. /* FIXME: check if it is correct (especially empty case) */
  1049. OrderEmptyHandling // returns XmlSortOrder
  1050. : // empty
  1051. {
  1052. $$ = XmlSortOrder.Ascending;
  1053. }
  1054. | EMPTY GREATEST
  1055. {
  1056. $$ = XmlSortOrder.Ascending;
  1057. }
  1058. | EMPTY LEAST
  1059. {
  1060. $$ = XmlSortOrder.Descending;
  1061. }
  1062. ;
  1063. OptionalCollation // returns string
  1064. : // empty
  1065. {
  1066. $$ = null;
  1067. }
  1068. | COLLATION STRING_LITERAL
  1069. {
  1070. $$ = $2;
  1071. }
  1072. ;
  1073. /* -------------------------------------
  1074. QuantifiedExpr
  1075. ------------------------------------- */
  1076. QuantifiedExpr
  1077. : SOME QuantifiedExprBody SATISFIES ExprSingle
  1078. {
  1079. QuantifiedExprBodyList l = (QuantifiedExprBodyList) $2;
  1080. $$ = new QuantifiedExpr (false, l, (ExprSingle) $4);
  1081. }
  1082. | EVERY QuantifiedExprBody SATISFIES ExprSingle
  1083. {
  1084. QuantifiedExprBodyList l = (QuantifiedExprBodyList) $2;
  1085. $$ = new QuantifiedExpr (true, l, (ExprSingle) $4);
  1086. }
  1087. ;
  1088. QuantifiedExprBody
  1089. : SingleQuantifiedExprBody
  1090. {
  1091. QuantifiedExprBodyList l = new QuantifiedExprBodyList ();
  1092. l.Add ((QuantifiedExprBody) $1);
  1093. $$ = l;
  1094. }
  1095. | SingleQuantifiedExprBody COMMA QuantifiedExprBody
  1096. {
  1097. QuantifiedExprBodyList l = (QuantifiedExprBodyList) $3;
  1098. l.Insert (0, (QuantifiedExprBody) $1);
  1099. $$ = l;
  1100. }
  1101. ;
  1102. SingleQuantifiedExprBody // returns QuantifiedExprBody
  1103. : DOLLAR {
  1104. tokenizer.State = ParseState.VarName;
  1105. } VarName {
  1106. tokenizer.State = ParseState.Operator;
  1107. } OptionalTypeDeclaration IN {
  1108. tokenizer.State = ParseState.Default;
  1109. } ExprSingle
  1110. {
  1111. $$ = new QuantifiedExprBody ((XmlQualifiedName) $3, (SequenceType) $5, (ExprSingle) $8);
  1112. }
  1113. ;
  1114. /* -------------------------------------
  1115. TypeswitchExpr
  1116. ------------------------------------- */
  1117. TypeswitchExpr // returns TypeswitchExpr
  1118. : TYPESWITCH OPEN_PAREN {
  1119. tokenizer.PushState (ParseState.Operator);
  1120. tokenizer.State = ParseState.Default;
  1121. } Expr CLOSE_PAREN {
  1122. tokenizer.State = ParseState.Operator;
  1123. } RepeatedCaseClause DEFAULT OptionalVarSpec RETURN {
  1124. tokenizer.State = ParseState.Default;
  1125. } ExprSingle
  1126. {
  1127. $$ = new TypeswitchExpr ((ExprSequence) $4, (CaseClauseList) $7, (XmlQualifiedName) $9, (ExprSingle) $12);
  1128. }
  1129. ;
  1130. RepeatedCaseClause // returns CaseClauseList
  1131. : CaseClause
  1132. {
  1133. CaseClauseList ccl = new CaseClauseList ();
  1134. ccl.Add ((CaseClause) $1);
  1135. $$ = ccl;
  1136. }
  1137. | CaseClause RepeatedCaseClause
  1138. {
  1139. CaseClauseList l = (CaseClauseList) $2;
  1140. l.Add ((CaseClause) $1);
  1141. $$ = l;
  1142. }
  1143. ;
  1144. CaseClause // returns CaseClause
  1145. : CASE {
  1146. tokenizer.State = ParseState.ItemType;
  1147. } SequenceType RETURN {
  1148. tokenizer.State = ParseState.Default;
  1149. } ExprSingle
  1150. {
  1151. $$ = new CaseClause ((SequenceType) $3, (ExprSingle) $6, XmlQualifiedName.Empty);
  1152. }
  1153. | CASE {
  1154. tokenizer.State = ParseState.ItemType;
  1155. } DOLLAR {
  1156. tokenizer.State = ParseState.VarName;
  1157. } VarName {
  1158. tokenizer.State = ParseState.Operator;
  1159. } AS {
  1160. tokenizer.State = ParseState.ItemType;
  1161. } SequenceType RETURN {
  1162. tokenizer.State = ParseState.Default;
  1163. } ExprSingle
  1164. {
  1165. $$ = new CaseClause ((SequenceType) $9, (ExprSingle) $12, (XmlQualifiedName) $5);
  1166. }
  1167. ;
  1168. OptionalVarSpec // returns XmlQualifiedName
  1169. : // empty
  1170. {
  1171. $$ = XmlQualifiedName.Empty;
  1172. }
  1173. | DOLLAR VarName
  1174. {
  1175. $$ = (XmlQualifiedName) $2;
  1176. }
  1177. ;
  1178. /* -------------------------------------
  1179. IfExpr
  1180. ------------------------------------- */
  1181. IfExpr
  1182. : IF OPEN_PAREN Expr CLOSE_PAREN {
  1183. tokenizer.State = ParseState.Operator;
  1184. } THEN {
  1185. tokenizer.State = ParseState.Default;
  1186. } ExprSingle ELSE {
  1187. tokenizer.State = ParseState.Default;
  1188. } ExprSingle
  1189. {
  1190. $$ = new IfExpr ((ExprSequence) $3, (ExprSingle) $8, (ExprSingle) $11);
  1191. }
  1192. ;
  1193. /* -------------------------------------
  1194. Logical Expressions
  1195. ------------------------------------- */
  1196. OrExpr
  1197. : AndExpr
  1198. | AndExpr OR {
  1199. tokenizer.State = ParseState.Default;
  1200. } OrExpr
  1201. {
  1202. $$ = new OrExpr ((ExprSingle) $1, (ExprSingle) $4);
  1203. }
  1204. ;
  1205. AndExpr
  1206. : InstanceOfExpr
  1207. | InstanceOfExpr AND {
  1208. tokenizer.State = ParseState.Default;
  1209. } AndExpr
  1210. {
  1211. $$ = new AndExpr ((ExprSingle) $1, (ExprSingle) $4);
  1212. }
  1213. ;
  1214. /* -------------------------------------
  1215. Typed Expressions
  1216. ------------------------------------- */
  1217. InstanceOfExpr
  1218. : TreatExpr
  1219. | TreatExpr INSTANCE OF {
  1220. tokenizer.State = ParseState.ItemType;
  1221. } SequenceType
  1222. {
  1223. $$ = new InstanceOfExpr ((ExprSingle) $1, (SequenceType) $5);
  1224. }
  1225. ;
  1226. TreatExpr
  1227. : CastableExpr
  1228. | CastableExpr TREAT AS {
  1229. tokenizer.State = ParseState.ItemType;
  1230. } SequenceType
  1231. {
  1232. $$ = new TreatExpr ((ExprSingle) $1, (SequenceType) $5);
  1233. }
  1234. ;
  1235. CastableExpr
  1236. : CastExpr
  1237. | CastExpr CASTABLE AS {
  1238. tokenizer.State = ParseState.ItemType;
  1239. } AtomicType OptionalQuestion
  1240. {
  1241. $$ = new CastableExpr ((ExprSingle) $1, (XmlTypeCode) $5, (bool)$6);
  1242. }
  1243. ;
  1244. OptionalQuestion
  1245. : // empty
  1246. {
  1247. $$ = false;
  1248. }
  1249. | QUESTION
  1250. {
  1251. $$ = true;
  1252. }
  1253. ;
  1254. CastExpr
  1255. : ComparisonExpr
  1256. | ComparisonExpr CAST AS {
  1257. tokenizer.State = ParseState.ItemType;
  1258. } AtomicType OptionalQuestion
  1259. {
  1260. $$ = new CastExpr ((ExprSingle) $1, (XmlTypeCode) $5, (bool) $6);
  1261. }
  1262. ;
  1263. /* -------------------------------------
  1264. Comparison Expressions
  1265. ------------------------------------- */
  1266. ComparisonExpr
  1267. : RangeExpr
  1268. | RangeExpr Comp {
  1269. tokenizer.State = ParseState.Default;
  1270. } RangeExpr
  1271. {
  1272. $$ = new ComparisonExpr ((ExprSingle) $1, (ExprSingle) $4, (ComparisonOperator) $2);
  1273. }
  1274. ;
  1275. Comp // returns ComparisonOperator
  1276. : ValueComp
  1277. | GeneralComp
  1278. | NodeComp
  1279. ;
  1280. ValueComp
  1281. : EQ
  1282. {
  1283. $$ = ComparisonOperator.ValueEQ;
  1284. }
  1285. | NE
  1286. {
  1287. $$ = ComparisonOperator.ValueNE;
  1288. }
  1289. | LT
  1290. {
  1291. $$ = ComparisonOperator.ValueLT;
  1292. }
  1293. | LE
  1294. {
  1295. $$ = ComparisonOperator.ValueLE;
  1296. }
  1297. | GT
  1298. {
  1299. $$ = ComparisonOperator.ValueGT;
  1300. }
  1301. | GE
  1302. {
  1303. $$ = ComparisonOperator.ValueGE;
  1304. }
  1305. ;
  1306. GeneralComp
  1307. : EQUAL
  1308. {
  1309. $$ = ComparisonOperator.GeneralEQ;
  1310. }
  1311. | NOT_EQUAL
  1312. {
  1313. $$ = ComparisonOperator.GeneralNE;
  1314. }
  1315. | LESSER
  1316. {
  1317. $$ = ComparisonOperator.GeneralLT;
  1318. }
  1319. | LESSER_EQUAL
  1320. {
  1321. $$ = ComparisonOperator.GeneralLE;
  1322. }
  1323. | GREATER
  1324. {
  1325. $$ = ComparisonOperator.GeneralGT;
  1326. }
  1327. | GREATER_EQUAL
  1328. {
  1329. $$ = ComparisonOperator.GeneralGE;
  1330. }
  1331. ;
  1332. NodeComp
  1333. : IS
  1334. {
  1335. $$ = ComparisonOperator.NodeIs;
  1336. }
  1337. | LESSER2
  1338. {
  1339. $$ = ComparisonOperator.NodeFWD;
  1340. }
  1341. | GREATER2
  1342. {
  1343. $$ = ComparisonOperator.NodeBWD;
  1344. }
  1345. ;
  1346. RangeExpr
  1347. : AdditiveExpr
  1348. | AdditiveExpr TO {
  1349. tokenizer.State = ParseState.Default;
  1350. } AdditiveExpr
  1351. {
  1352. $$ = new RangeExpr ((ExprSingle) $1, (ExprSingle)$4);
  1353. }
  1354. ;
  1355. /* -------------------------------------
  1356. Arithmetic Expressions
  1357. ------------------------------------- */
  1358. AdditiveExpr
  1359. : MultiplicativeExpr
  1360. | MultiplicativeExpr PLUS {
  1361. tokenizer.State = ParseState.Default;
  1362. } AdditiveExpr
  1363. {
  1364. $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Plus);
  1365. }
  1366. | MultiplicativeExpr MINUS {
  1367. tokenizer.State = ParseState.Default;
  1368. } AdditiveExpr
  1369. {
  1370. $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Minus);
  1371. }
  1372. ;
  1373. MultiplicativeExpr
  1374. : UnaryExpr
  1375. | UnaryExpr ASTERISK {
  1376. tokenizer.State = ParseState.Default;
  1377. } MultiplicativeExpr
  1378. {
  1379. $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Mul);
  1380. }
  1381. | UnaryExpr DIV {
  1382. tokenizer.State = ParseState.Default;
  1383. } MultiplicativeExpr
  1384. {
  1385. $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.Div);
  1386. }
  1387. | UnaryExpr IDIV {
  1388. tokenizer.State = ParseState.Default;
  1389. } MultiplicativeExpr
  1390. {
  1391. $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.IDiv);
  1392. }
  1393. | UnaryExpr MOD {
  1394. tokenizer.State = ParseState.Default;
  1395. } MultiplicativeExpr
  1396. {
  1397. $$ = new ArithmeticOperationExpr ((ExprSingle) $1, (ExprSingle) $4, ArithmeticOperator.IMod);
  1398. }
  1399. ;
  1400. UnaryExpr
  1401. : UnionExpr
  1402. | MINUS UnionExpr
  1403. {
  1404. $$ = new MinusExpr ((ExprSingle) $2);
  1405. }
  1406. | PLUS UnionExpr
  1407. {
  1408. $$ = $2;
  1409. }
  1410. ;
  1411. UnionExpr
  1412. : IntersectExceptExpr
  1413. | IntersectExceptExpr UNION {
  1414. tokenizer.State = ParseState.Default;
  1415. } UnionExpr
  1416. {
  1417. $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Union);
  1418. }
  1419. | IntersectExceptExpr BAR {
  1420. tokenizer.State = ParseState.Default;
  1421. } UnionExpr
  1422. {
  1423. $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Union);
  1424. }
  1425. ;
  1426. IntersectExceptExpr
  1427. : ValueExpr
  1428. | ValueExpr INTERSECT {
  1429. tokenizer.State = ParseState.Default;
  1430. } IntersectExceptExpr
  1431. {
  1432. $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Intersect);
  1433. }
  1434. | ValueExpr EXCEPT {
  1435. tokenizer.State = ParseState.Default;
  1436. } IntersectExceptExpr
  1437. {
  1438. $$ = new GroupExpr ((ExprSingle) $1, (ExprSingle) $4, AggregationType.Except);
  1439. }
  1440. ;
  1441. ValueExpr
  1442. : ValidateExpr
  1443. | PathExpr
  1444. ;
  1445. /* -----------------
  1446. Validation Expressions
  1447. ----------------- */
  1448. // FIXME: Here state transition is not well-tracked.
  1449. ValidateExpr // returns ValidateExpr
  1450. : VALIDATE OptionalValidationMode OPEN_CURLY {
  1451. tokenizer.State = ParseState.Default;
  1452. tokenizer.PushState (ParseState.Operator);
  1453. } Expr CloseCurly
  1454. {
  1455. $$ = new ValidateExpr ((XmlSchemaContentProcessing) $2, (ExprSequence) $6);
  1456. }
  1457. ;
  1458. OptionalValidationMode // returns XmlSchemaContentProcessing
  1459. : // empty
  1460. {
  1461. $$ = XmlSchemaContentProcessing.Strict; // FIXME: confirm
  1462. }
  1463. | LAX
  1464. {
  1465. $$ = XmlSchemaContentProcessing.Lax;
  1466. }
  1467. | STRICT
  1468. {
  1469. $$ = XmlSchemaContentProcessing.Strict;
  1470. }
  1471. ;
  1472. /* -----------------
  1473. Path Expressions
  1474. ----------------- */
  1475. PathExpr // returns PathExpr
  1476. : Slash
  1477. {
  1478. $$ = new PathRootExpr ();
  1479. }
  1480. | Slash RelativePathExpr
  1481. {
  1482. $$ = new PathChildExpr (new PathRootExpr (), (ExprSingle) $2);
  1483. }
  1484. | Slash2 RelativePathExpr
  1485. {
  1486. $$ = new PathDescendantExpr (new PathRootExpr (), (ExprSingle) $2);
  1487. }
  1488. | RelativePathExpr
  1489. ;
  1490. RelativePathExpr // returns PathExpr
  1491. : StepExpr
  1492. | StepExpr Slash RelativePathExpr
  1493. {
  1494. $$ = new PathChildExpr ((ExprSingle) $1, (ExprSingle) $3);
  1495. }
  1496. | StepExpr Slash2 RelativePathExpr
  1497. {
  1498. $$ = new PathDescendantExpr ((ExprSingle) $1, (ExprSingle) $3);
  1499. }
  1500. ;
  1501. StepExpr // returns ExprSingle
  1502. : AxisStep
  1503. | FilterStep
  1504. ;
  1505. AxisStep // returns PathExpr
  1506. : ForwardOrReverseStep Predicates
  1507. {
  1508. PredicateList p = (PredicateList) $2;
  1509. if (p == null)
  1510. $$ = $1;
  1511. else
  1512. $$ = new FilterStepExpr ((ExprSingle) $1, (PredicateList) $2);
  1513. }
  1514. ;
  1515. ForwardOrReverseStep // returns ExprSingle
  1516. : ForwardStep
  1517. | ReverseStep
  1518. ;
  1519. FilterStep // returns ExprSingle
  1520. : PrimaryExpr Predicates
  1521. {
  1522. if ($2 == null)
  1523. $$ = (ExprSingle) $1;
  1524. else
  1525. $$ = new FilterStepExpr ((ExprSingle) $1, (PredicateList) $2);
  1526. }
  1527. ;
  1528. ForwardStep // returns AxisStepExpr
  1529. : ForwardAxis NodeTest
  1530. {
  1531. $$ = new AxisStepExpr ((XPathAxis) $1, (XPath2NodeTest) $2);
  1532. }
  1533. | AbbrevForwardStep
  1534. ;
  1535. ReverseStep // returns AxisStepExpr
  1536. : ReverseAxis NodeTest
  1537. {
  1538. $$ = new AxisStepExpr ((XPathAxis) $1, (XPath2NodeTest) $2);
  1539. }
  1540. | AbbrevReverseStep
  1541. ;
  1542. ForwardAxis // returns XPathAxis
  1543. : CHILD COLON2
  1544. {
  1545. $$ = XPathAxis.Child;
  1546. }
  1547. | DESCENDANT COLON2
  1548. {
  1549. $$ = XPathAxis.Descendant;
  1550. }
  1551. | ATTRIBUTE COLON2
  1552. {
  1553. $$ = XPathAxis.Attribute;
  1554. }
  1555. | SELF COLON2
  1556. {
  1557. $$ = XPathAxis.Self;
  1558. }
  1559. | DESCENDANT_OR_SELF COLON2
  1560. {
  1561. $$ = XPathAxis.DescendantOrSelf;
  1562. }
  1563. | FOLLOWING_SIBLING COLON2
  1564. {
  1565. $$ = XPathAxis.FollowingSibling;
  1566. }
  1567. | FOLLOWING COLON2
  1568. {
  1569. $$ = XPathAxis.Following;
  1570. }
  1571. ;
  1572. ReverseAxis // returns XPathAxis
  1573. : PARENT COLON2
  1574. {
  1575. $$ = XPathAxis.Parent;
  1576. }
  1577. | ANCESTOR COLON2
  1578. {
  1579. $$ = XPathAxis.Ancestor;
  1580. }
  1581. | PRECEDING_SIBLING COLON2
  1582. {
  1583. $$ = XPathAxis.PrecedingSibling;
  1584. }
  1585. | PRECEDING COLON2
  1586. {
  1587. $$ = XPathAxis.Preceding;
  1588. }
  1589. | ANCESTOR_OR_SELF COLON2
  1590. {
  1591. $$ = XPathAxis.AncestorOrSelf;
  1592. }
  1593. ;
  1594. // LAMESPEC: in the XQuery spec, it is "@? NodeTest", but NodeKindTest
  1595. // should not appear after AT. (imagine @processing-instruction::(name)).
  1596. AbbrevForwardStep // returns NodeTestExpr
  1597. : NodeTest
  1598. {
  1599. $$ = new AxisStepExpr (XPathAxis.Child, (XPath2NodeTest) $1);
  1600. }
  1601. | AT NameTest
  1602. {
  1603. $$ = new AxisStepExpr (XPathAxis.Attribute, new XPath2NodeTest ((XmlQualifiedName) $2));
  1604. }
  1605. ;
  1606. AbbrevReverseStep // returns AxisStepExpr
  1607. : DOT2
  1608. {
  1609. $$ = AxisStepExpr.ParentStep;
  1610. }
  1611. ;
  1612. Predicates // returns PredicateList or null
  1613. : // empty
  1614. {
  1615. $$ = null;
  1616. }
  1617. | OPEN_BRACKET Expr CLOSE_BRACKET {
  1618. tokenizer.State = ParseState.Operator;
  1619. } Predicates
  1620. {
  1621. PredicateList l = (PredicateList) $5;
  1622. if (l == null)
  1623. l = new PredicateList ();
  1624. l.Insert (0, (ExprSequence) $2);
  1625. $$ = l;
  1626. }
  1627. ;
  1628. NodeTest // returns NodeTest
  1629. : KindTest
  1630. {
  1631. $$ = new XPath2NodeTest ((KindTest) $1);
  1632. }
  1633. | NameTest
  1634. {
  1635. $$ = new XPath2NodeTest ((XmlQualifiedName) $1);
  1636. }
  1637. ;
  1638. NameTest // returns XmlQualifiedName
  1639. : QName
  1640. | Wildcard {
  1641. tokenizer.State = ParseState.Operator;
  1642. }
  1643. ;
  1644. Wildcard // returns XmlQualifiedName /*ws:explicit*/
  1645. : ASTERISK
  1646. {
  1647. $$ = new XmlQualifiedName ("*", "*");
  1648. }
  1649. | WILD_LOCALNAME
  1650. {
  1651. $$ = (XmlQualifiedName) $1;
  1652. }
  1653. | WILD_PREFIX
  1654. {
  1655. $$ = (XmlQualifiedName) $1;
  1656. }
  1657. ;
  1658. AtomicType // returns XmlTypeCode
  1659. : QName
  1660. {
  1661. $$ = GetAtomicTypeCode ((XmlQualifiedName) $1);
  1662. }
  1663. ;
  1664. ItemType // returns ItemType
  1665. : AtomicType {
  1666. tokenizer.State = ParseState.OccurenceIndicator;
  1667. }
  1668. {
  1669. $$ = new ItemType ((XmlTypeCode) $1);
  1670. }
  1671. | KindTest
  1672. | ITEM OPEN_PAREN CLOSE_PAREN {
  1673. tokenizer.State = ParseState.OccurenceIndicator;
  1674. }
  1675. {
  1676. $$ = new ItemType (XmlTypeCode.Item);
  1677. }
  1678. ;
  1679. KindTest // returns KindTest
  1680. : DocumentTest
  1681. | ElementTest
  1682. | AttributeTest
  1683. | PITest
  1684. | CommentTest
  1685. | TextTest
  1686. | AnyKindTest
  1687. ;
  1688. PITest
  1689. : PROCESSING_INSTRUCTION OPEN_PAREN {
  1690. // LAMESPEC: push state is described as Operator, but should
  1691. // be OccurenceIndicator (as any KindTest could be followed by
  1692. // '?' '+' or '*')
  1693. tokenizer.PushState (ParseState.OccurenceIndicator);
  1694. tokenizer.State = ParseState.KindTestForPI;
  1695. } PITestContent CLOSE_PAREN {
  1696. tokenizer.PopState ();
  1697. }
  1698. {
  1699. $$ = $4;
  1700. }
  1701. ;
  1702. PITestContent // returns KindTest
  1703. : // empty
  1704. {
  1705. $$ = new KindTest (XmlTypeCode.ProcessingInstruction);
  1706. }
  1707. | NCName
  1708. {
  1709. $$ = new XmlPITest ((string) $1);
  1710. }
  1711. | STRING_LITERAL
  1712. {
  1713. $$ = new XmlPITest ((string) $1);
  1714. }
  1715. ;
  1716. CommentTest
  1717. : COMMENT OPEN_PAREN {
  1718. tokenizer.PushState (ParseState.OccurenceIndicator);
  1719. tokenizer.State = ParseState.KindTest;
  1720. } CLOSE_PAREN {
  1721. tokenizer.PopState ();
  1722. }
  1723. {
  1724. $$ = new KindTest (XmlTypeCode.Comment);
  1725. }
  1726. ;
  1727. TextTest
  1728. : TEXT OPEN_PAREN {
  1729. tokenizer.PushState (ParseState.OccurenceIndicator);
  1730. tokenizer.State = ParseState.KindTest;
  1731. } CLOSE_PAREN {
  1732. tokenizer.PopState ();
  1733. }
  1734. {
  1735. $$ = new KindTest (XmlTypeCode.Text);
  1736. }
  1737. ;
  1738. AnyKindTest
  1739. : NODE OPEN_PAREN {
  1740. tokenizer.PushState (ParseState.OccurenceIndicator);
  1741. tokenizer.State = ParseState.KindTest;
  1742. } CLOSE_PAREN {
  1743. tokenizer.PopState ();
  1744. }
  1745. {
  1746. $$ = new KindTest (XmlTypeCode.Node);
  1747. }
  1748. ;
  1749. DocumentTest // returns DocumentTest
  1750. : DOCUMENT_NODE OPEN_PAREN {
  1751. tokenizer.PushState (ParseState.OccurenceIndicator);
  1752. tokenizer.State = ParseState.KindTest;
  1753. } DocumentTestContent CLOSE_PAREN {
  1754. tokenizer.PopState ();
  1755. }
  1756. {
  1757. $$ = $4;
  1758. }
  1759. ;
  1760. DocumentTestContent // returns DocumentTest
  1761. : // empty
  1762. {
  1763. $$ = new KindTest (XmlTypeCode.Document);
  1764. }
  1765. | ElementTest
  1766. {
  1767. $$ = new DocumentTest ((ElementTest) $1);
  1768. }
  1769. ;
  1770. ElementTest // returns ElementTest
  1771. : ELEMENT OPEN_PAREN {
  1772. tokenizer.PushState (ParseState.OccurenceIndicator);
  1773. tokenizer.State = ParseState.KindTest;
  1774. } ElementTestContent CLOSE_PAREN {
  1775. tokenizer.PopState ();
  1776. }
  1777. {
  1778. $$ = $4;
  1779. }
  1780. ;
  1781. ElementTestContent // returns ElementTest
  1782. : // empty
  1783. {
  1784. $$ = new KindTest (XmlTypeCode.Element);
  1785. }
  1786. | ElementNameOrWildcard
  1787. {
  1788. $$ = new ElementTest ((XmlQualifiedName) $1);
  1789. }
  1790. | ElementNameOrWildcard COMMA TypeName OptionalQuestion
  1791. {
  1792. $$ = new ElementTest ((XmlQualifiedName) $1, (XmlQualifiedName) $3, (bool) $4);
  1793. }
  1794. ;
  1795. OptionalQuestion // returns bool
  1796. : // empty
  1797. {
  1798. $$ = false;
  1799. }
  1800. | QUESTION
  1801. {
  1802. $$ = true;
  1803. }
  1804. ;
  1805. AttributeTest // returns AttributeTest
  1806. : ATTRIBUTE OPEN_PAREN {
  1807. tokenizer.PushState (ParseState.OccurenceIndicator);
  1808. tokenizer.State = ParseState.KindTest;
  1809. } AttributeTestContent CLOSE_PAREN {
  1810. tokenizer.PopState ();
  1811. }
  1812. {
  1813. $$ = $4;
  1814. }
  1815. ;
  1816. AttributeTestContent // returns AttributeTest
  1817. : // empty
  1818. {
  1819. $$ = AttributeTest.AnyAttribute;
  1820. }
  1821. | AttributeNameOrWildcard
  1822. {
  1823. $$ = new AttributeTest ((XmlQualifiedName) $1);
  1824. }
  1825. | AttributeNameOrWildcard COMMA TypeNameOrWildcard
  1826. {
  1827. $$ = new AttributeTest ((XmlQualifiedName) $1, (XmlQualifiedName) $3);
  1828. }
  1829. ;
  1830. ElementName
  1831. : QName
  1832. ;
  1833. AttributeName
  1834. : QName
  1835. ;
  1836. TypeName
  1837. : QName
  1838. ;
  1839. ElementNameOrWildcard // returns XmlQualifiedName
  1840. : ElementName
  1841. | ASTERISK
  1842. {
  1843. $$ = new XmlQualifiedName ("*", "*");
  1844. }
  1845. ;
  1846. AttributeNameOrWildcard // returns XmlQualifiedName
  1847. : AttributeName
  1848. | ASTERISK
  1849. {
  1850. $$ = new XmlQualifiedName ("*", "*");
  1851. }
  1852. ;
  1853. TypeNameOrWildcard // returns XmlQualifiedName
  1854. : TypeName
  1855. | ASTERISK
  1856. {
  1857. $$ = new XmlQualifiedName ("*", "*");
  1858. }
  1859. ;
  1860. /* ----------------
  1861. Primary Expressions
  1862. ---------------- */
  1863. PrimaryExpr // returns ExprSingle
  1864. : Literal {
  1865. tokenizer.State = ParseState.Operator;
  1866. }
  1867. | VarRef
  1868. | ParenthesizedExpr
  1869. | ContextItemExpr
  1870. | FunctionCall
  1871. | Constructor
  1872. | OrderedExpr
  1873. | UnorderedExpr
  1874. ;
  1875. Literal
  1876. : DECIMAL_LITERAL
  1877. {
  1878. $$ = new DecimalLiteralExpr ((decimal) $1);
  1879. }
  1880. | DOUBLE_LITERAL
  1881. {
  1882. $$ = new DoubleLiteralExpr ((double) $1);
  1883. }
  1884. | STRING_LITERAL
  1885. {
  1886. $$ = new StringLiteralExpr ((string) $1);
  1887. }
  1888. ;
  1889. /*
  1890. NUMERIC_LITERAL
  1891. : IntegerLiteral
  1892. | DecimalLiteral
  1893. | DoubleLiteral
  1894. ;
  1895. IntegerLiteral
  1896. : Digits
  1897. ;
  1898. DecimalLiteral
  1899. : DOT Digits
  1900. | Digits DOT OptDigits
  1901. ;
  1902. DoubleLiteral
  1903. : DoubleDecimalPartSpec ExponentSpec
  1904. ;
  1905. DoubleDecimalPartSpec
  1906. : DOT Digits
  1907. | Digits
  1908. | Digits DOT OptDigits
  1909. ExponentSpec
  1910. : // empty/*
  1911. | ExponentAlpha Digits
  1912. | ExponentAlpha PLUS Digits
  1913. | ExponentAlpha MINUS Digits
  1914. ;
  1915. ExponentAlpha
  1916. : LARGE_E
  1917. | SMALL_E
  1918. ;
  1919. OptDigits
  1920. : // empty/*
  1921. | Digits
  1922. ;
  1923. Digits
  1924. : ZERO_TO_NINE_SEQ
  1925. ;
  1926. STRING_LITERAL
  1927. : QUOT STRING_LITERALContentQuot
  1928. | APOS STRING_LITERALContentApos
  1929. ;
  1930. STRING_LITERALContentQuot
  1931. : PREDEFINED_ENTITY_REF
  1932. | CHAR_REF
  1933. | QUOT2
  1934. | REMAINING_LITERAL
  1935. ;
  1936. STRING_LITERALContentApos
  1937. : PREDEFINED_ENTITY_REF
  1938. | CHAR_REF
  1939. | APOS2
  1940. | REMAINING_LITERAL
  1941. ;
  1942. */
  1943. VarRef // returns VariableReferenceExpr
  1944. : DOLLAR {
  1945. tokenizer.State = ParseState.VarName;
  1946. } VarName
  1947. {
  1948. $$ = new VariableReferenceExpr ((XmlQualifiedName) $3);
  1949. }
  1950. ;
  1951. VarName // returns XmlQualifiedName
  1952. : QName {
  1953. tokenizer.State = ParseState.Operator;
  1954. }
  1955. {
  1956. $$ = $1;
  1957. }
  1958. ;
  1959. ParenthesizedExpr // returns ParenthesizedExpr
  1960. : OPEN_PAREN OptionalExpr CLOSE_PAREN {
  1961. tokenizer.State = ParseState.Operator;
  1962. }
  1963. {
  1964. $$ = new ParenthesizedExpr ((ExprSequence) $2);
  1965. }
  1966. ;
  1967. OptionalExpr
  1968. : // empty
  1969. {
  1970. $$ = new ExprSequence ();
  1971. }
  1972. | Expr
  1973. ;
  1974. ContextItemExpr // returns ContextItemExpr
  1975. : DOT {
  1976. tokenizer.State = ParseState.Operator;
  1977. }
  1978. {
  1979. $$ = new ContextItemExpr ();
  1980. }
  1981. ;
  1982. FunctionCall
  1983. : QName OPEN_PAREN {
  1984. tokenizer.State = ParseState.Default;
  1985. } OptionalExpr CLOSE_PAREN {
  1986. tokenizer.State = ParseState.Operator;
  1987. }
  1988. {
  1989. XmlQualifiedName name = (XmlQualifiedName) $1;
  1990. if (name.Namespace == "")
  1991. name = new XmlQualifiedName (name.Name, tokenizer.DefaultFunctionNamespace);
  1992. if (name.Namespace != ""
  1993. && name.Namespace != XmlSchema.XdtNamespace
  1994. && reservedFunctionNames [name.Name] != null)
  1995. throw new XmlQueryCompileException (String.Format ("'{0}' is reserved and cannot be used as a function name.", name.Name));
  1996. $$ = new FunctionCallExpr (name, (ExprSequence) $4);
  1997. }
  1998. ;
  1999. OrderedExpr
  2000. : ORDERED OPEN_BRACKET Expr CLOSE_BRACKET
  2001. {
  2002. $$ = new OrderSpecifiedExpr ((ExprSequence) $3, true);
  2003. }
  2004. ;
  2005. UnorderedExpr
  2006. : UNORDERED OPEN_BRACKET {
  2007. tokenizer.PushState (ParseState.Operator);
  2008. tokenizer.State = ParseState.Default;
  2009. } Expr CLOSE_BRACKET {
  2010. tokenizer.PopState ();
  2011. }
  2012. {
  2013. $$ = new OrderSpecifiedExpr ((ExprSequence) $4, false);
  2014. }
  2015. ;
  2016. /* -----------------
  2017. Constructors
  2018. ----------------- */
  2019. Constructor // returns ExprSingle
  2020. : DirElemConstructor
  2021. | ComputedConstructor
  2022. | XmlComment
  2023. | XmlPI
  2024. | XmlCData
  2025. ;
  2026. DirElemConstructor // returns XmlElemConstructor
  2027. : LESSER {
  2028. if (tokenizer.State == ParseState.ElementContent)
  2029. tokenizer.PushState (tokenizer.State);
  2030. // if (tokenizer.State == ParseState.Default)
  2031. else // considering <foo></foo><bar></bar> there after </foo> state is Operator.
  2032. tokenizer.PushState (ParseState.Operator);
  2033. tokenizer.State = ParseState.StartTag;
  2034. // FIXME: tokenizer.Space = WhitespaceHandling.Significant;
  2035. } QName AttributeList FollowDirElemConstructor {
  2036. tokenizer.PopState ();
  2037. }
  2038. {
  2039. ExprSequence expr = new ExprSequence ();
  2040. expr.AddRange ((ICollection) $4);
  2041. expr.AddRange ((ICollection) $5);
  2042. $$ = new XmlElemConstructor ((XmlQualifiedName) $3, expr);
  2043. }
  2044. ;
  2045. FollowDirElemConstructor // returns ExprSequence
  2046. : EMPTY_TAG_CLOSE
  2047. {
  2048. $$ = new ExprSequence ();
  2049. }
  2050. | GREATER {
  2051. tokenizer.State = ParseState.ElementContent;
  2052. } ElementContentList END_TAG_START {
  2053. tokenizer.State = ParseState.EndTag;
  2054. } QName {
  2055. tokenizer.Space = WhitespaceHandling.Arbitrary;
  2056. } GREATER
  2057. {
  2058. $$ = $3;
  2059. }
  2060. ;
  2061. ElementContentList // returns ExprSequence
  2062. : // empty
  2063. {
  2064. $$ = new ExprSequence ();
  2065. }
  2066. | ElementContent ElementContentList
  2067. {
  2068. ExprSequence el = (ExprSequence) $2;
  2069. el.Insert (0, (ExprSingle) $1);
  2070. $$ = el;
  2071. }
  2072. ;
  2073. AttributeList // returns XmlAttrConstructorList
  2074. : // empty
  2075. {
  2076. $$ = new XmlAttrConstructorList ();
  2077. }
  2078. | /* space */ Attribute AttributeList
  2079. {
  2080. XmlAttrConstructorList al = (XmlAttrConstructorList) $2;
  2081. al.Insert (0, (XmlAttrConstructor) $1);
  2082. $$ = al;
  2083. }
  2084. ;
  2085. Attribute // returns XmlAttrConstructor
  2086. : QName EQUAL AttributeValue /* note: whitespace handling */
  2087. {
  2088. $$ = new XmlAttrConstructor ((XmlQualifiedName) $1, (ExprSequence) $3);
  2089. }
  2090. ;
  2091. // FIXME: it should be more complex
  2092. AttributeValue
  2093. : STRING_LITERAL
  2094. {
  2095. ExprSequence es = new ExprSequence ();
  2096. es.Insert (0, new StringLiteralExpr ((string) $1));
  2097. $$ = es;
  2098. }
  2099. ;
  2100. /*
  2101. AttributeValue // returns ExprSequence
  2102. : QUOT AttributeValueContentSequence QUOT
  2103. {
  2104. $$ = $2;
  2105. }
  2106. | APOS AttributeValueContentSequence APOS
  2107. {
  2108. $$ = $2;
  2109. }
  2110. ;
  2111. AttributeValueContentSequence // returns ExprSequence
  2112. : // empty
  2113. {
  2114. $$ = new ExprSequence ();
  2115. }
  2116. | AttributeValueContent AttributeValueContentSequence
  2117. {
  2118. ExprSequence es = (ExprSequence) $2;
  2119. es.Insert (0, (ExprSingle) $1);
  2120. $$ = es;
  2121. }
  2122. ;
  2123. AttributeValueContent // returns ExprSingle
  2124. : ATT_VALUE_LITERAL // including "{{", "}}" and char/predefined entities
  2125. {
  2126. $$ = new ExprLiteral ((string) $1);
  2127. }
  2128. | EnclosedExpr
  2129. ;
  2130. */
  2131. EnclosedExpr // returns EnclosedExpr
  2132. // FIXME: check if this state transition is valid for ElementContent and AttributeValueContent
  2133. : OPEN_CURLY {
  2134. if (tokenizer.State == ParseState.ElementContent)
  2135. tokenizer.PushState (tokenizer.State);
  2136. tokenizer.State = ParseState.Default;
  2137. } Expr CloseCurly
  2138. {
  2139. $$ = new EnclosedExpr ((ExprSequence) $3);
  2140. }
  2141. ;
  2142. ElementContent // returns ExprSingle
  2143. : ELEM_CONTENT_LITERAL // including "{{", "}}" and char/predefined entities
  2144. {
  2145. $$ = new XmlTextConstructor ((string) $1);
  2146. }
  2147. | DirElemConstructor
  2148. | EnclosedExpr
  2149. | XmlCData
  2150. | XmlComment
  2151. | XmlPI
  2152. ;
  2153. XmlCData
  2154. : XML_CDATA_START XML_CDATA_TO_END
  2155. {
  2156. $$ = new XmlTextConstructor ((string) $2);
  2157. }
  2158. ;
  2159. XmlComment // returns XmlCommentConstructor
  2160. : XML_COMMENT_START XML_COMMENT_TO_END
  2161. {
  2162. $$ = new XmlCommentConstructor ((string) $2);
  2163. }
  2164. ;
  2165. XmlPI // returns XmlPIConstructor
  2166. : XML_PI_START {
  2167. tokenizer.PushState (tokenizer.State);
  2168. tokenizer.State = ParseState.XmlPI;
  2169. } PITarget {
  2170. tokenizer.State = ParseState.XmlPIContent;
  2171. } XML_PI_TO_END {
  2172. tokenizer.PopState ();
  2173. }
  2174. {
  2175. string name = (string) $3;
  2176. $$ = new XmlPIConstructor (name, (string) $5);
  2177. }
  2178. ;
  2179. PITarget
  2180. : NCName
  2181. ;
  2182. ComputedConstructor // returns ExprSingle
  2183. : CompElemConstructor
  2184. | CompAttrConstructor
  2185. | CompDocConstructor
  2186. | CompTextConstructor
  2187. | CompXmlPI
  2188. | CompXmlComment
  2189. | CompNSConstructor
  2190. ;
  2191. CompElemConstructor
  2192. : ELEMENT QName OPEN_CURLY Expr CloseCurly
  2193. {
  2194. $$ = new XmlElemConstructor ((XmlQualifiedName) $2, (ExprSequence) $4);
  2195. }
  2196. | ELEMENT OPEN_CURLY Expr CloseCurly OPEN_CURLY Expr CloseCurly
  2197. {
  2198. $$ = new XmlElemConstructor ((ExprSequence) $3, (ExprSequence) $6);
  2199. }
  2200. ;
  2201. CompAttrConstructor
  2202. : ATTRIBUTE QName OPEN_CURLY Expr CloseCurly
  2203. {
  2204. $$ = new XmlAttrConstructor ((XmlQualifiedName) $2, (ExprSequence) $4);
  2205. }
  2206. | ATTRIBUTE OPEN_CURLY Expr CloseCurly OPEN_CURLY Expr CloseCurly
  2207. {
  2208. $$ = new XmlAttrConstructor ((ExprSequence) $3, (ExprSequence) $6);
  2209. }
  2210. ;
  2211. CompNSConstructor
  2212. : NAMESPACE NCName OPEN_CURLY Expr CloseCurly
  2213. {
  2214. $$ = new XmlNSConstructor ((string) $2, (ExprSequence) $4);
  2215. }
  2216. ;
  2217. CompDocConstructor
  2218. : DOCUMENT OPEN_CURLY Expr CloseCurly
  2219. {
  2220. $$ = new XmlDocConstructor ((ExprSequence) $3);
  2221. }
  2222. ;
  2223. CompTextConstructor
  2224. : TEXT OPEN_CURLY Expr CloseCurly
  2225. {
  2226. $$ = new XmlTextConstructor ((ExprSequence) $3);
  2227. }
  2228. ;
  2229. CompXmlComment
  2230. : COMMENT OPEN_CURLY Expr CloseCurly
  2231. {
  2232. $$ = new XmlCommentConstructor ((ExprSequence) $3);
  2233. }
  2234. ;
  2235. CompXmlPI
  2236. : PROCESSING_INSTRUCTION NCName OPEN_CURLY Expr CloseCurly
  2237. {
  2238. $$ = new XmlPIConstructor ((string) $2, (ExprSequence) $4);
  2239. }
  2240. | PROCESSING_INSTRUCTION OPEN_CURLY Expr CloseCurly OPEN_CURLY Expr CloseCurly
  2241. {
  2242. $$ = new XmlPIConstructor ((ExprSequence) $3, (ExprSequence) $6);
  2243. }
  2244. ;
  2245. /* -----------------
  2246. Terminal Wrappers
  2247. ----------------- */
  2248. NCName // returns string
  2249. : NCNAME
  2250. ;
  2251. QName // returns XmlQualifiedName. Note that this state is just a wrapper for state transition.
  2252. : QNAME {
  2253. switch (tokenizer.State) {
  2254. case ParseState.Default:
  2255. tokenizer.State = ParseState.Operator;
  2256. break;
  2257. case ParseState.ItemType:
  2258. tokenizer.State = ParseState.OccurenceIndicator;
  2259. break;
  2260. case ParseState.KindTest:
  2261. case ParseState.SchemaContextStep:
  2262. tokenizer.State = ParseState.CloseKindTest;
  2263. break;
  2264. case ParseState.ExtKey:
  2265. tokenizer.State = ParseState.ExprComment;
  2266. break;
  2267. }
  2268. }
  2269. ;
  2270. Slash
  2271. : SLASH {
  2272. switch (tokenizer.State) {
  2273. case ParseState.Operator:
  2274. tokenizer.State = ParseState.Default;
  2275. break;
  2276. case ParseState.KindTest:
  2277. tokenizer.State = ParseState.SchemaContextStep;
  2278. break;
  2279. }
  2280. }
  2281. ;
  2282. Slash2
  2283. : SLASH2 {
  2284. if (tokenizer.State == ParseState.Operator)
  2285. tokenizer.State = ParseState.Default;
  2286. }
  2287. ;
  2288. CloseCurly
  2289. : CLOSE_CURLY {
  2290. if (tokenizer.State == ParseState.Operator)
  2291. tokenizer.PopState ();
  2292. }
  2293. ;
  2294. %%
  2295. }
  2296. #endif