blob: 39cd33d67cbf89fa6ccba201388ef606fcc67f7d [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.mrql;
import java_cup.runtime.Symbol;
import org.apache.mrql.gen.Tree;
%%
%class MRQLLex
%public
%line
%char
%ignorecase
%cup
%state COMMENT
%state TEMPLATE
%eofval{
return symbol(sym.EOF);
%eofval}
%{
static int prev_char_pos = -1;
public static int[] nest = new int[1000];
public static int nest_pos = 0;
public static int trace_nest = 0;
public static String trace_code = "$(";
static String template = null;
public static void reset () {
nest_pos = 0;
nest[0] = 0;
prev_char_pos = -1;
trace_nest = 0;
trace_code = "";
}
public static void record_begin () {
nest[++nest_pos] = 0;
}
public static void record_end () {
nest_pos--;
}
public static void start_trace_code () {
trace_nest++;
trace_code += "$(";
}
public static String get_trace_code () {
int loc = trace_code.lastIndexOf("$");
String s = trace_code.substring(loc+2);
s = s.substring(0,s.length()-1);
trace_nest--;
if (loc > 0)
loc--;
trace_code = trace_code.substring(0,loc)+s;
return s.replaceAll("\\p{Space}+"," ");
}
public int line_pos () { return yyline+1; }
public int char_pos () { return yychar-prev_char_pos; }
public Symbol symbol ( int s ) {
Tree.line_number = line_pos();
Tree.position_number = char_pos();
if (trace_nest > 0 && s != sym.TRACE) trace_code += yytext();
return new Symbol(s);
}
public Symbol symbol ( int s, Object o ) {
Tree.line_number = line_pos();
Tree.position_number = char_pos();
if (trace_nest > 0) trace_code += yytext();
return new Symbol(s,o);
}
public void error ( String msg ) {
System.err.println("*** Scanner Error: " + msg + " (line: " + line_pos() + ", position: " + char_pos() + ")");
if (Config.testing)
throw new Error("Scanner Error");
}
public String format ( String s ) {
return s.replaceAll("\\\\t", "\t").replaceAll("\\\\n", "\n");
}
%}
ID=[a-zA-Z][a-zA-Z0-9_]*
INT = [0-9]+
DOUBLE = [0-9]+([\.][0-9]+)?([eE][+-]?[0-9]+)?
%%
<YYINITIAL> {INT} { return symbol(sym.Integer,new Long(yytext())); }
<YYINITIAL> {DOUBLE} { return symbol(sym.Double,new Double(yytext())); }
<YYINITIAL> "["{ID}"|" { yybegin(TEMPLATE); template = ""; return symbol(sym.START_TEMPLATE,yytext()); }
<YYINITIAL> "if" { return symbol(sym.IF); }
<YYINITIAL> "then" { return symbol(sym.THEN); }
<YYINITIAL> "else" { return symbol(sym.ELSE); }
<YYINITIAL> "select" { return symbol(sym.SELECT); }
<YYINITIAL> "from" { return symbol(sym.FROM); }
<YYINITIAL> "having" { return symbol(sym.HAVING); }
<YYINITIAL> "[" { nest[nest_pos]++; return symbol(sym.LB); }
<YYINITIAL> "]" { nest[nest_pos]--; return symbol(sym.RB); }
<YYINITIAL> "(" { nest[nest_pos]++; return symbol(sym.LP); }
<YYINITIAL> ")" { nest[nest_pos]--; return symbol(sym.RP); }
<YYINITIAL> "{" { nest[nest_pos]++; return symbol(sym.LSB); }
<YYINITIAL> "}}" { nest[nest_pos]--; if (nest_pos > 0 && nest[nest_pos] == 0) { record_end(); yybegin(TEMPLATE); } else return symbol(sym.RSB); }
<YYINITIAL> "}" { nest[nest_pos]--; return symbol(sym.RSB); }
<YYINITIAL> "+" { return symbol(sym.PLUS); }
<YYINITIAL> "-" { return symbol(sym.MINUS); }
<YYINITIAL> "*" { return symbol(sym.TIMES); }
<YYINITIAL> "/" { return symbol(sym.DIV); }
<YYINITIAL> "mod" { return symbol(sym.MOD); }
<YYINITIAL> "%" { return symbol(sym.MOD); }
<YYINITIAL> "=" { return symbol(sym.EQ); }
<YYINITIAL> "<>" { return symbol(sym.NEQ); }
<YYINITIAL> "<=" { return symbol(sym.LEQ); }
<YYINITIAL> "<" { return symbol(sym.LT); }
<YYINITIAL> ">=" { return symbol(sym.GEQ); }
<YYINITIAL> "!" { return symbol(sym.EXCLAMATION); }
<YYINITIAL> ">" { return (nest_pos > 0 && nest[nest_pos] == 0) ? symbol(sym.GTR) : symbol(sym.GT); }
<YYINITIAL> \\ { return symbol(sym.BSLASH); }
<YYINITIAL> "and" { return symbol(sym.AND); }
<YYINITIAL> "or" { return symbol(sym.OR); }
<YYINITIAL> "not" { return symbol(sym.NOT); }
<YYINITIAL> "union" { return symbol(sym.UNION); }
<YYINITIAL> "intersect" { return symbol(sym.INTERSECT); }
<YYINITIAL> "except" { return symbol(sym.EXCEPT); }
<YYINITIAL> "exists" { return symbol(sym.EXISTS); }
<YYINITIAL> "in" { return symbol(sym.IN); }
<YYINITIAL> "let" { return symbol(sym.LET); }
<YYINITIAL> "," { return symbol(sym.COMMA); }
<YYINITIAL> "." { return symbol(sym.DOT); }
<YYINITIAL> ":=" { return symbol(sym.ASSIGN); }
<YYINITIAL> ":" { return symbol(sym.COLON); }
<YYINITIAL> ";" { return symbol(sym.SEMI); }
<YYINITIAL> "#" { return symbol(sym.SHARP); }
<YYINITIAL> "@" { return symbol(sym.ATSYM); }
<YYINITIAL> \| { return symbol(sym.SEP); }
<YYINITIAL> "where" { return symbol(sym.WHERE); }
<YYINITIAL> "order" { return symbol(sym.ORDER); }
<YYINITIAL> "group" { return symbol(sym.GROUP); }
<YYINITIAL> "by" { return symbol(sym.BY); }
<YYINITIAL> "asc" { return symbol(sym.ASCENDING); }
<YYINITIAL> "desc" { return symbol(sym.DESCENDING); }
<YYINITIAL> "function" { return symbol(sym.FUNCTION); }
<YYINITIAL> "macro" { return symbol(sym.MACRO); }
<YYINITIAL> "distinct" { return symbol(sym.DISTINCT); }
<YYINITIAL> "as" { return symbol(sym.AS); }
<YYINITIAL> "some" { return symbol(sym.SOME); }
<YYINITIAL> "all" { return symbol(sym.ALL); }
<YYINITIAL> "store" { return symbol(sym.STORE); }
<YYINITIAL> "dump" { return symbol(sym.DUMP); }
<YYINITIAL> "incr" { return symbol(sym.INCR); }
<YYINITIAL> "type" { return symbol(sym.TYPE); }
<YYINITIAL> "data" { return symbol(sym.DATA); }
<YYINITIAL> "case" { return symbol(sym.CASE); }
<YYINITIAL> "xpath" { return symbol(sym.XPATH); }
<YYINITIAL> "repeat" { return symbol(sym.REPEAT); }
<YYINITIAL> "step" { return symbol(sym.STEP); }
<YYINITIAL> "limit" { return symbol(sym.LIMIT); }
<YYINITIAL> "import" { return symbol(sym.IMPORT); }
<YYINITIAL> "parser" { return symbol(sym.PARSER); }
<YYINITIAL> "include" { return symbol(sym.INCLUDE); }
<YYINITIAL> "aggregation" { return symbol(sym.AGGREGATION); }
<YYINITIAL> "trace" { return symbol(sym.TRACE); }
<YYINITIAL> "lineage" { return symbol(sym.LINEAGE); }
<YYINITIAL> "debug" { return symbol(sym.DEBUG); }
<YYINITIAL> "debug all" { return symbol(sym.DEBUGALL); }
<YYINITIAL> {ID} { return symbol(sym.Variable,yytext()); }
<YYINITIAL> "/*" { yybegin(COMMENT); }
<COMMENT> "*/" { yybegin(YYINITIAL); }
<COMMENT> [ \t\f] { }
<COMMENT> [\r\n] { prev_char_pos = yychar; }
<COMMENT> . { }
<TEMPLATE> "|]" { yybegin(YYINITIAL); String s = template; template = ""; return symbol(sym.END_TEMPLATE,s); }
<TEMPLATE> "{{" { yybegin(YYINITIAL); record_begin(); nest[nest_pos]++; String s = template; template = ""; return symbol(sym.TEXT,s); }
<TEMPLATE> [ \t\f] { template += yytext(); }
<TEMPLATE> [\r\n] { template += yytext(); prev_char_pos = yychar; }
<TEMPLATE> . { template += yytext(); }
<YYINITIAL> "//"[^\n]*\n { prev_char_pos = yychar; }
<YYINITIAL> \"[^\"]*\" { return symbol(sym.String,format(yytext().substring(1,yytext().length()-1))); }
<YYINITIAL> \'[^\']*\' { return symbol(sym.String,format(yytext().substring(1,yytext().length()-1))); }
<YYINITIAL> [ \t\f] { if (trace_nest > 0) trace_code += " "; }
<YYINITIAL> [\r\n] { prev_char_pos = yychar; if (trace_nest > 0) trace_code += " "; }
<YYINITIAL> . { error("Illegal character: "+yytext()); }