package SQL2Secondo; import java_cup10.runtime.*; import java.io.IOException; import SecExceptions.*; import SQL2Secondo.ParsCommandSym; import static SQL2Secondo.ParsCommandSym.*; %% %class ScanCommand %unicode %line %char %cupsym SQL2Secondo.ParsCommandSym %implements java_cup10.runtime.Scanner %function next_token %type java_cup10.runtime.Symbol %ignorecase %init{ // TODO: code that goes to constructor %init} %{ StringBuffer string = new StringBuffer(); private Symbol sym(int type) { return sym(type, yytext()); } private Symbol sym(int type, Object value) { return new Symbol(type, yyline, yychar, value); } /* Detected SQL keywords which are not supported by Secondo raise this exception*/ private void notCompError(String message) throws IOException { throw new NotSuppException(message); } private void error() throws IOException { throw new IOException("illegal text at line = "+yyline+", column = "+yychar+", text = '"+yytext()+"'"); } %} LineTerminator = \r|\n|\r\n WhiteSpace = {LineTerminator}|[ \t\f] letter = [a-zA-Z] digit = [0-9] sign = "+"|"-" ident = {letter}({letter}|{digit}|_)* PosNumber = [1-9][0-9]* Anzahl = "("{PosNumber}")" //to specify datatype eg. char(4) AnzAnz = "("{PosNumber}(","{PosNumber})?")" StringType = char(acter)?(" varying")?({Anzahl})? IntType = dec(imal)?({AnzAnz})?|numeric({AnzAnz})?|(small)?int|integer RealType = float({Anzahl})?|real|doubleprecision BoolType = "bit(1)"|boolean //1 = TRUE and 0 = FALSE DateType = date DateValue = {DateType}" '"{digit}{digit}{digit}{digit}-{digit}{digit}-{digit}{digit}"'" ExcatNumericLiteral = ({digit})+("."({digit})*)?|"."({digit})+ ApproxNumericLiteral = ({ExcatNumericLiteral})E({sign})?({digit})+ ParameterVariableName = ":"{ident} JoinType = (natural{WhiteSpace})?((cross|inner|(left|right|full)({WhiteSpace}outer)?|union){WhiteSpace})?join UKey = global|local|temporary|collate|"not null"|"on commit"|nullif|case|when|coalesce|cast ANY = . %state STRING %% {WhiteSpace} { } {UKey} { notCompError(yytext()); } create { return sym(ParsCommandSym.CREATE); } table { return sym(ParsCommandSym.TABLE); } indextype { return sym(ParsCommandSym.INDEXTYPE); } index { return sym(ParsCommandSym.INDEX); } using { return sym(ParsCommandSym.USING); } btree { return sym(ParsCommandSym.BTREE); } rtree { return sym(ParsCommandSym.RTREE); } hasg { return sym(ParsCommandSym.HASH); } select { return sym(ParsCommandSym.SELECT); } from { return sym(ParsCommandSym.FROM); } where { return sym(ParsCommandSym.WHERE); } update { return sym(ParsCommandSym.UPDATE); } set { return sym(ParsCommandSym.SET); } "group by" { return sym(ParsCommandSym.GROUP_BY); } "order by" { return sym(ParsCommandSym.ORDER_BY); } all { return sym(ParsCommandSym.ALL); } some { return sym(ParsCommandSym.SOME); } any { return sym(ParsCommandSym.ANY); } asc { return sym(ParsCommandSym.ASC); } desc { return sym(ParsCommandSym.DESC); } distinct { return sym(ParsCommandSym.DISTINCT); } "insert into" { return sym(ParsCommandSym.INSERT_INTO); } "delete from" { return sym(ParsCommandSym.DELETE_FROM); } "drop table" { return sym(ParsCommandSym.DROP_TABLE); } "drop" { return sym(ParsCommandSym.DROP); } user { return sym(ParsCommandSym.USER); } current_user { return sym(ParsCommandSym.CURRENT_USER); } session_user { return sym(ParsCommandSym.SESSION_USER); } system_user { return sym(ParsCommandSym.SYSTEM_USER); } value { return sym(ParsCommandSym.VALUE); } union { return sym(ParsCommandSym.UNION); } except { return sym(ParsCommandSym.EXCEPT); } values { return sym(ParsCommandSym.VALUES); } null { return sym(ParsCommandSym.NULL); } default { return sym(ParsCommandSym.DEFAULT); } intersect { return sym(ParsCommandSym.INTERSECT); } overlaps { return sym(ParsCommandSym.OVERLAPS); } match { return sym(ParsCommandSym.MATCH); } unique { return sym(ParsCommandSym.UNIQUE); } fulltext { return sym(ParsCommandSym.FULLTEXT); } spatial { return sym(ParsCommandSym.SPATIAL); } partial { return sym(ParsCommandSym.PARTIAL); } full { return sym(ParsCommandSym.FULL); } exists { return sym(ParsCommandSym.EXISTS); } is { return sym(ParsCommandSym.IS); } between { return sym(ParsCommandSym.BETWEEN); } true { return sym(ParsCommandSym.TRUE); } false { return sym(ParsCommandSym.FALSE); } unknown { return sym(ParsCommandSym.UNKNOWN); } like { return sym(ParsCommandSym.LIKE); } having { return sym(ParsCommandSym.HAVING); } "where current of" { return sym(ParsCommandSym.WHERE_CURRENT_OF); } corresponding { return sym(ParsCommandSym.CORRESPONDING); } cascade { return sym(ParsCommandSym.CASCADE); } restrict { return sym(ParsCommandSym.RESTRICT); } constraint { return sym(ParsCommandSym.CONSTRAINT); } "foreign key" { return sym(ParsCommandSym.FOREIGN_KEY); } "primary key" { return sym(ParsCommandSym.PRIM_KEY); } references { return sym(ParsCommandSym.REFERENCES); } check { return sym(ParsCommandSym.CHECK); } alter { return sym(ParsCommandSym.ALTER); } add { return sym(ParsCommandSym.ADD); } column { return sym(ParsCommandSym.COLUMN); } {DateValue} { return sym(ParsCommandSym.DATE_VALUE); } {ParameterVariableName} { return sym(ParsCommandSym.PAR_VAR_NAME, yytext()); } "(" { return sym(ParsCommandSym.LPARENT); } ")" { return sym(ParsCommandSym.RPARENT); } "," { return sym(ParsCommandSym.COMMA); } "." { return sym(ParsCommandSym.DOT); } "+" { return sym(ParsCommandSym.PLUS); } "-" { return sym(ParsCommandSym.MINUS); } "*" { return sym(ParsCommandSym.ASTERISK); } "/" { return sym(ParsCommandSym.SOLIDUS); } "<>" { return sym(ParsCommandSym.NOT_EQUAL); } "<=" { return sym(ParsCommandSym.LESS_EQUAL); } ">=" { return sym(ParsCommandSym.GREATER_EQUAL); } "=" { return sym(ParsCommandSym.EQUAL); } "<" { return sym(ParsCommandSym.LESS); } ">" { return sym(ParsCommandSym.GREATER); } {StringType} { return sym(ParsCommandSym.STRING); } {IntType} { return sym(ParsCommandSym.INT); } {RealType} { return sym(ParsCommandSym.REAL); } {BoolType} { return sym(ParsCommandSym.BOOL); } {DateType} { return sym(ParsCommandSym.DATE); } {JoinType} { return sym(ParsCommandSym.JOIN_TYPE, yytext().toLowerCase()); } as { return sym(ParsCommandSym.AS); } min { return sym(ParsCommandSym.MIN); } max { return sym(ParsCommandSym.MAX); } avg { return sym(ParsCommandSym.AVG); } sum { return sym(ParsCommandSym.SUM); } count { return sym(ParsCommandSym.COUNT); } by { return sym(ParsCommandSym.BY); } on { return sym(ParsCommandSym.ON); } in { return sym(ParsCommandSym.IN); } not { return sym(ParsCommandSym.NOT); } and { return sym(ParsCommandSym.AND); } or { return sym(ParsCommandSym.OR); } {ident} { return sym(ParsCommandSym.ID, yytext().toLowerCase()); } {ExcatNumericLiteral} { return sym(ParsCommandSym.ENL, yytext()); } {ApproxNumericLiteral} { return sym(ParsCommandSym.ANL, yytext()); } ' { string.setLength(0); yybegin(STRING); } ' { yybegin(YYINITIAL); return sym(ParsCommandSym.A_STRING, string.toString()); } [^\n\r'\"\\]+ { string.append(yytext()); } \\t { string.append("\t"); } \\n { string.append("\n"); } \\r { string.append("\r"); } \" { string.append("'"); } '' { string.append("'"); } \\ { string.append("\\"); } //{ANY} { return sym(ANY); }