XQueryParser.jay 49 KB

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