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 }