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