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 }