finished basic account add
[Bookkeeping.git] / cc / xpath.sablecc
blobcdb21884e5e375a5a1301e89f79834ffd8b43981
1 Package com.interrupt.cc.xpath; \r
2 \r
3  /* \r
4  author: Timothy Washington\r
5  email twashing [at] gmail.com\r
6  \r
7  license: \r
8         Copyright (c) 2008, Tim Washington\r
9         All rights reserved.\r
10         \r
11         Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\r
12         \r
13             * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\r
14             * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\r
15             * Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\r
16         \r
17         THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
19  \r
20  -----------\r
21  declare namespace xq='http://xmlbeans.apache.org/samples/xquery/employees'; \r
22  $this/xq:employees/xq:employee/xq:phone[contains(., '(206)')]\r
24  ./child::node()[1]/attribute::name\r
25          *) Find value of the name attribute of the first element in the XMl document \r
26          1) The first section is only a dot (.). A dot at the start of a query means you want to start your search from the beginning of the XMl document.\r
27          2) The second section (child::node()[1]) says: Find the first child element node. The combined effect of the first and second portions (./child::node()[1]) is like saying: Find the first element of this XMl document.\r
28          3) The third section (attribute::name) says: Find the value of an attribute name. The combined effect of the query is like saying: .\r
30  ./child::node()[1]/child::service/child::port/child::soap:address/attribute::location\r
31          *) Find the first child node of the XMl document, then find a service child element within the first child, then find a port element inside the service element, then look inside the port element for an address element that belongs to the sOAP namespace and return the value of its location attribute. \r
33 -----------\r
36 --> Expression tests\r
37 //system/bookkeeping\r
38 /system/bookkeeping\r
39 system/bookkeeping\r
40 ./child::node()\r
43 --> forward axis \r
44 descendant::node() \r
45 attribute::attribute() \r
46 ./self::element() \r
47 /descendant-or-self::element() \r
48 //following-sibling::node() \r
49 following::element() \r
50 namespace::node() \r
53 --> reverse axis \r
54 parent::node() \r
55 ancestor::node() \r
56 preceding-sibling::node() \r
57 preceding::node() \r
58 ancestor-or-self::node() \r
61 --> predicates \r
62 ./child::node()[ @asdf='' ]\r
63 ./child::node()/child::service/child::port/child::soap:address/attribute::location\r
64 ./child::node()[]/child::service/child::port/child::soap:address/attribute::location\r
65 ./child::node()[ @name='tim' ] \r
66 ./child::node()[ 1 ]\r
67 ./child::node()[ 12 ] \r
68 ./child::node()[ 1 ]/child::service/child::port/child::soap:address/attribute::location\r
69 /GPS/memory[text()=""]\r
70 /GPS/memory[text()="64MB"]\r
73 --> for \r
74 for $i in (10, 20), $j in (1, 2) \r
75         return ( $i + $j )              Error: [1,6] expecting: letter, '_'\r
76 for $x in $z, $y in f($x) \r
77         return g($x, $y)                Error: [1,6] expecting: letter, '_' \r
78 [x] for $a in fn:distinct-values(book/author)\r
79                 return (book/author[. = $a][1], book[author = $a]/title)\r
82 --> if / then / else \r
83 [x] if ($widget1/unit-cost < $widget2/unit-cost) \r
84                 then $widget1 \r
85                 else $widget2                   Error: [1,18] expecting: ',', ')'\r
87 if ($x castable as hatsize) \r
88                 then $x cast as hatsize\r
89                 else $x cast as tim\r
92 --> or / and \r
93 1 eq 1 and 2 eq 2 \r
94 1 eq 2 and 3 idiv 0 = 1\r
95 1 eq 1 or 3 idiv 0 = 1\r
98 --> cast / castable \r
99 [x] if ($x castable as hatsize)         \r
100                 then $x cast as hatsize Error: [1,6] expecting: letter, '_'\r
103 --> some / every \r
104 every $part in /parts/part satisfies $part/@discounted\r
105 every $xart in (1, 2, 3), $yart in (2, 3, 4) \r
106         satisfies $xart + $yart = 4\r
107 some $xart in (1, 2, "cat") satisfies $x * 2 = 4                Error: [1,7] expecting: letter, '_'\r
110 --> intersect / except \r
111 $seq1 intersect $seq2\r
112 $seq1 except $seq2\r
115 --> instanceof \r
116 $p instance of xs:decimal                       Error: [1,2] expecting: letter, '_'\r
117 5  instance of xs:integer\r
118 (5, 6) instance of xs:integer+\r
121 --> treat \r
122 $myaddress treat as element(*, USAddress)\r
125 */ \r
127  /** \r
128   * KNOWN ISSUES \r
129   * \r
130   * - with defining differences (ex: ncname) \r
131   * \r
132   */ \r
134 Helpers\r
135         \r
136         basechar        =       [0x0041..0x005A] | [0x0061..0x007A] | [0x00C0..0x00D6] | \r
137                                         [0x00D8..0x00F6] | [0x00F8..0x00FF] | [0x0100..0x0131] | \r
138                                         [0x0134..0x013E] | [0x0141..0x0148] | [0x014A..0x017E] | \r
139                                         [0x0180..0x01C3] | [0x01CD..0x01F0] | [0x01F4..0x01F5] | \r
140                                         [0x01FA..0x0217] | [0x0250..0x02A8] | [0x02BB..0x02C1] | \r
141                                         0x0386 | [0x0388..0x038A] | 0x038C | [0x038E..0x03A1] | \r
142                                         [0x03A3..0x03CE] | [0x03D0..0x03D6] | 0x03DA | 0x03DC | \r
143                                         0x03DE | 0x03E0 | [0x03E2..0x03F3] | [0x0401..0x040C] | \r
144                                         [0x040E..0x044F] | [0x0451..0x045C] | [0x045E..0x0481] | \r
145                                         [0x0490..0x04C4] | [0x04C7..0x04C8] | [0x04CB..0x04CC] | \r
146                                         [0x04D0..0x04EB] | [0x04EE..0x04F5] | [0x04F8..0x04F9] | \r
147                                         [0x0531..0x0556] | 0x0559 | [0x0561..0x0586] | [0x05D0..0x05EA] | \r
148                                         [0x05F0..0x05F2] | [0x0621..0x063A] | [0x0641..0x064A] | \r
149                                         [0x0671..0x06B7] | [0x06BA..0x06BE] | [0x06C0..0x06CE] | \r
150                                         [0x06D0..0x06D3] | 0x06D5 | [0x06E5..0x06E6] | [0x0905..0x0939] | \r
151                                         0x093D | [0x0958..0x0961] | [0x0985..0x098C] | [0x098F..0x0990] | \r
152                                         [0x0993..0x09A8] | [0x09AA..0x09B0] | 0x09B2 | [0x09B6..0x09B9] | \r
153                                         [0x09DC..0x09DD] | [0x09DF..0x09E1] | [0x09F0..0x09F1] | \r
154                                         [0x0A05..0x0A0A] | [0x0A0F..0x0A10] | [0x0A13..0x0A28] | \r
155                                         [0x0A2A..0x0A30] | [0x0A32..0x0A33] | [0x0A35..0x0A36] | \r
156                                         [0x0A38..0x0A39] | [0x0A59..0x0A5C] | 0x0A5E | [0x0A72..0x0A74] | \r
157                                         [0x0A85..0x0A8B] | 0x0A8D | [0x0A8F..0x0A91] | [0x0A93..0x0AA8] | \r
158                                         [0x0AAA..0x0AB0] | [0x0AB2..0x0AB3] | [0x0AB5..0x0AB9] | \r
159                                         0x0ABD | 0x0AE0 | [0x0B05..0x0B0C] | [0x0B0F..0x0B10] | \r
160                                         [0x0B13..0x0B28] | [0x0B2A..0x0B30] | [0x0B32..0x0B33] | \r
161                                         [0x0B36..0x0B39] | 0x0B3D | [0x0B5C..0x0B5D] | [0x0B5F..0x0B61] | \r
162                                         [0x0B85..0x0B8A] | [0x0B8E..0x0B90] | [0x0B92..0x0B95] | \r
163                                         [0x0B99..0x0B9A] | 0x0B9C | [0x0B9E..0x0B9F] | [0x0BA3..0x0BA4] | \r
164                                         [0x0BA8..0x0BAA] | [0x0BAE..0x0BB5] | [0x0BB7..0x0BB9] | \r
165                                         [0x0C05..0x0C0C] | [0x0C0E..0x0C10] | [0x0C12..0x0C28] | \r
166                                         [0x0C2A..0x0C33] | [0x0C35..0x0C39] | [0x0C60..0x0C61] | \r
167                                         [0x0C85..0x0C8C] | [0x0C8E..0x0C90] | [0x0C92..0x0CA8] | \r
168                                         [0x0CAA..0x0CB3] | [0x0CB5..0x0CB9] | 0x0CDE | [0x0CE0..0x0CE1] | \r
169                                         [0x0D05..0x0D0C] | [0x0D0E..0x0D10] | [0x0D12..0x0D28] | \r
170                                         [0x0D2A..0x0D39] | [0x0D60..0x0D61] | [0x0E01..0x0E2E] | 0x0E30 | \r
171                                         [0x0E32..0x0E33] | [0x0E40..0x0E45] | [0x0E81..0x0E82] | 0x0E84 | \r
172                                         [0x0E87..0x0E88] | 0x0E8A | 0x0E8D | [0x0E94..0x0E97] | \r
173                                         [0x0E99..0x0E9F] | [0x0EA1..0x0EA3] | 0x0EA5 | 0x0EA7 | \r
174                                         [0x0EAA..0x0EAB] | [0x0EAD..0x0EAE] | 0x0EB0 | [0x0EB2..0x0EB3] | \r
175                                         0x0EBD | [0x0EC0..0x0EC4] | [0x0F40..0x0F47] | [0x0F49..0x0F69] | \r
176                                         [0x10A0..0x10C5] | [0x10D0..0x10F6] | 0x1100 | [0x1102..0x1103] | \r
177                                         [0x1105..0x1107] | 0x1109 | [0x110B..0x110C] | [0x110E..0x1112] | \r
178                                         0x113C | 0x113E | 0x1140 | 0x114C | 0x114E | 0x1150 | \r
179                                         [0x1154..0x1155] | 0x1159 | [0x115F..0x1161] | 0x1163 | \r
180                                         0x1165 | 0x1167 | 0x1169 | [0x116D..0x116E] | [0x1172..0x1173] | \r
181                                         0x1175 | 0x119E | 0x11A8 | 0x11AB | [0x11AE..0x11AF] | \r
182                                         [0x11B7..0x11B8] | 0x11BA | [0x11BC..0x11C2] | 0x11EB | \r
183                                         0x11F0 | 0x11F9 | [0x1E00..0x1E9B] | [0x1EA0..0x1EF9] | \r
184                                         [0x1F00..0x1F15] | [0x1F18..0x1F1D] | [0x1F20..0x1F45] | \r
185                                         [0x1F48..0x1F4D] | [0x1F50..0x1F57] | 0x1F59 | 0x1F5B | \r
186                                         0x1F5D | [0x1F5F..0x1F7D] | [0x1F80..0x1FB4] | [0x1FB6..0x1FBC] | \r
187                                         0x1FBE | [0x1FC2..0x1FC4] | [0x1FC6..0x1FCC] | [0x1FD0..0x1FD3] | \r
188                                         [0x1FD6..0x1FDB] | [0x1FE0..0x1FEC] | [0x1FF2..0x1FF4] | \r
189                                         [0x1FF6..0x1FFC] | 0x2126 | [0x212A..0x212B] | 0x212E | \r
190                                         [0x2180..0x2182] | [0x3041..0x3094] | [0x30A1..0x30FA] | \r
191                                         [0x3105..0x312C] | [0xAC00..0xD7A3]; \r
192         \r
193         ideographic             =       [0x4E00..0x9FA5] | 0x3007 | [0x3021..0x3029]; \r
194         \r
195         \r
196         combiningchar   =       [0x0300..0x0345] | [0x0360..0x0361] | [0x0483..0x0486] | \r
197                                                 [0x0591..0x05A1] | [0x05A3..0x05B9] | [0x05BB..0x05BD] | \r
198                                                 0x05BF | [0x05C1..0x05C2] | 0x05C4 | [0x064B..0x0652] | \r
199                                                 0x0670 | [0x06D6..0x06DC] | [0x06DD..0x06DF] | [0x06E0..0x06E4] | \r
200                                                 [0x06E7..0x06E8] | [0x06EA..0x06ED] | [0x0901..0x0903] | \r
201                                                 0x093C | [0x093E..0x094C] | 0x094D | [0x0951..0x0954] | \r
202                                                 [0x0962..0x0963] | [0x0981..0x0983] | 0x09BC | 0x09BE | \r
203                                                 0x09BF | [0x09C0..0x09C4] | [0x09C7..0x09C8] | [0x09CB..0x09CD] | \r
204                                                 0x09D7 | [0x09E2..0x09E3] | 0x0A02 | 0x0A3C | 0x0A3E | \r
205                                                 0x0A3F | [0x0A40..0x0A42] | [0x0A47..0x0A48] | [0x0A4B..0x0A4D] | \r
206                                                 [0x0A70..0x0A71] | [0x0A81..0x0A83] | 0x0ABC | [0x0ABE..0x0AC5] | \r
207                                                 [0x0AC7..0x0AC9] | [0x0ACB..0x0ACD] | [0x0B01..0x0B03] | \r
208                                                 0x0B3C | [0x0B3E..0x0B43] | [0x0B47..0x0B48] | [0x0B4B..0x0B4D] | \r
209                                                 [0x0B56..0x0B57] | [0x0B82..0x0B83] | [0x0BBE..0x0BC2] | \r
210                                                 [0x0BC6..0x0BC8] | [0x0BCA..0x0BCD] | 0x0BD7 | [0x0C01..0x0C03] | \r
211                                                 [0x0C3E..0x0C44] | [0x0C46..0x0C48] | [0x0C4A..0x0C4D] | \r
212                                                 [0x0C55..0x0C56] | [0x0C82..0x0C83] | [0x0CBE..0x0CC4] | \r
213                                                 [0x0CC6..0x0CC8] | [0x0CCA..0x0CCD] | [0x0CD5..0x0CD6] | \r
214                                                 [0x0D02..0x0D03] | [0x0D3E..0x0D43] | [0x0D46..0x0D48] | \r
215                                                 [0x0D4A..0x0D4D] | 0x0D57 | 0x0E31 | [0x0E34..0x0E3A] | \r
216                                                 [0x0E47..0x0E4E] | 0x0EB1 | [0x0EB4..0x0EB9] | [0x0EBB..0x0EBC] | \r
217                                                 [0x0EC8..0x0ECD] | [0x0F18..0x0F19] | 0x0F35 | 0x0F37 | \r
218                                                 0x0F39 | 0x0F3E | 0x0F3F | [0x0F71..0x0F84] | [0x0F86..0x0F8B] | \r
219                                                 [0x0F90..0x0F95] | 0x0F97 | [0x0F99..0x0FAD] | [0x0FB1..0x0FB7] | \r
220                                                 0x0FB9 | [0x20D0..0x20DC] | 0x20E1 | [0x302A..0x302F] | \r
221                                                 0x3099 | 0x309A; \r
222         \r
223         digit   =       [ '0' .. '9' ]; \r
224         \r
225         extender        =       0x00B7 | 0x02D0 | 0x02D1 | 0x0387 | 0x0640 | 0x0E46 | \r
226                                         0x0EC6 | 0x3005 | [0x3031..0x3035] | [0x309D..0x309E] | \r
227                                         [0x30FC..0x30FE]; \r
228         \r
229         \r
230         /** \r
231          * XML names and characters taken (for reference) from these sources \r
232          * \r
233          * http://www.w3.org/TR/REC-xml-names/#NT-QName\r
234          * http://www.w3.org/TR/REC-xml-names/#NT-NCName \r
235          * http://www.w3.org/TR/REC-xml/#NT-NameChar \r
236          * http://www.w3.org/TR/REC-xml/#NT-Letter \r
237          */ \r
238         \r
239         letter_helper      =    basechar | \r
240                                                         ideographic; \r
241         \r
242         namechar        =       letter_helper | digit | '.' | '-' | '_' | ':' | combiningchar | extender; \r
243         \r
244         name            =   (letter_helper | '_' | ':') (namechar)*; \r
245         \r
246         names           =   name (0x20 name)*; \r
247         \r
248         nmtoken         =   (namechar)+; \r
249         \r
250         nmtokens        =   nmtoken (0x20 nmtoken)*; \r
251         \r
252         char = 0x9 | 0xA | 0xD | [0x20-0xD7FF] | [0xE000-0xFFFD] | [0x10000-0x10FFFF]; \r
253         \r
254         escapequot         =            '""'; \r
255         \r
256         doubleliteral_helper    =   (('.' digit) | \r
257                                                                 (digit ('.' [0-9]*)?)) ('e' | 'E') ('+' | '-')? digit; \r
258         stringliteral_helper    =   ( 0x22 (namechar)* 0x22 ) | (''' (namechar)* '''); \r
259         \r
260         \r
261         tab = 9;\r
262         cr = 13;\r
263         lf = 10;\r
264         eol = cr lf | cr | lf;  // This takes care of different platforms               \r
265         \r
266         \r
267 Tokens\r
268         \r
269         keyword_return =        'return';\r
270         keyword_for =           'for';\r
271         keyword_in =            'in';\r
272         keyword_if =            'if';\r
273         keyword_is =            'is'; \r
274         keyword_satisfies = 'satisfies';\r
275         keyword_then =          'then';\r
276         keyword_else =          'else';\r
277         keyword_or =            'or';\r
278         keyword_and =           'and';\r
279         keyword_to =            'to';   \r
280         keyword_div =           'div';\r
281         keyword_idiv =          'idiv';\r
282         keyword_mod =           'mod';\r
283         keyword_union =         'union';\r
284         keyword_intersect = 'intersect';\r
285         keyword_except =        'except';\r
286         keyword_instance =      'instance';\r
287         keyword_of =            'of';\r
288         keyword_treat =         'treat';\r
289         keyword_as =            'as';\r
290         keyword_castable =      'castable';\r
291         keyword_cast =          'cast';\r
292         keyword_some =          'some';\r
293         keyword_every =         'every'; \r
294         \r
295         comma =         ',';\r
296         dollar =        '$';\r
297         question =      '?';\r
298         \r
299         lparenth =      '(';\r
300         rparenth =      ')';\r
301         lbracket =      '[';\r
302         rbracket =      ']';\r
303         plus2 =         '+';\r
304         plus =          '+';\r
305         minus =         '-';\r
306         minus2 =        '-';\r
307         star2 =         '*';\r
308         star =          '*';\r
309         union =         '|';\r
310         equals =        '=';\r
311         \r
312         ne_abbrev =     '!=';\r
313         lt_abbrev =     '<';\r
314         le_abbrev =     '<=';\r
315         gt_abbrev =     '>';\r
316         ge_abbrev =     '>=';\r
317         eq =                    'eq';\r
318         ne =                    'ne';\r
319         lt =                            'lt';\r
320         le =                            'le';\r
321         gt =                            'gt';\r
322         ge =                            'ge';\r
323         is =                            'is';\r
324         ncomp_precedes =        '<<';\r
325         ncomp_follows =         '>>';\r
326         axis_delim =            '::';\r
327         colon =                 ':';\r
328         \r
329         abbrev_root =           '/';\r
330         abbrev_root_desc =      '//';\r
331         abbrev_attrib =                 '@';\r
332         abbrev_reversestep =    '..';\r
333         abbrev_context =                '.';\r
334         \r
335         \r
336         /**\r
337          * Axes \r
338          */\r
339         \r
340         //forward axis\r
341         axis_child = 'child';\r
342         axis_descendant = 'descendant'; \r
343         axis_attribute = 'attribute'; \r
344         axis_self = 'self'; \r
345         axis_descendant_or_self = 'descendant-or-self'; \r
346         axis_following_sibling = 'following-sibling'; \r
347         axis_following = 'following'; \r
348         axis_namespace = 'namespace'; \r
349         \r
350         // reverse axis \r
351         axis_parent = 'parent'; \r
352         axis_ancestor = 'ancestor'; \r
353         axis_preceding_sibling = 'preceding-sibling'; \r
354         axis_preceding = 'preceding'; \r
355         axis_ancestor_or_self = 'ancestor-or-self'; \r
356         \r
357         \r
358         /**\r
359          *  Node Set Functions\r
360          * \r
361          *      function: number last()\r
362          *      function: number position()\r
363          *      function: number count(node-set)\r
364          *      function: node-set id(object) \r
365          *      function: string local-name(node-set?)\r
366          *      function: string namespace-uri(node-set?)\r
367          *      function: string name(node-set?) \r
368          */\r
369         \r
370         /** \r
371          *  String Functions\r
372          *\r
373          *      function: string string(object?)\r
374          *      function: string concat(string, string, string*)\r
375          *      function: boolean starts-with(string, string)\r
376          *      function: boolean contains(string, string)\r
377          *      function: string substring-before(string, string)\r
378          *      function: string substring-after(string, string)\r
379          *      function: string substring(string, number, number?) \r
380          *      function: number string-length(string?)\r
381          *      function: string normalize-space(string?)\r
382          *      function: string translate(string, string, string) \r
383          */\r
384         \r
385         /**\r
386          *  Boolean Functions\r
387          *\r
388          *      function: boolean boolean(object)\r
389          *      function: boolean not(boolean)\r
390          *      function: boolean true()\r
391          *      function: boolean false()\r
392          *      function: boolean lang(string) \r
393          */\r
394         \r
395         /** \r
396          *  Number Functions\r
397          *\r
398          *      function: number number(object?)\r
399          *      function: number sum(node-set)\r
400          *      function: number floor(number) \r
401          *      function: number ceiling(number)\r
402          *      function: number round(number) \r
403          */\r
404         \r
405         /**\r
406          * Reserved Function Names \r
407          */ \r
408         //fn_attribute = 'attribute'; \r
409         fn_comment = 'comment'; \r
410         fn_document_node = 'document-node'; \r
411         fn_element = 'element'; \r
412         fn_empty_sequence = 'empty-sequence'; \r
413         fn_item = 'item'; \r
414         fn_node = 'node'; \r
415         fn_processing_instruction = 'processing-instruction'; \r
416         fn_schema_attribute = 'schema-attribute'; \r
417         fn_schema_element = 'schema-element'; \r
418         fn_text = 'text'; \r
419         fn_typeswitch = 'typeswitch'; \r
420         \r
421         \r
422         xmlns = 'xmlns'; \r
423         \r
424         integerliteral          =       digit+; \r
425         \r
426         letter     =    basechar+; \r
427         \r
428         ncnamechar      =   namechar; \r
429         \r
430         underscore = '_'; \r
431         \r
432         \r
433         decimalliteral          =       ('.' digit+) | (digit+ '.' digit*); \r
434         \r
435         doubleliteral           =   doubleliteral_helper; \r
436         \r
437         stringliteral           =   stringliteral_helper; \r
438         \r
439         whitespace      =       (' ' | tab | eol);\r
440         comment            =            '(:' (char)* ':)'; \r
441         \r
442         \r
443 Ignored Tokens \r
444         \r
445         whitespace, \r
446         comment; \r
447         \r
448         \r
449 Productions \r
450         \r
451         xpath = expr; \r
452         \r
453         expr = exprsingle? expr_part*; \r
454                 expr_part = T.comma exprsingle; \r
455         \r
456         exprsingle =    {for} forexpr | \r
457                                         {quantif} quantifiedexpr | \r
458                                         {if} ifexpr | \r
459                                         {or} orexpr;\r
460         \r
461         forexpr                 = simpleforclause T.keyword_return exprsingle;\r
462         \r
463         simpleforclause = T.keyword_for T.dollar varname T.keyword_in exprsingle simpleforclause_part*;\r
464                 simpleforclause_part = T.comma T.dollar varname T.keyword_in exprsingle;\r
465         \r
466         quantifiedexpr  = some_every_part T.dollar varname T.keyword_in [exprsingle1]:exprsingle quantifiedexpr_part* T.keyword_satisfies [exprsingle2]:exprsingle;\r
467                 some_every_part =       {some}  T.keyword_some | \r
468                                                         {every} T.keyword_every; \r
469                 quantifiedexpr_part = T.comma T.dollar varname T.keyword_in exprsingle; \r
470         \r
471         ifexpr  =       T.keyword_if T.lparenth expr T.rparenth T.keyword_then [exprsingle1]:exprsingle T.keyword_else [exprsingle2]:exprsingle; \r
472         \r
473         orexpr     =            andexpr orexpr_part*;\r
474                 orexpr_part = T.keyword_or andexpr; \r
475         \r
476         andexpr            =            comparisonexpr andexpr_part*;\r
477                 andexpr_part = T.keyword_and comparisonexpr; \r
478         \r
479         comparisonexpr     =    rangeexpr comparisonexpr_part?; \r
480                 comparisonexpr_part = comparisonexpr_part_part rangeexpr; \r
481                 comparisonexpr_part_part =      {value} valuecomp | \r
482                                                                         {general} generalcomp | \r
483                                                                         {node} nodecomp; \r
484         \r
485         rangeexpr          =            additiveexpr rangeexpr_part?;\r
486                 rangeexpr_part = T.keyword_to additiveexpr; \r
487         \r
488         additiveexpr       =            multiplicativeexpr additiveexpr_part*;\r
489                 additiveexpr_part = additiveexpr_part_part multiplicativeexpr; \r
490                 additiveexpr_part_part =        {plus} T.plus2 | \r
491                                                                         {minus} T.minus2; \r
492         \r
493         \r
494         multiplicativeexpr         =            unionexpr multiplicativeexpr_part*; \r
495                 multiplicativeexpr_part = multiplicativeexpr_part_part unionexpr; \r
496                 multiplicativeexpr_part_part =  {star} T.star2 | \r
497                                                                                 {div} T.keyword_div | \r
498                                                                                 {idiv} T.keyword_idiv | \r
499                                                                                 {mod} T.keyword_mod; \r
500         \r
501         unionexpr          =            intersectexceptexpr unionexpr_part*;\r
502                 unionexpr_part = unionexpr_part_part intersectexceptexpr; \r
503                 unionexpr_part_part =   {unionkey} T.keyword_union | \r
504                                                                 {union} T.union; \r
505                 \r
506         intersectexceptexpr        =            instanceofexpr intersectexceptexpr_part*;\r
507                 intersectexceptexpr_part = intersectexceptexpr_part_part instanceofexpr; \r
508                 intersectexceptexpr_part_part =         {intersect} T.keyword_intersect | \r
509                                                                                         {except} T.keyword_except; \r
510         \r
511         instanceofexpr     =            treatexpr instanceofexpr_part?;\r
512                 instanceofexpr_part = T.keyword_instance T.keyword_of sequencetype; \r
513                 \r
514         treatexpr          =            castableexpr treatexpr_part?; \r
515                 treatexpr_part = T.keyword_treat T.keyword_as sequencetype; \r
516         \r
517         castableexpr       =            castexpr castableexpr_part?;\r
518                 castableexpr_part = T.keyword_castable T.keyword_as singletype; \r
519         \r
520         castexpr           =            unaryexpr castexpr_part?;\r
521                 castexpr_part = T.keyword_cast T.keyword_as singletype; \r
522         \r
523         unaryexpr          =            unaryexpr_part* valueexpr;\r
524                 unaryexpr_part =        {minus} T.minus | \r
525                                                         {plus} T.plus; \r
526         \r
527         valueexpr          =            pathexpr;\r
528         \r
529         generalcomp        =    {eq} T.equals | \r
530                                                         {ne} T.ne_abbrev | \r
531                                                         {lt} T.lt_abbrev | \r
532                                                         {le} T.le_abbrev | \r
533                                                         {gt} T.gt_abbrev | \r
534                                                         {ge} T.ge_abbrev;\r
535         \r
536         valuecomp          =    {eq} T.eq | \r
537                                                 {ne} T.ne | \r
538                                                 {lt} T.lt | \r
539                                                 {le} T.le | \r
540                                                 {gt} T.gt | \r
541                                                 {ge} T.ge;\r
542         \r
543         nodecomp           =    {is} T.keyword_is | \r
544                                                 {ncomppre} T.ncomp_precedes | \r
545                                                 {ncompfol} T.ncomp_follows;\r
546         \r
547         pathexpr           =    {path1} pathexpr_part_one | \r
548                                                 {path2} pathexpr_part_two | \r
549                                                 {relpath} relativepathexpr; \r
550                 pathexpr_part_one = T.abbrev_root relativepathexpr?; \r
551                 pathexpr_part_two = T.abbrev_root_desc relativepathexpr; \r
552         \r
553         relativepathexpr           =            stepexpr relativepathexpr_part*;\r
554                 relativepathexpr_part = relativepathexpr_part_part stepexpr; \r
555                 relativepathexpr_part_part =    {root} T.abbrev_root | \r
556                                                                                 {rootdesc} T.abbrev_root_desc; \r
557         \r
558         stepexpr           =    {filter} filterexpr | \r
559                                                 {axis} axisstep;\r
560         \r
561         \r
562         /**\r
563          * Axes \r
564          */ \r
565         axisstep           =    axisstep_part predicatelist;\r
566                 axisstep_part =         {reverse} reversestep | \r
567                                                         {forward} forwardstep; \r
568         \r
569         forwardstep        =    {forward} forwardstep_part | \r
570                                                         {abbrevforward} abbrevforwardstep;\r
571                 forwardstep_part = forwardaxis nodetest; \r
572                 \r
573         forwardaxis        =    {forward1} forwardaxis_part_one | \r
574                                                         {forward2} forwardaxis_part_two | \r
575                                                         {forward3} forwardaxis_part_three | \r
576                                                         {forward4} forwardaxis_part_four | \r
577                                                         {forward5} forwardaxis_part_five | \r
578                                                         {forward6} forwardaxis_part_six | \r
579                                                         {forward7} forwardaxis_part_seven | \r
580                                                         {forward8} forwardaxis_part_eight;\r
581                 forwardaxis_part_one = T.axis_child T.axis_delim; \r
582                 forwardaxis_part_two = T.axis_descendant T.axis_delim; \r
583                 forwardaxis_part_three = T.axis_attribute T.axis_delim; \r
584                 forwardaxis_part_four = T.axis_self T.axis_delim; \r
585                 forwardaxis_part_five = T.axis_descendant_or_self T.axis_delim; \r
586                 forwardaxis_part_six = T.axis_following_sibling T.axis_delim; \r
587                 forwardaxis_part_seven = T.axis_following T.axis_delim; \r
588                 forwardaxis_part_eight = T.axis_namespace T.axis_delim; \r
589         \r
590         abbrevforwardstep          =            T.abbrev_attrib? nodetest;\r
591         \r
592         reversestep        =    {reverse} reversestep_part | \r
593                                                         {abbrevreverse} abbrevreversestep; \r
594                 reversestep_part = reverseaxis nodetest; \r
595         \r
596         reverseaxis        =    {reverse1} reverseaxis_part_one | \r
597                                                         {reverse2} reverseaxis_part_two | \r
598                                                         {reverse3} reverseaxis_part_three | \r
599                                                         {reverse4} reverseaxis_part_four | \r
600                                                         {reverse5} reverseaxis_part_five; \r
601                 reverseaxis_part_one = T.axis_parent T.axis_delim; \r
602                 reverseaxis_part_two = T.axis_ancestor T.axis_delim; \r
603                 reverseaxis_part_three = T.axis_preceding_sibling T.axis_delim; \r
604                 reverseaxis_part_four = T.axis_preceding T.axis_delim; \r
605                 reverseaxis_part_five = T.axis_ancestor_or_self T.axis_delim; \r
606         \r
607         \r
608         abbrevreversestep          =            T.abbrev_reversestep;\r
609         \r
610         nodetest           =    {kind} kindtest | \r
611                                                 {name} nametest;\r
612         \r
613         nametest           =    {qname} qname | \r
614                                                 {wildc} wildcard;\r
615         \r
616         wildcard           =    {star} T.star | \r
617                                                 {wild1} wildcard_part_one | \r
618                                                 {wild2} wildcard_part_two; \r
619                 wildcard_part_one = ncname T.colon T.star; \r
620                 wildcard_part_two = T.star T.colon ncname; \r
621                 \r
622         filterexpr         =            primaryexpr predicatelist;\r
623         \r
624         predicatelist      =            predicate*;\r
626         predicate          =            T.lbracket expr T.rbracket;\r
627         \r
628         primaryexpr        =    {literal} literal | \r
629                                                         {varref} varref | \r
630                                                         {parenthex} parenthesizedexpr | \r
631                                                         {contextex} contextitemexpr | \r
632                                                         {function} functioncall;\r
633         \r
634         literal            =    {numeric} numericliteral | \r
635                                                 {string} stringliteral;\r
636         \r
637         numericliteral     =    {integer} integerliteral | \r
638                                                         {decimal} decimalliteral | \r
639                                                         {double} doubleliteral;\r
640         \r
641         varref     =            T.dollar varname;\r
643         varname            =            qname;\r
645         parenthesizedexpr          =            T.lparenth expr? T.rparenth;\r
647         contextitemexpr            =            T.abbrev_context;\r
649         \r
650         /** \r
651          * Functions\r
652          */ \r
653         \r
654         functioncall       =            qname T.lparenth functioncall_part? T.rparenth;         \r
655                 functioncall_part = exprsingle functioncall_part_part*; \r
656                 functioncall_part_part = T.comma exprsingle; \r
657         \r
658         \r
659         singletype         =            atomictype T.question?;\r
660         \r
661         sequencetype       =    {sequencetype1} sequencetype_part_one | \r
662                                                         {sequencetype2} sequencetype_part_two;\r
663                 sequencetype_part_one = T.fn_empty_sequence T.lparenth T.rparenth; \r
664                 sequencetype_part_two = itemtype occurrenceindicator?; \r
665         \r
666         occurrenceindicator        =    {question} T.question | \r
667                                                                         {star} T.star | \r
668                                                                         {plus} T.plus; \r
669         \r
670         \r
671         itemtype           =    {kind} kindtest | \r
672                                                 {item} itemtype_part | \r
673                                                 {atomic} atomictype; \r
674                 itemtype_part = T.fn_item T.lparenth T.rparenth; \r
676         atomictype         =    qname;\r
678         kindtest           =    {document} documenttest | \r
679                                                 {element} elementtest | \r
680                                                 {attribute} attributetest | \r
681                                                 {schemaelem} schemaelementtest | \r
682                                                 {schemaattr} schemaattributetest | \r
683                                                 {pi} pitest | \r
684                                                 {comment} commenttest | \r
685                                                 {text} texttest | \r
686         //                                      {any} anykindtest;\r
687                                                 {any} akindtest;\r
689         //anykindtest      =            T.fn_node T.lparenth T.rparenth;\r
690         akindtest          =            T.fn_node T.lparenth T.rparenth;\r
691         \r
692         documenttest       =            T.fn_document_node T.lparenth documenttest_part? T.rparenth; \r
693                 documenttest_part =     {element} elementtest | \r
694                                                                 {schemaelem} schemaelementtest; \r
695                 \r
697         texttest           =            T.fn_text T.lparenth T.rparenth;\r
698         \r
699         commenttest        =            T.fn_comment T.lparenth T.rparenth;\r
700         \r
701         pitest     =            T.fn_processing_instruction T.lparenth pitest_part? T.rparenth; \r
702                 pitest_part =   {ncname} ncname | \r
703                                                 {stringlit} stringliteral; \r
704         \r
705         attributetest      =            T.axis_attribute T.lparenth attributetest_part? T.rparenth;      \r
706                 attributetest_part = attribnameorwildcard attributetest_part_part?; \r
707                 attributetest_part_part = T.comma typename; \r
708         \r
709         \r
710         attribnameorwildcard       =    {attrib} attributename | \r
711                                                                         {star} T.star;\r
712         \r
713         schemaattributetest        =            T.fn_schema_attribute T.lparenth attributedeclaration T.rparenth;\r
714         \r
715         attributedeclaration       =            attributename;\r
716         \r
717         elementtest        =            T.fn_element T.lparenth elementtest_part? T.rparenth; \r
718                 elementtest_part = elementnameorwildcard elementtest_part_part?; \r
719                 elementtest_part_part = T.comma typename T.question?; \r
720         \r
721         elementnameorwildcard      =    {element} elementname | \r
722                                                                         {star} T.star;\r
724         schemaelementtest          =            T.fn_schema_element T.lparenth elementdeclaration T.rparenth;\r
726         elementdeclaration         =            elementname;\r
728         attributename      =            qname;\r
730         elementname        =            qname;\r
732         typename           =            qname;\r
733         \r
734         \r
735         /** \r
736          * Qualified XML Names \r
737          */\r
738         qname   =       {prefixed} prefixedname | \r
739                                 {unprefixed} unprefixedname; \r
740         \r
741         prefixedname    =       prefix T.colon localpart; \r
742         \r
743         unprefixedname  =       localpart; \r
744         \r
745         prefix     =    ncname; \r
746         \r
747         localpart       =       ncname; \r
748         \r
749         \r
750         /** \r
751          * Attribute Names for Namespace \r
752          */ \r
753         nsattname       =       {prefixed} prefixedattname | \r
754                                         {default} defaultattname; \r
755         \r
756         prefixedattname =       T.xmlns T.colon ncname; \r
757         \r
758         defaultattname  =       T.xmlns; \r
759         \r
760         ncname     =    ncnamestartchar T.ncnamechar*;          /* An XML Name, minus the ":" */\r
761         \r
762         ncnamestartchar =       {letter} T.letter | \r
763                                                 {underscore} T.underscore ; \r
764         \r