001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements. See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership. The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the  "License");
007     * you may not use this file except in compliance with the License.
008     * You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    /*
019     * $Id: OpCodes.java 468655 2006-10-28 07:12:06Z minchau $
020     */
021    package org.apache.xpath.compiler;
022    
023    /**
024     * Operations codes for XPath.
025     *
026     * Code for the descriptions of the operations codes:
027     * [UPPER CASE] indicates a literal value,
028     * [lower case] is a description of a value,
029     *      ([length] always indicates the length of the operation,
030     *       including the operations code and the length integer.)
031     * {UPPER CASE} indicates the given production,
032     * {description} is the description of a new production,
033     *      (For instance, {boolean expression} means some expression
034     *       that should be resolved to a boolean.)
035     *  * means that it occurs zero or more times,
036     *  + means that it occurs one or more times,
037     *  ? means that it is optional.
038     *
039     * returns: indicates what the production should return.
040     */
041    public class OpCodes
042    {
043    
044      /**
045       * [ENDOP]
046       * Some operators may like to have a terminator.
047       * @xsl.usage advanced
048       */
049      public static final int ENDOP = -1;
050    
051      /**
052       * [EMPTY]
053       * Empty slot to indicate NULL.
054       */
055      public static final int EMPTY = -2;
056    
057      /**
058       * [ELEMWILDCARD]
059       * Means ELEMWILDCARD ("*"), used instead
060       * of string index in some places.
061       * @xsl.usage advanced
062       */
063      public static final int ELEMWILDCARD = -3;
064    
065      /**
066       * [OP_XPATH]
067       * [length]
068       *  {expression}
069       *
070       * returns:
071       *  XNodeSet
072       *  XNumber
073       *  XString
074       *  XBoolean
075       *  XRTree
076       *  XObject
077       * @xsl.usage advanced
078       */
079      public static final int OP_XPATH = 1;
080    
081      /**
082       * [OP_OR]
083       * [length]
084       *  {boolean expression}
085       *  {boolean expression}
086       *
087       * returns:
088       *  XBoolean
089       * @xsl.usage advanced
090       */
091      public static final int OP_OR = 2;
092    
093      /**
094       * [OP_AND]
095       * [length]
096       *  {boolean expression}
097       *  {boolean expression}
098       *
099       * returns:
100       *  XBoolean
101       * @xsl.usage advanced
102       */
103      public static final int OP_AND = 3;
104    
105      /**
106       * [OP_NOTEQUALS]
107       * [length]
108       *  {expression}
109       *  {expression}
110       *
111       * returns:
112       *  XBoolean
113       * @xsl.usage advanced
114       */
115      public static final int OP_NOTEQUALS = 4;
116    
117      /**
118       * [OP_EQUALS]
119       * [length]
120       *  {expression}
121       *  {expression}
122       *
123       * returns:
124       *  XBoolean
125       * @xsl.usage advanced
126       */
127      public static final int OP_EQUALS = 5;
128    
129      /**
130       * [OP_LTE] (less-than-or-equals)
131       * [length]
132       *  {number expression}
133       *  {number expression}
134       *
135       * returns:
136       *  XBoolean
137       * @xsl.usage advanced
138       */
139      public static final int OP_LTE = 6;
140    
141      /**
142       * [OP_LT] (less-than)
143       * [length]
144       *  {number expression}
145       *  {number expression}
146       *
147       * returns:
148       *  XBoolean
149       * @xsl.usage advanced
150       */
151      public static final int OP_LT = 7;
152    
153      /**
154       * [OP_GTE] (greater-than-or-equals)
155       * [length]
156       *  {number expression}
157       *  {number expression}
158       *
159       * returns:
160       *  XBoolean
161       * @xsl.usage advanced
162       */
163      public static final int OP_GTE = 8;
164    
165      /**
166       * [OP_GT] (greater-than)
167       * [length]
168       *  {number expression}
169       *  {number expression}
170       *
171       * returns:
172       *  XBoolean
173       * @xsl.usage advanced
174       */
175      public static final int OP_GT = 9;
176    
177      /**
178       * [OP_PLUS]
179       * [length]
180       *  {number expression}
181       *  {number expression}
182       *
183       * returns:
184       *  XNumber
185       * @xsl.usage advanced
186       */
187      public static final int OP_PLUS = 10;
188    
189      /**
190       * [OP_MINUS]
191       * [length]
192       *  {number expression}
193       *  {number expression}
194       *
195       * returns:
196       *  XNumber
197       * @xsl.usage advanced
198       */
199      public static final int OP_MINUS = 11;
200    
201      /**
202       * [OP_MULT]
203       * [length]
204       *  {number expression}
205       *  {number expression}
206       *
207       * returns:
208       *  XNumber
209       * @xsl.usage advanced
210       */
211      public static final int OP_MULT = 12;
212    
213      /**
214       * [OP_DIV]
215       * [length]
216       *  {number expression}
217       *  {number expression}
218       *
219       * returns:
220       *  XNumber
221       * @xsl.usage advanced
222       */
223      public static final int OP_DIV = 13;
224    
225      /**
226       * [OP_MOD]
227       * [length]
228       *  {number expression}
229       *  {number expression}
230       *
231       * returns:
232       *  XNumber
233       * @xsl.usage advanced
234       */
235      public static final int OP_MOD = 14;
236    
237      /**
238       * [OP_QUO]
239       * [length]
240       *  {number expression}
241       *  {number expression}
242       *
243       * returns:
244       *  XNumber
245       * @xsl.usage advanced
246       */
247      public static final int OP_QUO = 15;
248    
249      /**
250       * [OP_NEG]
251       * [length]
252       *  {number expression}
253       *
254       * returns:
255       *  XNumber
256       * @xsl.usage advanced
257       */
258      public static final int OP_NEG = 16;
259    
260      /**
261       * [OP_STRING] (cast operation)
262       * [length]
263       *  {expression}
264       *
265       * returns:
266       *  XString
267       * @xsl.usage advanced
268       */
269      public static final int OP_STRING = 17;
270    
271      /**
272       * [OP_BOOL] (cast operation)
273       * [length]
274       *  {expression}
275       *
276       * returns:
277       *  XBoolean
278       * @xsl.usage advanced
279       */
280      public static final int OP_BOOL = 18;
281    
282      /**
283       * [OP_NUMBER] (cast operation)
284       * [length]
285       *  {expression}
286       *
287       * returns:
288       *  XBoolean
289       * @xsl.usage advanced
290       */
291      public static final int OP_NUMBER = 19;
292    
293      /**
294       * [OP_UNION]
295       * [length]
296       *  {PathExpr}+
297       *
298       * returns:
299       *  XNodeSet
300       * @xsl.usage advanced
301       */
302      public static final int OP_UNION = 20;
303    
304      /**
305       * [OP_LITERAL]
306       * [3]
307       * [index to token]
308       *
309       * returns:
310       *  XString
311       * @xsl.usage advanced
312       */
313      public static final int OP_LITERAL = 21;
314    
315      /** The low opcode for nodesets, needed by getFirstPredicateOpPos and 
316       *  getNextStepPos.          */
317      static final int FIRST_NODESET_OP = 22;
318    
319      /**
320       * [OP_VARIABLE]
321       * [4]
322       * [index to namespace token, or EMPTY]
323       * [index to function name token]
324       *
325       * returns:
326       *  XString
327       * @xsl.usage advanced
328       */
329      public static final int OP_VARIABLE = 22;
330    
331      /**
332       * [OP_GROUP]
333       * [length]
334       *  {expression}
335       *
336       * returns:
337       *  XNodeSet
338       *  XNumber
339       *  XString
340       *  XBoolean
341       *  XRTree
342       *  XObject
343       * @xsl.usage advanced
344       */
345      public static final int OP_GROUP = 23;
346    
347      /**
348       * [OP_EXTFUNCTION] (Extension function.)
349       * [length]
350       * [index to namespace token]
351       * [index to function name token]
352       *  {OP_ARGUMENT}
353       *
354       * returns:
355       *  XNodeSet
356       *  XNumber
357       *  XString
358       *  XBoolean
359       *  XRTree
360       *  XObject
361       * @xsl.usage advanced
362       */
363      public static final int OP_EXTFUNCTION = 24;
364    
365      /**
366       * [OP_FUNCTION]
367       * [length]
368       * [FUNC_name]
369       *  {OP_ARGUMENT}
370       * [ENDOP]
371       *
372       * returns:
373       *  XNodeSet
374       *  XNumber
375       *  XString
376       *  XBoolean
377       *  XRTree
378       *  XObject
379       * @xsl.usage advanced
380       */
381      public static final int OP_FUNCTION = 25;
382    
383      /** The last opcode for stuff that can be a nodeset.         */
384      static final int LAST_NODESET_OP = 25;
385    
386      /**
387       * [OP_ARGUMENT] (Function argument.)
388       * [length]
389       *  {expression}
390       *
391       * returns:
392       *  XNodeSet
393       *  XNumber
394       *  XString
395       *  XBoolean
396       *  XRTree
397       *  XObject
398       * @xsl.usage advanced
399       */
400      public static final int OP_ARGUMENT = 26;
401    
402      /**
403       * [OP_NUMBERLIT] (Number literal.)
404       * [3]
405       * [index to token]
406       *
407       * returns:
408       *  XString
409       * @xsl.usage advanced
410       */
411      public static final int OP_NUMBERLIT = 27;
412    
413      /**
414       * [OP_LOCATIONPATH]
415       * [length]
416       *   {FROM_stepType}
417       * | {function}
418       * {predicate}
419       * [ENDOP]
420       *
421       * (Note that element and attribute namespaces and
422       * names can be wildcarded '*'.)
423       *
424       * returns:
425       *  XNodeSet
426       * @xsl.usage advanced
427       */
428      public static final int OP_LOCATIONPATH = 28;
429    
430      // public static final int LOCATIONPATHEX_MASK = 0x0000FFFF;
431      // public static final int LOCATIONPATHEX_ISSIMPLE = 0x00010000;
432      // public static final int OP_LOCATIONPATH_EX = (28 | 0x00010000);
433    
434      /**
435       * [OP_PREDICATE]
436       * [length]
437       *  {expression}
438       * [ENDOP] (For safety)
439       *
440       * returns:
441       *  XBoolean or XNumber
442       * @xsl.usage advanced
443       */
444      public static final int OP_PREDICATE = 29;
445    
446      /**
447       * [OP_MATCHPATTERN]
448       * [length]
449       *  {PathExpr}+
450       *
451       * returns:
452       *  XNodeSet
453       * @xsl.usage advanced
454       */
455      public static final int OP_MATCHPATTERN = 30;
456    
457      /**
458       * [OP_LOCATIONPATHPATTERN]
459       * [length]
460       *   {FROM_stepType}
461       * | {function}{predicate}
462       * [ENDOP]
463       * returns:
464       *  XNodeSet
465       * @xsl.usage advanced
466       */
467      public static final int OP_LOCATIONPATHPATTERN = 31;
468    
469      /**
470       * [NODETYPE_COMMENT]
471       * No size or arguments.
472       * Note: must not overlap function OP number!
473       *
474       * returns:
475       *  XBoolean
476       * @xsl.usage advanced
477       */
478      public static final int NODETYPE_COMMENT = 1030;
479    
480      /**
481       * [NODETYPE_TEXT]
482       * No size or arguments.
483       * Note: must not overlap function OP number!
484       *
485       * returns:
486       *  XBoolean
487       * @xsl.usage advanced
488       */
489      public static final int NODETYPE_TEXT = 1031;
490    
491      /**
492       * [NODETYPE_PI]
493       * [index to token]
494       * Note: must not overlap function OP number!
495       *
496       * returns:
497       *  XBoolean
498       * @xsl.usage advanced
499       */
500      public static final int NODETYPE_PI = 1032;
501    
502      /**
503       * [NODETYPE_NODE]
504       * No size or arguments.
505       * Note: must not overlap function OP number!
506       *
507       * returns:
508       *  XBoolean
509       * @xsl.usage advanced
510       */
511      public static final int NODETYPE_NODE = 1033;
512    
513      /**
514       * [NODENAME]
515       * [index to ns token or EMPTY]
516       * [index to name token]
517       *
518       * returns:
519       *  XBoolean
520       * @xsl.usage advanced
521       */
522      public static final int NODENAME = 34;
523    
524      /**
525       * [NODETYPE_ROOT]
526       * No size or arguments.
527       *
528       * returns:
529       *  XBoolean
530       * @xsl.usage advanced
531       */
532      public static final int NODETYPE_ROOT = 35;
533    
534      /**
535       * [NODETYPE_ANY]
536       * No size or arguments.
537       *
538       * returns:
539       *  XBoolean
540       * @xsl.usage advanced
541       */
542      public static final int NODETYPE_ANYELEMENT = 36;
543    
544      /**
545       * [NODETYPE_ANY]
546       * No size or arguments.
547       *
548       * returns:
549       *  XBoolean
550       * @xsl.usage advanced
551       */
552      public static final int NODETYPE_FUNCTEST = 1034;
553    
554      /**
555       * [FROM_stepType]
556       * [length, including predicates]
557       * [length of just the step, without the predicates]
558       * {node test}
559       * {predicates}?
560       *
561       * returns:
562       *  XBoolean
563       * @xsl.usage advanced
564       */
565      public static final int AXES_START_TYPES = 37;
566    
567      /** ancestor axes opcode.         */
568      public static final int FROM_ANCESTORS = 37;
569    
570      /** ancestor-or-self axes opcode.         */
571      public static final int FROM_ANCESTORS_OR_SELF = 38;
572    
573      /** attribute axes opcode.         */
574      public static final int FROM_ATTRIBUTES = 39;
575    
576      /** children axes opcode.         */
577      public static final int FROM_CHILDREN = 40;
578    
579      /** descendants axes opcode.         */
580      public static final int FROM_DESCENDANTS = 41;
581    
582      /** descendants-of-self axes opcode.         */
583      public static final int FROM_DESCENDANTS_OR_SELF = 42;
584    
585      /** following axes opcode.         */
586      public static final int FROM_FOLLOWING = 43;
587    
588      /** following-siblings axes opcode.         */
589      public static final int FROM_FOLLOWING_SIBLINGS = 44;
590    
591      /** parent axes opcode.         */
592      public static final int FROM_PARENT = 45;
593    
594      /** preceding axes opcode.         */
595      public static final int FROM_PRECEDING = 46;
596    
597      /** preceding-sibling axes opcode.         */
598      public static final int FROM_PRECEDING_SIBLINGS = 47;
599    
600      /** self axes opcode.         */
601      public static final int FROM_SELF = 48;
602    
603      /** namespace axes opcode.         */
604      public static final int FROM_NAMESPACE = 49;
605    
606      /** '/' axes opcode.         */
607      public static final int FROM_ROOT = 50;
608    
609      /**
610       * For match patterns.
611       * @xsl.usage advanced
612       */
613      public static final int MATCH_ATTRIBUTE = 51;
614    
615      /**
616       * For match patterns.
617       * @xsl.usage advanced
618       */
619      public static final int MATCH_ANY_ANCESTOR = 52;
620    
621      /**
622       * For match patterns.
623       * @xsl.usage advanced
624       */
625      public static final int MATCH_IMMEDIATE_ANCESTOR = 53;
626    
627      /** The end of the axes types.    */
628      public static final int AXES_END_TYPES = 53;
629    
630      /** The next free ID.  Please keep this up to date.  */
631      private static final int NEXT_FREE_ID = 99;
632    }