/*********************************************************************** * Token definitions ***********************************************************************/ /* There may be tokens here which don't relate to SQL, but we needed for the rest of our project [Kevin] */ SKIP: { " " | "\n" | "\r" | "\t" } SKIP: { { SC.addComment(SC.fout.printBlock("//" + image.toString().substring(2))); } } SKIP: { { SC.addComment(SC.fout.printBlock(image.toString()) + SC.fout.println()); } } TOKEN: /* Keywords */ { < ALL: "all" > | < AND: "and" > | < ASC: "asc" > | < BEGIN: "begin" > | < BETWEEN: "between" > | < BOOLEAN: "boolean" > | < BY: "by" > | < CHAR: "char" > | < CHARACTER: "character" > | < CONSTANT: "constant" > | < CURSOR: "cursor" > | < DESC: "desc" > | < DISTINCT: "distinct" > | < ELSE: "else" > | < ELSIF : "elsif" > | < END: "end" > | < FROM: "from" > | < GROUP: "group" > | < HAVING: "having" > | < IF: "if" > | < INTEGER: "integer" > | < IN: "in" > | < IS: "is" > | < LIKE: "like" > | < MAX: "max" > | < MIN: "min" > | < NOT: "not" > | < NULL: "null" > | < NUMBER: "number" > | < OR: "or" > | < ORDER: "order" > | < PROCEDURE: "procedure" > | < RECORD: "record" > | < SELECT: "select" > | < SMALLINT: "smallint" > | < SPACES: "spaces" > | < SUBSTR: "substr" > | < SUM: "sum" > | < THEN: "then" > | < TYPE: "type" > | < USER: "user" > | < UPPER: "upper" > | < VARCHAR2: "varchar2" > | < WHERE: "where" > | < ZERO: "zero" > | < ZEROS: "zeros" > //*************************************************************************************** | < COUNT: "count" > | < CLOSE: "close" > | < CONVERT_TIMESTAMP_TO_DATE: "ConvertTimeStampToDate" > | < DELETE: "delete" > | < EXISTS: "exists" > | < EXIT: "exit" > | < EXCEPTION: "exception" > | < FETCH: "fetch" > | < FOR: "for" > | < FORMAT_AUDIT_HEADER: "FormatAuditHeader" > | < FORMAT_ATTRIBUTE_SUBSTRING: "FormatAttributeSubString" > | < GET_CURRENT_TIMESTAMP: "GetCurrentTimeStamp" > | < INSERT: "insert" > | < INTO: "into" > | < INDEX_BY: "index by binary_integer" > | < IS_TABLE_OF: "is table of" > | < LENGTH: "length" > | < LOOP: "loop" > | < LPAD: "lpad" > | < LTRIM: "ltrim" > | < REPLACE: "replace" > | < RTRIM: "rtrim" > | < NODULE: "nodule" > | < NOTFOUND: "%notFound" > | < OPEN: "open" > | < OTHERS: "others" > | < ORIGINPLUS: "originplus" > | < REPLY: "reply" > | < REPLY_REPEATING_GROUP: "replyRepeatingGroup" > | < REQUEST: "request" > | < ROW_NOT_FOUND: "row_not_found" > | < SET: "set" > | < SQL_I_O_CORRECT: "sql_I_O_Correct" > | < TO_CHAR: "to_char" > | < TO_NUMBER: "to_number" > | < UPDATE: "update" > | < VALUES: "values" > | < WHEN: "when" > | < WHILE: "while" > } TOKEN: { < NO_DATA_FOUND: "NO_DATA_FOUND" > | < TABLE_STATUS: "TABLE_STATUS" > | < SQLCODE: "SQLCode" > | < SET_ROW_NOT_FOUND: "Set_Row_Not_Found" > | < FILE_NAME_OF_ERROR_AREA: "FILE_NAME_OF_ERROR_AREA" > | < KEY_IN_ERROR: "KEY_IN_ERROR" > | < ERROR_DETAIL_DESCRIPTION: "ERROR_DETAIL_DESCRIPTION" > | < SETUPFATALERROR: "SetupFatalError" > } TOKEN: { < OPENDESCRIPTION: "\r\n" > : DESCRIPTION_STATE } TOKEN: /* Line */ { < CLOSEDESCRIPTION: "~" > : DEFAULT | < DESCRIPTION: (~["~"])* "~" > : DEFAULT } TOKEN: /* Literals */ { < INTEGER_LITERAL: (["0"-"9"])+ > | < FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])+ ()? | "." (["0"-"9"])+ ()? | (["0"-"9"])+ | (["0"-"9"])+ ()? > | < #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ > | < STRING_LITERAL: "'" (~["'"])* ( "''" (~["'"])* )* "'" > } TOKEN: /* Identifiers */ { < ID: ( )+ ( "_" | "$" | "#" | | )* > | < #LETTER: ["A"-"Z", "a"-"z"] > | < #DIGIT: ["0"-"9"] > } TOKEN: /* Separators and operators */ { < ASSIGN: ":=" > | < CONCAT: "||" > | < SEMICOLON: ";" > | < DOT: "." > | < ROWTYPE: "%ROWTYPE" > | < TILDE: "~" > | < LESS: "<" > | < LESSEQUAL: "<=" > | < GREATER: ">" > | < GREATEREQUAL: ">=" > | < EQUAL: "=" > | < NOTEQUAL: "!=" > | < NOTEQUAL2: "<>" > | < JOINPLUS: "(+)" > | < OPENPAREN: "(" > | < CLOSEPAREN: ")" > | < ASTERISK: "*" > | < SLASH: "/" > | < PLUS: "+" > | < MINUS: "-" > | < QUESTIONMARK: "?" > | | | | | | | > } /******************************************************************* * The PL-SQL grammar starts here *******************************************************************/ String SQLAndExpr() : { String rs = new String(""), ts; } { ts = SQLNotExpr() { rs = rs + ts; } ( { rs = rs + fout.println(); rs = rs + fout.printRj("AND "); } ts = SQLNotExpr() { rs = rs + ts; })* { return rs; } } String SQLBetweenClause() : { String rs = new String(""), ts; } { [ { rs = rs + fout.print(" NOT"); } ] { rs = rs + fout.print(" BETWEEN "); } ts = SQLSumExpr() { rs = rs + ts; } { rs = rs + fout.print(" AND "); } ts = SQLSumExpr() { rs = rs + ts; } { return rs; } } String SQLColRef() : {Token aliasName, columnName; String s, rs = new String(""); } { s = SQLLvalue() { rs = rs + fout.print(s); return rs; } } String SQLCompareExpr() : { String rs = new String(""), ts; } { ( LOOKAHEAD (SQLSelect()) ts = SQLSelect() { rs = rs + ts; } | LOOKAHEAD (SQLColRef() ) ts = SQLIsClause() { rs = rs + ts; } | LOOKAHEAD () ts = SQLExistsClause() { rs = rs + ts; } | ts = SQLSumExpr() { rs = rs + ts; } [ ts = SQLCompareExprRight() { rs = rs + ts; } ] ) { return rs; } } String SQLCompareExprRight() : { String rs = new String(""), ts; } { ( LOOKAHEAD(2) ts = SQLLikeClause() { rs = rs + ts; } | LOOKAHEAD(2) ts = SQLInClause() { rs = rs + ts; } | ts = SQLLeftJoinClause() { rs = rs + ts; } | LOOKAHEAD(SQLCompareOp() SQLSumExpr() "(+)") ts = SQLRightJoinClause() { rs = rs + ts; } | LOOKAHEAD(2) ts = SQLBetweenClause() { rs = rs + ts; } | ts = SQLCompareOp() { rs = rs + ts; } ts = SQLSumExpr() { rs = rs + ts; } ) { return rs; } } String SQLCompareOp() : { String rs = new String("");} { ( { rs = rs + fout.print(" = "); } | { rs = rs + fout.print(" != "); } | { rs = rs + fout.print(" != "); } | { rs = rs + fout.print(" > "); } | { rs = rs + fout.print(" >= "); } | { rs = rs + fout.print(" < "); } | { rs = rs + fout.print(" <= "); } ) { return rs; } } String SQLCursorArgs() : { String rs = new String(""), ts; } { "(" [ ( SQLColRef() [ SQLDataType() ] | SQLFunction() ) ( "," ( SQLColRef() [ SQLDataType() ] | SQLFunction() ) )* ] ")" { return rs; } } String SQLCursorClose() : { Token cursorName; String rs = new String(""); } { cursorName = { rs = rs + fout.print("Exec SQL Close "); rs = rs + fout.print(TitleCaseString.fixCase(cursorName.image)); } { return rs; } } void SQLCursorDeclare() : {Token x, y; String rs = new String(""), ts; } { "cursor" x = { fout.indent(); rs = rs + fout.println("EXEC SQL"); fout.indent(); rs = rs + fout.print("Declare "); String s = TitleCaseString.fixCase(x.image); rs = rs + fout.print(s); rs = rs + fout.println(" Cursor For"); fout.indent(); } [ ts = SQLCursorArgs() { rs = rs + fout.println(); } ] // [ ts = SQLFunctionArgs() { rs = rs + ts; } ] "is" ts = SQLSelect() ";" { rs = rs + fout.print(ts); rs = rs + fout.println(";"); fout.outdent(); fout.outdent(); fout.outdent(); out.print(rs); } } String SQLCursorFetch() : { String rs = new String(""), ts;} { { rs = rs + fout.print("Exec SQL FETCH "); fout.align(); inSelect = true; } ts = SQLSelectCols() { rs = rs + ts; inSelect = false; } [ { inSQL = true; rs = rs + fout.println(); rs = rs + fout.printRj("INTO "); } ts = SQLSelectCols() { rs = rs + ts; fout.outalign(); } ] { inSQL = false ; return rs; } } String SQLCursorOpen() : { Token cursorName; String rs = new String(""), ts; } { cursorName = { rs = rs + fout.print("Exec SQL Open "); rs = rs + fout.print(TitleCaseString.fixCase(cursorName.image)); } [ ts = SQLCursorArgs() ] { return rs; } } DataType SQLDataType() : {Token x; int size = 0; } { "integer" { return new IntegerDataType(); } | "smallint" { return new IntegerDataType(); } | "number" { size = 0; } [ "(" x = ")" { size = Integer.valueOf(x.image).intValue(); } ] { return new NumberDataType(size); } | ("char" | "character") { size = 1; } [ "(" x = ")" { size = Integer.valueOf(x.image).intValue(); } ] { return new CharDataType(size); } | "varchar2" { size = 1; } [ "(" x = ")" { size = Integer.valueOf(x.image).intValue(); } ] { return new CharDataType(size); } | "boolean" { return new BooleanDataType(); } } String SQLDelete() : { String rs = new String(""), ts; } { { if (inProcedure) rs = rs + fout.print("Exec SQL "); rs = rs + fout.print("DELETE FROM "); fout.align(); inSQL = true; } ts = SQLTableList() { rs = rs + ts; } [ ts = SQLWhere() { rs = rs + ts; } ] { fout.outalign(); inSQL = false; } { return rs; } } String SQLExistsClause() : { String rs = new String(""), ts; } { { rs = rs + fout.print("EXISTS ("); fout.align(); } "(" ts = SQLSelect() { rs = rs + ts; } ")" { rs = rs + fout.print(")"); fout.outalign(); return rs; } } String SQLFunction() : { Token otherFunction; String rs = new String(""), ts; } { ( { rs = rs + fout.print("UPPER"); } ts = SQLFunctionArgs() { rs = rs + ts; } | { rs = rs + fout.print("MAX"); } ts = SQLFunctionArgs() { rs = rs + ts; } | { rs = rs + fout.print("MIN"); } ts = SQLFunctionArgs() { rs = rs + ts; } | { rs = rs + fout.print("SUM"); } ts = SQLFunctionArgs() { rs = rs + ts; } | { rs = rs + fout.print("COUNT"); } ts = SQLFunctionArgs() { rs = rs + ts; } | { rs = rs + fout.print("<<>>"); } ts = SQLFunctionArgs() { rs = rs + ts; } | { rs = rs + fout.print("<<>>"); } ts = SQLFunctionArgs() { rs = rs + ts; } | { rs = rs + fout.print("<<>>"); } ts = SQLFunctionArgs() { rs = rs + ts; } | { rs = rs + fout.print("<<>>"); } ts = SQLFunctionArgs() { rs = rs + ts; } | { rs = rs + fout.print("<<>>"); } ts = SQLFunctionArgs() { rs = rs + ts; } | { rs = rs + fout.print(" <<>> "); } ts = SQLFunctionArgs() { rs = rs + ts; } | { rs = rs + fout.print(" <<>> "); } ts = SQLFunctionArgs() { rs = rs + ts; } | { rs = rs + fout.print(" <<>> "); } ts = SQLFunctionArgs() { rs = rs + ts; } | LOOKAHEAD(3) { rs = rs + fout.print(" <<>> "); } ts = SQLFunctionArgs() { rs = rs + ts; } | LOOKAHEAD(3) { rs = rs + fout.print(" <<>> "); } ts = SQLFunctionArgs() { rs = rs + ts; } | LOOKAHEAD(3) { rs = rs + fout.print(" <<>> "); } ts = SQLFunctionArgs() { rs = rs + ts; } | LOOKAHEAD(3) { rs = rs + fout.print(" <<>> "); } | LOOKAHEAD ( "(") otherFunction = { rs = rs + fout.print("<<<"); rs = rs + fout.print(otherFunction.image); rs = rs + fout.print(">>>"); } ts = SQLFunctionArgs() { rs = rs + ts; } ) { return rs; } } String SQLFunctionArgs() : { String rs = new String(""), ts; } { "(" { rs = rs + fout.print("("); } [ ts = SQLSumExpr() { rs = rs + ts; } ( "," { rs = rs + fout.print(", "); } ts = SQLSumExpr() { rs = rs + ts; } )* ] ")" { rs = rs + fout.print(")"); return rs; } } String SQLGroupBy() : { String rs = new String(""), ts; } { { rs = rs + fout.println(); rs = rs + fout.printRj("GROUP "); rs = rs + fout.print("BY "); } ts = SQLOrderByList() { rs = rs + ts; } { return rs; } } String SQLInClause() : { String rs = new String(""), ts; } { [ { rs = rs + fout.print(" NOT"); } ] { rs = rs + fout.print(" IN "); } "(" { rs = rs + fout.print("("); } ts = SQLLValueList() { rs = rs + ts; } ")" { rs = rs + fout.print(")"); } { return rs; } } String SQLInsert() : { String rs = new String(""), ts; } { { if (inProcedure) rs = rs + fout.print("Exec SQL "); rs = rs + fout.print("INSERT INTO "); fout.align(); } ts = SQLTableList() { rs = rs + ts; } [ "(" { rs = rs + fout.print("("); inSelect = true; } ts = SQLSelectCols() { rs = rs + ts; } ")" { rs = rs + fout.print(")"); inSelect = false; } { rs = rs + fout.print(") VALUES"); } ] "(" { rs = rs + fout.print(" ("); inSQL = true; } ts = SQLSelectCols() { rs = rs + ts; } ")" { rs = rs + fout.print(")"); inSelect = false; fout.outalign(); return rs; } } String SQLIsClause() : { String rs = new String(""), ts; } { ts = SQLColRef() { rs = rs + ts; } { rs = rs + fout.print(" IS"); } [ { rs = rs + fout.print(" NOT"); } ] { rs = rs + fout.print(" NULL"); } { return rs; } } String SQLLeftJoinClause() : { Token theComparison; String rs = new String(""), ts; } { "(+)" ts = SQLCompareOp() { rs = rs + ts; rs = rs + fout.print("* "); } ts = SQLSumExpr() { rs = rs + ts; } { return rs; } } String SQLLikeClause() : { String rs = new String(""), ts;} { [ { rs = rs + fout.print(" NOT"); } ] { rs = rs + fout.print(" LIKE "); } ts = SQLPattern() { rs = rs + ts; } { return rs; } } String SQLLiteral() : {Token x; String rs = new String(""); } { ( x = { rs = rs + fout.print(x.image); } | x = { rs = rs + fout.print(x.image); } | x = { rs = rs + fout.print(x.image); } | ( | ) { rs = rs + fout.print("0"); } | { rs = rs + fout.print("<<>>"); } | x = { rs = rs + fout.print(x.image); } ) { return rs; } } String SQLLvalue() : { Token x, y; String s = new String(""), t; } { ( { s = s + ":"; s = s + "Request->"; } t = SQLLvalueTerm() { s = s + t; } | { s = s + ":"; s = s + "ReplyRepeatingGroup->"; } t = SQLLvalueTerm() { s = s + t; } | { s = s + ":"; s = s + "Reply->"; } t = SQLLvalueTerm() { s = s + t; } | { s = s + "SQL_I_O_CORRECT"; } | { s = s + "ROW_NOT_FOUND"; } | t = SQLLvalueTerm() { s = s + t; } ) { return s; } } String SQLLvalueTerm() : { Token x, y; String s = new String(""); } { x = { s = varList.nameOf(x.image); // Change to :Pr_ and substring(4) after creating nameOfSql if (s.startsWith("Pr_")) { s = ":Request->" + s.substring(3); } } ( y = { s = s + "."; s = s + TitleCaseString.fixCase(y.image); } )* { return s; } } String SQLNotExpr() : { String rs = new String(""), ts; } { [ { rs = rs + fout.print("NOT "); } ] ts = SQLCompareExpr() { rs = rs + ts; return rs; } } String SQLOrderBy() : { String rs = new String(""), ts; } { { rs = rs + fout.println(); rs = rs + fout.printRj("ORDER "); rs = rs + fout.print("BY "); } ts = SQLOrderByList() { rs = rs + ts; } { return rs; } } String SQLOrderByElem() : { String rs = new String(""), ts; } { ts = SQLColRef() { rs = rs + ts; } [ ts = SQLOrderDirection() { rs = rs + ts; } ] { return rs; } } String SQLOrderByList() : { String rs = new String(""), ts; } { ts = SQLOrderByElem() { rs = rs + ts; } ( LOOKAHEAD(2) "," { rs = rs + fout.println(", "); } ts = SQLOrderByElem() { rs = rs + ts; })* { return rs; } } String SQLOrderDirection() : { String rs = new String(""); } { ( { rs = rs + fout.print(" ASC"); } | { rs = rs + fout.print(" DESC"); } ) { return rs; } } String SQLOrExpr() : { String rs = new String(""), ts;} { ts = SQLAndExpr() { rs = rs + ts; } ( { rs = rs + fout.println(); rs = rs + fout.printRj("OR "); } ts = SQLAndExpr() { rs = rs + ts; })* { return rs; } } String SQLPattern() : {Token x; String rs = new String(""), ts; } { ( x = { rs = rs + fout.print(x.image); } | "?" { rs = rs + fout.print("?"); } | { rs = rs + fout.print("USER"); } | ts = SQLLvalue() { rs = rs + ts; } ) { return rs; } } String SQLProductExpr() : { String rs = new String(""), ts;} { ts = SQLUnaryExpr() { rs = rs + ts; } ( ( "*" { rs = rs + fout.print(" * "); } | "/" { rs = rs + fout.print(" / "); } ) ts = SQLUnaryExpr() { rs = rs + ts; } )* { return rs; } } String SQLRightJoinClause() : { Token theComparison; String rs = new String(""), ts; } { { rs = rs + fout.print("*"); } ts = SQLCompareOp() { rs = rs + ts; } ts = SQLSumExpr() { rs = rs + ts; } "(+)" { return rs; } } String SQLSelect() : { String rs = new String(""), ts; } {