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