Exemplo n.º 1
0
  /**
   * Main function. Takes OQL query string as command line parameter and prints token stream version
   * of that query to stdout.
   *
   * @param args Pass an OQL query string on the command line.
   */
  public static void main(String args[]) {

    Hashtable tokenTypes = new Hashtable();
    tokenTypes.put(new Integer(END_OF_QUERY), "END_OF_QUERY");
    tokenTypes.put(new Integer(KEYWORD_SELECT), "KEYWORD_SELECT");
    tokenTypes.put(new Integer(IDENTIFIER), "IDENTIFIER");
    tokenTypes.put(new Integer(KEYWORD_AS), "KEYWORD_AS");
    tokenTypes.put(new Integer(COLON), "COLON");
    tokenTypes.put(new Integer(KEYWORD_FROM), "KEYWORD_FROM");
    tokenTypes.put(new Integer(KEYWORD_IN), "KEYWORD_IN");
    tokenTypes.put(new Integer(KEYWORD_WHERE), "KEYWORD_WHERE");
    tokenTypes.put(new Integer(KEYWORD_OR), "KEYWORD_OR");
    tokenTypes.put(new Integer(KEYWORD_AND), "KEYWORD_AND");
    tokenTypes.put(new Integer(EQUAL), "EQUAL");
    tokenTypes.put(new Integer(NOT_EQUAL), "NOT_EQUAL");
    tokenTypes.put(new Integer(KEYWORD_LIKE), "KEYWORD_LIKE");
    tokenTypes.put(new Integer(LT), "LT");
    tokenTypes.put(new Integer(LTE), "LTE");
    tokenTypes.put(new Integer(GT), "GT");
    tokenTypes.put(new Integer(GTE), "GTE");
    tokenTypes.put(new Integer(PLUS), "PLUS");
    tokenTypes.put(new Integer(MINUS), "MINUS");
    tokenTypes.put(new Integer(CONCAT), "CONCAT");
    tokenTypes.put(new Integer(TIMES), "TIMES");
    tokenTypes.put(new Integer(DIVIDE), "DIVIDE");
    tokenTypes.put(new Integer(KEYWORD_MOD), "KEYWORD_MOD");
    tokenTypes.put(new Integer(KEYWORD_ABS), "KEYWORD_ABS");
    tokenTypes.put(new Integer(KEYWORD_NOT), "KEYWORD_NOT");
    tokenTypes.put(new Integer(LPAREN), "LPAREN");
    tokenTypes.put(new Integer(RPAREN), "RPAREN");
    tokenTypes.put(new Integer(DOLLAR), "DOLLAR");
    tokenTypes.put(new Integer(KEYWORD_NIL), "KEYWORD_NIL");
    tokenTypes.put(new Integer(KEYWORD_UNDEFINED), "KEYWORD_UNDEFINED");
    tokenTypes.put(new Integer(BOOLEAN_LITERAL), "BOOLEAN_LITERAL");
    tokenTypes.put(new Integer(LONG_LITERAL), "LONG_LITERAL");
    tokenTypes.put(new Integer(DOUBLE_LITERAL), "DOUBLE_LITERAL");
    tokenTypes.put(new Integer(CHAR_LITERAL), "CHAR_LITERAL");
    tokenTypes.put(new Integer(STRING_LITERAL), "STRING_LITERAL");
    tokenTypes.put(new Integer(DATE_LITERAL), "DATE_LITERAL");
    tokenTypes.put(new Integer(TIME_LITERAL), "TIME_LITERAL");
    tokenTypes.put(new Integer(TIMESTAMP_LITERAL), "TIMESTAMP_LITERAL");
    tokenTypes.put(new Integer(KEYWORD_BETWEEN), "KEYWORD_BETWEEN");

    Lexer lexer = new Lexer(args[0]);
    while (lexer.hasMoreTokens()) {
      try {
        Token theToken = lexer.nextToken();
        String tokenType = (String) tokenTypes.get(new Integer(theToken.getTokenType()));
        System.out.println(tokenType + " : " + theToken.getTokenValue());
      } catch (Exception e) {
        System.out.println(e.toString());
        e.printStackTrace(System.out);
        break;
      }
    }
  }
  public Object getNext() {
    // getNext() gets the next item on stack, pointed to by the stackPointer:
    // - if stack is empty, it gets a token from Lexer and returns it, setting SP = 1
    // **(in this case, the newly returned element is put on stack)
    // - if SP is pointing to an existing element of stack, that element is returned, setting
    // SP=SP+1
    //
    // - if SP is pointing right above stack, a new token from Lexer is returned, setting SP=SP+1
    // **(in this case, the newly returned element is put on stack)
    //
    // if SP points to something that is way above stack, it returns an EOFToken().

    if (stack.size() == 0) {
      // System.out.println("I read " + lexer.peekNextToken());
      if (lexer.hasMoreTokens()) {
        stack.add(lexer.getNextToken());
        stackPointer++;
        return stack.get(stackPointer - 1);
      } else return new EOFToken();
    } else if (stackPointer < stack.size()) {
      return stack.get(stackPointer++);
    } else if (stackPointer == stack.size()) // execute this case only if
    // stackpointer points to element right on top of stack, i.e. asks for a new element
    {
      if (lexer.hasMoreTokens()) {
        stack.add(lexer.getNextToken());
        return stack.get(stackPointer++);
      } else return new EOFToken();
    } else { // execute this case if stackpointer is point somewhere absurdly above the top of stack
      if (diag2)
        System.out.println(
            "**Diag warning: invalid stack ref: getNext(), SP="
                + stackPointer
                + " for a stack of size "
                + stack.size());
      return new EOFToken();
    }
  }