X-Git-Url: http://git.phpeclipse.com diff --git a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/sql/parser/SQLLexx.java b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/sql/parser/SQLLexx.java new file mode 100644 index 0000000..e901266 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/sql/parser/SQLLexx.java @@ -0,0 +1,166 @@ +package com.quantum.sql.parser; + +import java.util.Vector; + +public class SQLLexx { + private static String endline = ";"; //$NON-NLS-1$ + private static String dash = "-"; //$NON-NLS-1$ + private static String group = "/"; //$NON-NLS-1$ + /** + * Parses a SQL text into tokens. + * @param text + * @return a vector of Token objects. + */ + public static Vector parse(String text) { + Vector tokens = new Vector(); + StringPointer p = new StringPointer(text); + try { + while (!p.isDone()) { + int offset = p.getOffset(); + char c = p.getNext(); + // Adds END_OF_LINE token + if (c == '\n') { + tokens.addElement(new Token(Token.END_OF_LINE, "\n", offset, offset + 1)); + } + // Adds WHITESPACE token; + else if (Character.isWhitespace(c)) { + StringBuffer value = new StringBuffer(); + while (Character.isWhitespace(c) && !p.isDone()) { + value.append(c); + c = p.getNext(); + } + // done because of is done + if (Character.isWhitespace(c)) { + value.append(c); + } else if (!p.isDone()){ + p.back(); + } + tokens.addElement(new Token(Token.WHITESPACE, value.toString(), offset, offset + value.length())); + // Adds IDENTIFIER token (can be reserved SQL word or not); + } else if (Character.isLetter(c) || c == '_' || c == '$') { + StringBuffer value = new StringBuffer(); + while ((Character.isLetterOrDigit(c) || c == '_' || c == '$') && !p.isDone()) { + value.append(c); + c = p.getNext(); + } + if ((Character.isLetterOrDigit(c) || c == '_')) { + value.append(c); + } else if (!p.isDone()){ + p.back(); + } + tokens.addElement(new Token(Token.IDENTIFIER, value.toString(), offset, offset + value.length())); + // Adds LITERAL token; + } else if (c == '\'') { + StringBuffer value = new StringBuffer(); + value.append(c); + if (!p.isDone()) { + c = p.getNext(); + while (c != '\'' && c != '\n' && !p.isDone()) { + value.append(c); + c = p.getNext(); + } + if (c == '\'' || p.isDone()) { + value.append(c); + } else if (!p.isDone()){ + p.back(); + } + } + tokens.addElement(new Token(Token.LITERAL, value.toString(), offset, offset + value.length())); + // Adds COMMENT token (or SYMBOL (dash) if only one dash); + } else if (c == '-') { + p.mark(); + if (p.isDone()) { + tokens.addElement(new Token(Token.SYMBOL, dash, offset, offset + 1)); + } else { + char next = p.getNext(); + if (next == '-') { + StringBuffer value = new StringBuffer("--"); //$NON-NLS-1$ + if (!p.isDone()) { + c = p.getNext(); + while (c != '\n' && !p.isDone()) { + value.append(c); + c = p.getNext(); + } + if (p.isDone()) { + value.append(c); + } else { + p.back(); + } + } + tokens.addElement(new Token(Token.COMMENT, value.toString(), offset, offset + value.length())); + } else { + tokens.addElement(new Token(Token.SYMBOL, dash, offset, offset + 1)); + p.reset(); + } + } + // Adds SEPARATOR token (;), considers the rest of the line as COMMENT token; + } else if (c == ';') { + tokens.addElement(new Token(Token.SEPARATOR, endline, offset, offset + 1)); + StringBuffer value = new StringBuffer(); + if (!p.isDone()) { + c = p.getNext(); + while (c != '\n' && !p.isDone()) { + value.append(c); + c = p.getNext(); + } + if (p.isDone()) { + value.append(c); + } else { + p.back(); + } + // We add to the offset so as to skip the initial ';' + offset++; + tokens.addElement(new Token(Token.COMMENT, value.toString(), offset, offset + value.length())); + } + // Adds NUMERIC token; + } else if (Character.isDigit(c)) { + StringBuffer value = new StringBuffer(); + while ((Character.isDigit(c) || c == '.') && !p.isDone()) { + value.append(c); + c = p.getNext(); + } + if ((Character.isDigit(c) || c == '.')) { + value.append(c); + } else { + p.back(); + } + tokens.addElement(new Token(Token.NUMERIC, value.toString(), offset, offset + value.length())); + // Adds COMMENT token (or GROUP (slash) if only one slash); + } else if (c == '/') { + p.mark(); + // If we have '/*', it's a comment till '*/' found or eof + if (p.peek() == '*') { + StringBuffer value = new StringBuffer(); + c = p.getNext(); + value.append('/'); + while (!( c == '*' && p.peek() == '/' ) && !p.isDone()) { + value.append(c); + c = p.getNext(); + } + if (!p.isDone()){ + value.append(c); + c = p.getNext(); + value.append(c); + } + tokens.addElement(new Token(Token.COMMENT, value.toString(), offset, offset + value.length())); + } else { + // It's not '/*' , so it's a group token + tokens.addElement(new Token(Token.GROUP, group, offset, offset + 1)); + p.reset(); + } + // Adds SYMBOL token; + } else { + tokens.addElement(new Token(Token.SYMBOL, new String(new char[] {c}), offset, offset + 1)); + } + } + } catch (RuntimeException e) { + e.printStackTrace(); + } + +// System.out.println("-------------------"); +// for (int i = 0; i < tokens.size(); i++) { +// System.out.println((Token) tokens.elementAt(i)); +// } + return tokens; + } +}