/** * 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(); } }