/* * $Id: oracle-create-table.jj,v 1.1.1.1 2003/05/26 01:53:54 yoonforh Exp $ * * Copyright (c) 2003 by Yoon Kyung Koo. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL YOON KYUNG KOO OR THE OTHER * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ options { IGNORE_CASE = true; UNICODE_INPUT = true; // accept non-ascii input // DEBUG_PARSER = true; } PARSER_BEGIN(OracleCreateTableParser) package yoonforh.codegen.parser; import java.io.*; import java.util.*; /** * refer to Oracle 9i SQL reference * * @version $Revision: 1.1.1.1 $
* created at 2003-04-14 15:21:19 * @author Yoon Kyung Koo */ public class OracleCreateTableParser { /** test run */ public static void main(String[] args) throws ParseException, IOException { if (args.length < 1) { System.err.println("usage : java OracleCreateTableParser "); System.exit(0); } OracleCreateTableParser parser = new OracleCreateTableParser( new FileInputStream(args[0])); /* SimpleNode node = parser.SQLSheet(); node.dump(">"); */ HashMap tableMap = new HashMap(); parser.SQLSheet(tableMap); System.out.println("parse result map - " + tableMap); } public static class TableInfo implements Serializable { private String name = null; private ArrayList pkList = new ArrayList(); private HashMap fieldMap = new HashMap(); public TableInfo(String name) { this.name = name; } public String getName() { return name; } public ArrayList getPKList() { return pkList; } public HashMap getFieldMap() { return fieldMap; } public void setName(String name) { this.name = name; } public void addPK(String pk) { pkList.add(pk); } public void addField(String name, FieldType type) { fieldMap.put(name, type); } public String toString() { return "TableInfo(name - " + name + ", pk list - " + pkList + ", field map - " + fieldMap + ")"; } } public static class FieldType implements Serializable { private String name = null; private String size = null; public FieldType(String name) { this(name, null); } public FieldType(String name, String size) { this.name = name; this.size = size; } public String getName() { return name; } public String getSize() { return size; } public void setName(String name) { this.name = name; } public void setSize(String size) { this.size = size; } public String toString() { return "FieldType(name - " + name + ", size - " + size + ")"; } } } PARSER_END(OracleCreateTableParser) /* WHITE SPACE */ SKIP : { " " | "\t" | "\n" | "\r" | "\f" } /* COMMENTS */ MORE : { "--" : IN_SINGLE_LINE_COMMENT | "/*" : IN_MULTI_LINE_COMMENT } SPECIAL_TOKEN : { : DEFAULT } SPECIAL_TOKEN : { : DEFAULT } MORE : { < ~[] > } SPECIAL_TOKEN : { : DEFAULT } MORE : { < ~[] > } /* ORACLE 9i RESERVED WORDS */ TOKEN : { < ACCESS : "access" > | < ADD : "add" > | < ALL : "all" > | < ALTER : "alter" > | < AND : "and" > | < ANY : "any" > | < AS : "as" > | < ASC : "asc" > | < AUDIT : "audit" > | < BETWEEN : "between" > | < BY : "by" > | < CHAR : "char" > | < CHECK : "check" > | < CLUSTER : "cluster" > | < COLUMN : "column" > | < COMMENT : "comment" > | < COMPRESS : "compress" > | < CONNECT : "connect" > | < CREATE : "create" > | < CURRENT : "current" > | < DATE : "date" > | < DECIMAL : "decimal" > | < DEFAULT_STRING : "default" > | < DELETE : "delete" > | < DESC : "desc" > | < DISTINCT : "distinct" > | < DROP : "drop" > | < ELSE : "else" > | < EXCLUSIVE : "exclusive" > | < EXISTS : "exists" > | < FILE : "file" > | < FLOAT : "float" > | < FOR : "for" > | < FROM : "from" > | < GRANT : "grant" > | < GROUP : "group" > | < HAVING : "having" > | < IDENTIFIED : "identified" > | < IMMEDIATE : "immediate" > | < IN : "in" > | < INCREMENT : "increment" > | < INDEX : "index" > | < INITIAL : "initial" > | < INSERT : "insert" > | < INTEGER : "integer" > | < INTERSECT : "intersect" > | < INTO : "into" > | < IS : "is" > | < LEVEL : "level" > | < LIKE : "like" > | < LOCK : "lock" > | < LONG : "long" > | < MAXEXTENTS : "maxextents" > | < MINUS : "minus" > | < MLSLABEL : "mlslabel" > | < MODE : "mode" > | < MODIFY : "modify" > | < NOAUDIT : "noaudit" > | < NOCOMPRESS : "nocompress" > | < NOT : "not" > | < NOWAIT : "nowait" > | < NULL : "null" > | < NUMBER : "number" > | < OF : "of" > | < OFFLINE : "offline" > | < ON : "on" > | < ONLINE : "online" > | < OPTION : "option" > | < OR : "or" > | < ORDER : "order" > | < PCTFREE : "pctfree" > | < PRIOR : "prior" > | < PRIVILEGES : "privileges" > | < PUBLIC : "public" > | < RAW : "raw" > | < RENAME : "rename" > | < RESOURCE : "resource" > | < REVOKE : "revoke" > | < ROW : "row" > | < ROWID : "rowid" > | < ROWNUM : "rownum" > | < ROWS : "rows" > | < SELECT : "select" > | < SESSION : "session" > | < SET : "set" > | < SHARE : "share" > | < SIZE : "size" > | < SMALLINT : "smallint" > | < START : "start" > | < SUCCESSFUL : "successful" > | < SYNONYM : "synonym" > | < SYSDATE : "sysdate" > | < TABLE : "table" > | < THEN : "then" > | < TO : "to" > | < TRIGGER : "trigger" > | < UID : "uid" > | < UNION : "union" > | < UNIQUE : "unique" > | < UPDATE : "update" > | < USER : "user" > | < VALIDATE : "validate" > | < VALUES : "values" > | < VARCHAR : "varchar" > | < VARCHAR2 : "varchar2" > | < VIEW : "view" > | < WHENEVER : "whenever" > | < WHERE : "where" > | < WITH : "with" > } /* UNRESERVED KEYWORDS */ TOKEN : { < ALWAYS : "always" > | < ANALYZE : "analyze" > | < ASSOCIATE : "associate" > | < AT : "at" > | < BFILE : "bfile" > | < BITMAP : "bitmap" > | < BLOB : "blob" > | < BODY : "body" > | < BUFFER_POOL : "buffer_pool" > | < BYTE : "byte" > | < CACHE : "cache" > | < CALL : "call" > | < CASCADE : "cascade" > | < CASE : "case" > | < CHARACTER : "character" > | < CHUNK : "chunk" > | < CLOB : "clob" > | < COLUMN_VALUE : "column_value" > | < COMMIT : "commit" > | < COMPUTE : "compute" > | < CONSTRAINT : "constraint" > | < CONTEXT : "context" > | < CONTROLFILE : "controlfile" > | < CUBE : "cube" > | < CURRVAL : "currval" > | < CURSOR : "cursor" > | < DATABASE : "database" > | < DAY : "day" > | < DBTIMEZONE : "dbtimezone" > | < DEC : "dec" > | < DEFERRABLE : "deferrable" > | < DEFERRED : "deferred" > | < DIMENSION : "dimension" > | < DIRECTORY : "directory" > | < DISABLE : "disable" > | < DISASSOCIATE : "disassociate" > | < DOUBLE : "double" > | < ELEMENT : "element" > | < ENABLE : "enable" > | < END : "end" > | < EQUALS_PATH : "equals_path" > | < ESCAPE : "escape" > | < EXCEPTIONS : "exceptions" > | < EXPLAIN : "explain" > | < EXTERNAL : "external" > | < FIRST : "first" > | < FOREIGN : "foreign" > | < FREELIST : "freelist" > | < FREELISTS : "freelists" > | < FREEPOOLS : "freepools" > | < FUNCTION : "function" > | < GLOBAL : "global" > | < GROUPING : "grouping" > | < GROUPS : "groups" > | < HASH : "hash" > | < HEAP : "heap" > | < HH : "hh" > | < INCLUDING : "including" > | < INDEXTYPE : "indextype" > | < INDICATOR : "indicator" > | < INITIALLY : "initially" > | < INITRANS : "initrans" > | < INT : "int" > | < INTERVAL : "interval" > | < JAVA : "java" > | < KEEP : "keep" > | < KEY : "key" > | < LAST : "last" > | < LESS_STRING : "less" > | < LEVELS : "levels" > | < LIBRARY : "library" > | < LIKE2 : "like2" > | < LIKE4 : "like4" > | < LIKEC : "likec" > | < LIMIT : "limit" > | < LINK : "link" > | < LIST : "list" > | < LOB : "lob" > | < LOCAL : "local" > | < LOCATION : "location" > | < LOCATOR : "locator" > | < LOG : "log" > | < LOGGING : "logging" > | < MAPPING : "mapping" > | < MATERIALIZED : "materialized" > | < MAXTRANS : "maxtrans" > | < MAXVALUE : "maxvalue" > | < MERGE : "merge" > | < MINEXTENTS : "minextents" > | < MM : "mm" > | < MONITORING : "monitoring" > | < MONTH : "month" > | < MOVEMENT : "movement" > | < NATIONAL : "national" > | < NCHAR : "nchar" > | < NCLOB : "nclob" > | < NESTED : "nested" > | < NEW : "new" > | < NEXT : "next" > | < NEXTVAL : "nextval" > | < NOCACHE : "nocache" > | < NOLOGGING : "nologging" > | < NOMAPPING : "nomapping" > | < NOMONITORING : "nomonitoring" > | < NOPARALLEL : "noparallel" > | < NORELY : "norely" > | < NOROWDEPENDENCIES : "norowdependencies" > | < NOSORT : "nosort" > | < NOVALIDATE : "novalidate" > | < NULLS : "nulls" > | < NUMERIC : "numeric" > | < NVARCHAR2 : "nvarchar2" > | < OBJECT : "object" > | < ONLY : "only" > | < OPERATOR : "operator" > | < OPTIMAL : "optimal" > | < ORGANIZATION : "organization" > | < OUTLINE : "outline" > | < OVERFLOW : "overflow" > | < PACKAGE : "package" > | < PARALLEL : "parallel" > | < PARAMETERS : "parameters" > | < PARTITION : "partition" > | < PARTITIONS : "partitions" > | < PCTHRESHOLD : "pcthreshold" > | < PCTINCREASE : "pctincrease" > | < PCTUSED : "pctused" > | < PCTVERSION : "pctversion" > | < PFILE : "pfile" > | < PRECISION : "precision" > | < PRESERVE : "preserve" > | < PRIMARY : "primary" > | < PROCEDURE : "procedure" > | < QUOTE : "'" > | < RANGE : "range" > | < READS : "reads" > | < REAL : "real" > | < RECYCLE : "recycle" > | < REF : "ref" > | < REFERENCES : "references" > | < REJECT : "reject" > | < RELATIONAL : "relational" > | < RELY : "rely" > | < RETENTION : "retention" > | < RETURN : "return" > | < REVERSE : "reverse" > | < ROLE : "role" > | < ROLLBACK : "rollback" > | < ROLLUP : "rollup" > | < ROWDEPENDENCIES : "rowdependencies" > | < SAVEPOINT : "savepoint" > | < SCHEMA : "schema" > | < SCOPE : "scope" > | < SECOND : "second" > | < SEGMENT : "segment" > | < SEQUENCE : "sequence" > | < SESSIONTIMEZONE : "sessiontimezone" > | < SETS : "sets" > | < SHARP : "#" > | < SIBLINGS : "siblings" > | < SOME : "some" > | < SORT : "sort" > | < SPFILE : "spfile" > | < STATISTICS : "statistics" > | < STORAGE : "storage" > | < STORE : "store" > | < SUBPARTITION : "subpartition" > | < SUBPARTITIONS : "subpartitions" > | < SUBSTITUTABLE : "substitutable" > | < SUPPLEMENTAL : "supplemental" > | < TABLESPACE : "tablespace" > | < TEMPLATE : "template" > | < TEMPORARY : "temporary" > | < THAN : "than" > | < TIME : "time" > | < TIMESTAMP : "timestamp" > | < TRUNCATE : "truncate" > | < TYPE : "type" > | < UNDER_PATH : "under_path" > | < UNLIMITED : "unlimited" > | < UROWID : "urowid" > | < USING : "using" > | < VALUE : "value" > | < VARRAY : "varray" > | < VARYING : "varying" > | < WHEN : "when" > | < XMLSCHEMA : "xmlschema" > | < XMLTYPE : "xmltype" > | < YEAR : "year" > | < ZONE : "zone" > } TOKEN: /* Separators and operators */ { < ASSIGN: ":=" > | < CONCAT: "||" > | < SEMICOLON: ";" > | < DOT: "." > | < ROWTYPE: "%ROWTYPE" > | < TILDE: "~" > | < JOINPLUS: "(+)" > | < OPENPAREN: "(" > | < CLOSEPAREN: ")" > | < ASTERISK: "*" > | < SLASH: "/" > | < PLUS: "+" > | < MINUS_OP: "-" > | < QUESTIONMARK: "?" > | < LESS: "<" > | < LESSEQUAL: "<=" > | < GREATER: ">" > | < GREATEREQUAL: ">=" > | < EQUAL: "=" > | < NOTEQUAL: "!=" > | < NOTEQUAL2: "<>" > } /* IDENTIFIER */ TOKEN: { < IDENTIFIER: ( )+ ( | |)* > | < LETTER: ["a"-"z", "A"-"Z"] > | < #SPECIAL_CHARS: "$" | "_"> | < BIND: ":" ("." )? > | < CHAR_LITERAL: "'" (~["'"])* "'" ("'" (~["'"])* "'")*> | < QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])* "\"" > } /* Numeric Constants */ TOKEN: { < DIGIT : [ "0" - "9" ] > } /*********************************************** * THE ORACLE CREATE TABLE GRAMMAR STARTS HERE * ***********************************************/ /* * @param tableMap - map */ void SQLSheet(HashMap tableMap) : {} { ( ( LOOKAHEAD(4) CreateTableStatement(tableMap) ( "/" | ";" ) | LOOKAHEAD(3) CreateIndexStatement() ( "/" | ";" ) | LOOKAHEAD(2) SkipUnsupportedStatement() ) )* } /* * here we only deal with relation table creation */ void CreateTableStatement(HashMap tableMap) : { String tableName = null; TableInfo tableInfo = null; } { "create" [ "global" "temporary" ] "table" [ LOOKAHEAD(2) Schema() "." ] tableName = Table() { tableInfo = new TableInfo(tableName.toLowerCase()); tableMap.put(tableName.toLowerCase(), tableInfo); } [ "(" RelationalProperties(tableInfo) ")" ] [ "on" "commit" ( "delete" | "preserve" ) "rows" ] (LOOKAHEAD( PhysicalProperties() ) PhysicalProperties() | {}) (LOOKAHEAD( TableProperties(tableInfo) ) TableProperties(tableInfo) | {}) } void SkipUnsupportedStatement() : {} { ( ( | | | [ ] | | | | | | | [ ] | | | [ ] | | | | | | | | | | | | [ ] | | ) | | | | | | | | | | | | | | | | | | | | |