XQueryParser.jay 50 KB

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