-- can now parse expressions:
[xpath20.git] / cc / xpath.sablecc
blob3ebe34730ae39e86e390fffb9b250fd366ce4b9f
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 [x] for $i in (10, 20), $j in (1, 2) \r
75                 return ( $i + $j )              Error: [1,6] expecting: letter, '_'\r
76 [x] 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 [x] every $xart in (1, 2, 3), $yart in (2, 3, 4) \r
106         satisfies $xart + $yart = 4\r
107 [x] 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 [x] $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         namechar        =       letter_helper | '.' | '-' | '_' | ':' | combiningchar | extender; \r
244         name            =   (letter_helper | '_' | ':') (namechar)*; \r
245         names           =   name (0x20 name)*; \r
246         nmtoken         =   (namechar)+; \r
247         nmtokens        =   nmtoken (0x20 nmtoken)*; \r
248         char = 0x9 | 0xA | 0xD | [0x20-0xD7FF] | [0xE000-0xFFFD] | [0x10000-0x10FFFF]; \r
249         \r
250         \r
251         escapequot         =            '""'; \r
252         \r
253         doubleliteral_helper    =   (('.' digit) | \r
254                                                                 (digit ('.' [0-9]*)?)) ('e' | 'E') ('+' | '-')? digit; \r
255         stringliteral_helper    =   ( 0x22 (namechar)* 0x22 ) | (''' (namechar)* '''); \r
256         \r
257         \r
258         tab = 9;\r
259         cr = 13;\r
260         lf = 10;\r
261         eol = cr lf | cr | lf;  // This takes care of different platforms               \r
262         \r
263         \r
264 Tokens\r
265         \r
266         keyword_return =        'return';\r
267         keyword_for =           'for';\r
268         keyword_in =            'in';\r
269         keyword_if =            'if';\r
270         keyword_is =            'is'; \r
271         keyword_satisfies = 'satisfies';\r
272         keyword_then =          'then';\r
273         keyword_else =          'else';\r
274         keyword_or =            'or';\r
275         keyword_and =           'and';\r
276         keyword_to =            'to';   \r
277         keyword_div =           'div';\r
278         keyword_idiv =          'idiv';\r
279         keyword_mod =           'mod';\r
280         keyword_union =         'union';\r
281         keyword_intersect = 'intersect';\r
282         keyword_except =        'except';\r
283         keyword_instance =      'instance';\r
284         keyword_of =            'of';\r
285         keyword_treat =         'treat';\r
286         keyword_as =            'as';\r
287         keyword_castable =      'castable';\r
288         keyword_cast =          'cast';\r
289         keyword_some =          'some';\r
290         keyword_every =         'every'; \r
291         \r
292         comma =         ',';\r
293         dollar =        '$';\r
294         question =      '?';\r
295         \r
296         lparenth =      '(';\r
297         rparenth =      ')';\r
298         lbracket =      '[';\r
299         rbracket =      ']';\r
300         plus2 =         '+';\r
301         plus =          '+';\r
302         minus =         '-';\r
303         minus2 =        '-';\r
304         star2 =         '*';\r
305         star =          '*';\r
306         union =         '|';\r
307         equals =        '=';\r
308         \r
309         ne_abbrev =     '!=';\r
310         lt_abbrev =     '<';\r
311         le_abbrev =     '<=';\r
312         gt_abbrev =     '>';\r
313         ge_abbrev =     '>=';\r
314         eq =                    'eq';\r
315         ne =                    'ne';\r
316         lt =                            'lt';\r
317         le =                            'le';\r
318         gt =                            'gt';\r
319         ge =                            'ge';\r
320         is =                            'is';\r
321         ncomp_precedes =        '<<';\r
322         ncomp_follows =         '>>';\r
323         axis_delim =            '::';\r
324         colon =                 ':';\r
325         \r
326         abbrev_root =           '/';\r
327         abbrev_root_desc =      '//';\r
328         abbrev_attrib =                 '@';\r
329         abbrev_reversestep =    '..';\r
330         abbrev_context =                '.';\r
331         \r
332         \r
333         /**\r
334          * Axes \r
335          */\r
336         \r
337         //forward axis\r
338         axis_child = 'child';\r
339         axis_descendant = 'descendant'; \r
340         axis_attribute = 'attribute'; \r
341         axis_self = 'self'; \r
342         axis_descendant_or_self = 'descendant-or-self'; \r
343         axis_following_sibling = 'following-sibling'; \r
344         axis_following = 'following'; \r
345         axis_namespace = 'namespace'; \r
346         \r
347         // reverse axis \r
348         axis_parent = 'parent'; \r
349         axis_ancestor = 'ancestor'; \r
350         axis_preceding_sibling = 'preceding-sibling'; \r
351         axis_preceding = 'preceding'; \r
352         axis_ancestor_or_self = 'ancestor-or-self'; \r
353         \r
354         \r
355         /**\r
356          *  Node Set Functions\r
357          * \r
358          *      function: number last()\r
359          *      function: number position()\r
360          *      function: number count(node-set)\r
361          *      function: node-set id(object) \r
362          *      function: string local-name(node-set?)\r
363          *      function: string namespace-uri(node-set?)\r
364          *      function: string name(node-set?) \r
365          */\r
366         \r
367         /** \r
368          *  String Functions\r
369          *\r
370          *      function: string string(object?)\r
371          *      function: string concat(string, string, string*)\r
372          *      function: boolean starts-with(string, string)\r
373          *      function: boolean contains(string, string)\r
374          *      function: string substring-before(string, string)\r
375          *      function: string substring-after(string, string)\r
376          *      function: string substring(string, number, number?) \r
377          *      function: number string-length(string?)\r
378          *      function: string normalize-space(string?)\r
379          *      function: string translate(string, string, string) \r
380          */\r
381         \r
382         /**\r
383          *  Boolean Functions\r
384          *\r
385          *      function: boolean boolean(object)\r
386          *      function: boolean not(boolean)\r
387          *      function: boolean true()\r
388          *      function: boolean false()\r
389          *      function: boolean lang(string) \r
390          */\r
391         \r
392         /** \r
393          *  Number Functions\r
394          *\r
395          *      function: number number(object?)\r
396          *      function: number sum(node-set)\r
397          *      function: number floor(number) \r
398          *      function: number ceiling(number)\r
399          *      function: number round(number) \r
400          */\r
401         \r
402         /**\r
403          * Reserved Function Names \r
404          */ \r
405         //fn_attribute = 'attribute'; \r
406         fn_comment = 'comment'; \r
407         fn_document_node = 'document-node'; \r
408         fn_element = 'element'; \r
409         fn_empty_sequence = 'empty-sequence'; \r
410         fn_item = 'item'; \r
411         fn_node = 'node'; \r
412         fn_processing_instruction = 'processing-instruction'; \r
413         fn_schema_attribute = 'schema-attribute'; \r
414         fn_schema_element = 'schema-element'; \r
415         fn_text = 'text'; \r
416         fn_typeswitch = 'typeswitch'; \r
417         \r
418         \r
419         xmlns = 'xmlns'; \r
420         \r
421         letter     =    basechar+; \r
422         \r
423         ncnamechar      =   namechar; \r
424         //ncnamechar    =   [namechar - ':']; \r
425         \r
426         underscore = '_'; \r
427         \r
428         integerliteral          =       digit+; \r
429         \r
430         decimalliteral          =       ('.' digit+) | (digit+ '.' digit*); \r
431         \r
432         doubleliteral           =   doubleliteral_helper; \r
433         \r
434         stringliteral           =   stringliteral_helper; \r
435         \r
436         whitespace      =       (' ' | tab | eol);\r
437         comment            =            '(:' (char)* ':)'; \r
438         \r
439         \r
440 Ignored Tokens \r
441         \r
442         whitespace, \r
443         comment; \r
444         \r
445         \r
446 Productions \r
447         \r
448         xpath = expr; \r
449         \r
450         expr = exprsingle? expr_part*; \r
451                 expr_part = T.comma exprsingle; \r
452         \r
453         exprsingle =    {for} forexpr | \r
454                                         {quantif} quantifiedexpr | \r
455                                         {if} ifexpr | \r
456                                         {or} orexpr;\r
457         \r
458         forexpr                 = simpleforclause T.keyword_return exprsingle;\r
459         \r
460         simpleforclause = T.keyword_for T.dollar varname T.keyword_in exprsingle simpleforclause_part*;\r
461                 simpleforclause_part = T.comma T.dollar varname T.keyword_in exprsingle;\r
462         \r
463         quantifiedexpr  = some_every_part T.dollar varname T.keyword_in [exprsingle1]:exprsingle quantifiedexpr_part* T.keyword_satisfies [exprsingle2]:exprsingle;\r
464                 some_every_part =       {some}  T.keyword_some | \r
465                                                         {every} T.keyword_every; \r
466                 quantifiedexpr_part = T.comma T.dollar varname T.keyword_in exprsingle; \r
467         \r
468         ifexpr = T.keyword_if T.lparenth expr T.rparenth T.keyword_then [exprsingle1]:exprsingle T.keyword_else [exprsingle2]:exprsingle;\r
469         \r
470         orexpr     =            andexpr orexpr_part*;\r
471                 orexpr_part = T.keyword_or andexpr; \r
472         \r
473         andexpr            =            comparisonexpr andexpr_part*;\r
474                 andexpr_part = T.keyword_and comparisonexpr; \r
475         \r
476         comparisonexpr     =    rangeexpr comparisonexpr_part?; \r
477                 comparisonexpr_part = comparisonexpr_part_part rangeexpr; \r
478                 comparisonexpr_part_part =      {value} valuecomp | \r
479                                                                         {general} generalcomp | \r
480                                                                         {node} nodecomp; \r
481         \r
482         rangeexpr          =            additiveexpr rangeexpr_part?;\r
483                 rangeexpr_part = T.keyword_to additiveexpr; \r
484         \r
485         additiveexpr       =            multiplicativeexpr additiveexpr_part*;\r
486                 additiveexpr_part = additiveexpr_part_part multiplicativeexpr; \r
487                 additiveexpr_part_part =        {plus} T.plus2 | \r
488                                                                         {minus} T.minus2; \r
489         \r
490         \r
491         multiplicativeexpr         =            unionexpr multiplicativeexpr_part*; \r
492                 multiplicativeexpr_part = multiplicativeexpr_part_part unionexpr; \r
493                 multiplicativeexpr_part_part =  {star} T.star2 | \r
494                                                                                 {div} T.keyword_div | \r
495                                                                                 {idiv} T.keyword_idiv | \r
496                                                                                 {mod} T.keyword_mod; \r
497         \r
498         unionexpr          =            intersectexceptexpr unionexpr_part*;\r
499                 unionexpr_part = unionexpr_part_part intersectexceptexpr; \r
500                 unionexpr_part_part =   {unionkey} T.keyword_union | \r
501                                                                 {union} T.union; \r
502                 \r
503         intersectexceptexpr        =            instanceofexpr intersectexceptexpr_part*;\r
504                 intersectexceptexpr_part = intersectexceptexpr_part_part instanceofexpr; \r
505                 intersectexceptexpr_part_part =         {intersect} T.keyword_intersect | \r
506                                                                                         {except} T.keyword_except; \r
507         \r
508         instanceofexpr     =            treatexpr instanceofexpr_part?;\r
509                 instanceofexpr_part = T.keyword_instance T.keyword_of sequencetype; \r
510                 \r
511         treatexpr          =            castableexpr treatexpr_part?; \r
512                 treatexpr_part = T.keyword_treat T.keyword_as sequencetype; \r
513         \r
514         castableexpr       =            castexpr castableexpr_part?;\r
515                 castableexpr_part = T.keyword_castable T.keyword_as singletype; \r
516         \r
517         castexpr           =            unaryexpr castexpr_part?;\r
518                 castexpr_part = T.keyword_cast T.keyword_as singletype; \r
519         \r
520         unaryexpr          =            unaryexpr_part* valueexpr;\r
521                 unaryexpr_part =        {minus} T.minus | \r
522                                                         {plus} T.plus; \r
523         \r
524         valueexpr          =            pathexpr;\r
525         \r
526         generalcomp        =    {eq} T.equals | \r
527                                                         {ne} T.ne_abbrev | \r
528                                                         {lt} T.lt_abbrev | \r
529                                                         {le} T.le_abbrev | \r
530                                                         {gt} T.gt_abbrev | \r
531                                                         {ge} T.ge_abbrev;\r
532         \r
533         valuecomp          =    {eq} T.eq | \r
534                                                 {ne} T.ne | \r
535                                                 {lt} T.lt | \r
536                                                 {le} T.le | \r
537                                                 {gt} T.gt | \r
538                                                 {ge} T.ge;\r
539         \r
540         nodecomp           =    {is} T.keyword_is | \r
541                                                 {ncomppre} T.ncomp_precedes | \r
542                                                 {ncompfol} T.ncomp_follows;\r
543         \r
544         pathexpr           =    {path1} pathexpr_part_one | \r
545                                                 {path2} pathexpr_part_two | \r
546                                                 {relpath} relativepathexpr; \r
547                 pathexpr_part_one = T.abbrev_root relativepathexpr?; \r
548                 pathexpr_part_two = T.abbrev_root_desc relativepathexpr; \r
549         \r
550         relativepathexpr           =            stepexpr relativepathexpr_part*;\r
551                 relativepathexpr_part = relativepathexpr_part_part stepexpr; \r
552                 relativepathexpr_part_part =    {root} T.abbrev_root | \r
553                                                                                 {rootdesc} T.abbrev_root_desc; \r
554         \r
555         stepexpr           =    {filter} filterexpr | \r
556                                                 {axis} axisstep;\r
557         \r
558         \r
559         /**\r
560          * Axes \r
561          */ \r
562         axisstep           =    axisstep_part predicatelist;\r
563                 axisstep_part =         {reverse} reversestep | \r
564                                                         {forward} forwardstep; \r
565         \r
566         forwardstep        =    {forward} forwardstep_part | \r
567                                                         {abbrevforward} abbrevforwardstep;\r
568                 forwardstep_part = forwardaxis nodetest; \r
569                 \r
570         forwardaxis        =    {forward1} forwardaxis_part_one | \r
571                                                         {forward2} forwardaxis_part_two | \r
572                                                         {forward3} forwardaxis_part_three | \r
573                                                         {forward4} forwardaxis_part_four | \r
574                                                         {forward5} forwardaxis_part_five | \r
575                                                         {forward6} forwardaxis_part_six | \r
576                                                         {forward7} forwardaxis_part_seven | \r
577                                                         {forward8} forwardaxis_part_eight;\r
578                 forwardaxis_part_one = T.axis_child T.axis_delim; \r
579                 forwardaxis_part_two = T.axis_descendant T.axis_delim; \r
580                 forwardaxis_part_three = T.axis_attribute T.axis_delim; \r
581                 forwardaxis_part_four = T.axis_self T.axis_delim; \r
582                 forwardaxis_part_five = T.axis_descendant_or_self T.axis_delim; \r
583                 forwardaxis_part_six = T.axis_following_sibling T.axis_delim; \r
584                 forwardaxis_part_seven = T.axis_following T.axis_delim; \r
585                 forwardaxis_part_eight = T.axis_namespace T.axis_delim; \r
586         \r
587         abbrevforwardstep          =            T.abbrev_attrib? nodetest;\r
588         \r
589         reversestep        =    {reverse} reversestep_part | \r
590                                                         {abbrevreverse} abbrevreversestep; \r
591                 reversestep_part = reverseaxis nodetest; \r
592         \r
593         reverseaxis        =    {reverse1} reverseaxis_part_one | \r
594                                                         {reverse2} reverseaxis_part_two | \r
595                                                         {reverse3} reverseaxis_part_three | \r
596                                                         {reverse4} reverseaxis_part_four | \r
597                                                         {reverse5} reverseaxis_part_five; \r
598                 reverseaxis_part_one = T.axis_parent T.axis_delim; \r
599                 reverseaxis_part_two = T.axis_ancestor T.axis_delim; \r
600                 reverseaxis_part_three = T.axis_preceding_sibling T.axis_delim; \r
601                 reverseaxis_part_four = T.axis_preceding T.axis_delim; \r
602                 reverseaxis_part_five = T.axis_ancestor_or_self T.axis_delim; \r
603         \r
604         \r
605         abbrevreversestep          =            T.abbrev_reversestep;\r
606         \r
607         nodetest           =    {kind} kindtest | \r
608                                                 {name} nametest;\r
609         \r
610         nametest           =    {qname} qname | \r
611                                                 {wildc} wildcard;\r
612         \r
613         wildcard           =    {star} T.star | \r
614                                                 {wild1} wildcard_part_one | \r
615                                                 {wild2} wildcard_part_two; \r
616                 wildcard_part_one = ncname T.colon T.star; \r
617                 wildcard_part_two = T.star T.colon ncname; \r
618                 \r
619         filterexpr         =            primaryexpr predicatelist;\r
620         \r
621         predicatelist      =            predicate*;\r
623         predicate          =            T.lbracket expr T.rbracket;\r
624         \r
625         primaryexpr        =    {literal} literal | \r
626                                                         {varref} varref | \r
627                                                         {parenthex} parenthesizedexpr | \r
628                                                         {contextex} contextitemexpr | \r
629                                                         {function} functioncall;\r
630         \r
631         literal            =    {numeric} numericliteral | \r
632                                                 {string} stringliteral;\r
633         \r
634         numericliteral     =    {integer} integerliteral | \r
635                                                         {decimal} decimalliteral | \r
636                                                         {double} doubleliteral;\r
637         \r
638         varref     =            T.dollar varname;\r
640         varname            =            qname;\r
642         parenthesizedexpr          =            T.lparenth expr? T.rparenth;\r
644         contextitemexpr            =            T.abbrev_context;\r
646         \r
647         /** \r
648          * Functions\r
649          */ \r
650         \r
651         functioncall       =            qname T.lparenth functioncall_part? T.rparenth;         \r
652                 functioncall_part = exprsingle functioncall_part_part*; \r
653                 functioncall_part_part = T.comma exprsingle; \r
654         \r
655         \r
656         singletype         =            atomictype T.question?;\r
657         \r
658         sequencetype       =    {sequencetype1} sequencetype_part_one | \r
659                                                         {sequencetype2} sequencetype_part_two;\r
660                 sequencetype_part_one = T.fn_empty_sequence T.lparenth T.rparenth; \r
661                 sequencetype_part_two = itemtype occurrenceindicator?; \r
662         \r
663         occurrenceindicator        =    {question} T.question | \r
664                                                                         {star} T.star | \r
665                                                                         {plus} T.plus; \r
666         \r
667         \r
668         itemtype           =    {kind} kindtest | \r
669                                                 {item} itemtype_part | \r
670                                                 {atomic} atomictype; \r
671                 itemtype_part = T.fn_item T.lparenth T.rparenth; \r
673         atomictype         =    qname;\r
675         kindtest           =    {document} documenttest | \r
676                                                 {element} elementtest | \r
677                                                 {attribute} attributetest | \r
678                                                 {schemaelem} schemaelementtest | \r
679                                                 {schemaattr} schemaattributetest | \r
680                                                 {pi} pitest | \r
681                                                 {comment} commenttest | \r
682                                                 {text} texttest | \r
683         //                                      {any} anykindtest;\r
684                                                 {any} akindtest;\r
686         //anykindtest      =            T.fn_node T.lparenth T.rparenth;\r
687         akindtest          =            T.fn_node T.lparenth T.rparenth;\r
688         \r
689         documenttest       =            T.fn_document_node T.lparenth documenttest_part? T.rparenth; \r
690                 documenttest_part =     {element} elementtest | \r
691                                                                 {schemaelem} schemaelementtest; \r
692                 \r
694         texttest           =            T.fn_text T.lparenth T.rparenth;\r
695         \r
696         commenttest        =            T.fn_comment T.lparenth T.rparenth;\r
697         \r
698         pitest     =            T.fn_processing_instruction T.lparenth pitest_part? T.rparenth; \r
699                 pitest_part =   {ncname} ncname | \r
700                                                 {stringlit} stringliteral; \r
701         \r
702         attributetest      =            T.axis_attribute T.lparenth attributetest_part? T.rparenth;      \r
703                 attributetest_part = attribnameorwildcard attributetest_part_part?; \r
704                 attributetest_part_part = T.comma typename; \r
705         \r
706         \r
707         attribnameorwildcard       =    {attrib} attributename | \r
708                                                                         {star} T.star;\r
709         \r
710         schemaattributetest        =            T.fn_schema_attribute T.lparenth attributedeclaration T.rparenth;\r
711         \r
712         attributedeclaration       =            attributename;\r
713         \r
714         elementtest        =            T.fn_element T.lparenth elementtest_part? T.rparenth; \r
715                 elementtest_part = elementnameorwildcard elementtest_part_part?; \r
716                 elementtest_part_part = T.comma typename T.question?; \r
717         \r
718         elementnameorwildcard      =    {element} elementname | \r
719                                                                         {star} T.star;\r
721         schemaelementtest          =            T.fn_schema_element T.lparenth elementdeclaration T.rparenth;\r
723         elementdeclaration         =            elementname;\r
725         attributename      =            qname;\r
727         elementname        =            qname;\r
729         typename           =            qname;\r
730         \r
731         \r
732         /** \r
733          * Qualified XML Names \r
734          */\r
735         qname   =       {prefixed} prefixedname | \r
736                                 {unprefixed} unprefixedname; \r
737         \r
738         prefixedname    =       prefix T.colon localpart; \r
739         \r
740         unprefixedname  =       localpart; \r
741         \r
742         prefix     =    ncname; \r
743         \r
744         localpart       =       ncname; \r
745         \r
746         \r
747         /** \r
748          * Attribute Names for Namespace \r
749          */ \r
750         nsattname       =       {prefixed} prefixedattname | \r
751                                         {default} defaultattname; \r
752         \r
753         prefixedattname =       T.xmlns T.colon ncname; \r
754         \r
755         defaultattname  =       T.xmlns; \r
756         \r
757         ncname     =    ncnamestartchar ncnamechar*;            /* An XML Name, minus the ":" */\r
758         \r
759         ncnamestartchar =       {letter} T.letter | \r
760                                                 {underscore} T.underscore ; \r