]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLLexer.flex
(refs #7250) CHR rules modularization (first working version)
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / parsing / parser / SCLLexer.flex
index ecae4e5a54a36b288e0bc6cfff737aec8f16cc8e..0f45c2511b297a3e6575c7a953c6cd5e9f752c34 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.internal.parsing.parser;
 
+import org.simantics.scl.compiler.compilation.CompilationContext;
 import org.simantics.scl.compiler.internal.parsing.Token;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.parsing.exceptions.SCLSyntaxErrorException;
@@ -27,6 +28,7 @@ import gnu.trove.list.array.TIntArrayList;
     TIntArrayList stateStack = new TIntArrayList(2);
 
     StringBuffer string = new StringBuffer();
+    CompilationContext context;
     
     private Token sym(int id) {
         return new Token(id, yychar, yychar+yylength(), yytext());
@@ -34,13 +36,19 @@ import gnu.trove.list.array.TIntArrayList;
     private Token sym(int id, String text) {
         return new Token(id, yychar, yychar+yylength(), text);
     }
+    public void setCompilationContext(CompilationContext context) {
+        this.context = context;
+    }
+    public boolean supportCHR() {
+        return context.header == null ? false : context.header.chr;
+    }
 %}
 
 letter          = [a-zA-Z_]
 digit           = [0-9]
 hexDigit        = [0-9a-fA-F]
 id_char         = {letter} | {digit} | "'"
-ord_symbol_char = [!$%&*+\/<=>?@\\\^|\-:~]
+ord_symbol_char = [!$%&*+\/<=>@\\\^|\-:~]
 symbol_char     = {ord_symbol_char} | "#"
 
 prefix          = {letter} {id_char}* "."
@@ -84,11 +92,12 @@ char_literal    = "'" ([^'\\\ufffd] | "\\" [^\ufffd]) "'"
   else            { return sym(SCLTerminals.ELSE); }
   where           { return sym(SCLTerminals.WHERE); }
   when            { return sym(SCLTerminals.WHEN); }
-  rule            { return sym(SCLTerminals.RULE); }
+  ruleset         { return sym(supportCHR() ? SCLTerminals.RULESET : SCLTerminals.ID); }
+  rule            { return sym(supportCHR() ? SCLTerminals.ID : SCLTerminals.RULE); }
   abstract{whitespace}rule { return sym(SCLTerminals.ABSTRACT_RULE); }
   extends         { return sym(SCLTerminals.EXTENDS); }
   mapping{whitespace}relation { return sym(SCLTerminals.MAPPING_RELATION); }
-  transformation  { return sym(SCLTerminals.TRANSFORMATION); }
+  transformation  { return sym(supportCHR() ? SCLTerminals.ID : SCLTerminals.TRANSFORMATION); }
   select{whitespace}first { return sym(SCLTerminals.SELECT_FIRST); }
   select{whitespace}distinct { return sym(SCLTerminals.SELECT_DISTINCT); }
   select          { return sym(SCLTerminals.SELECT); }
@@ -116,6 +125,7 @@ char_literal    = "'" ([^'\\\ufffd] | "\\" [^\ufffd]) "'"
 //  relation        { return sym(SCLTerminals.RELATION); }
   as              { return sym(SCLTerminals.AS); }
   by              { return sym(SCLTerminals.BY); }
+  constraint      { return sym(SCLTerminals.CONSTRAINT); }
   {queryOp}       { return sym(SCLTerminals.QUERY_OP); }
   "@"             { return sym(SCLTerminals.AT); }
   "{"             { return sym(SCLTerminals.LBRACE); }
@@ -143,7 +153,7 @@ char_literal    = "'" ([^'\\\ufffd] | "\\" [^\ufffd]) "'"
   {separatedDot}  { return sym(SCLTerminals.SEPARATED_DOT, "."); }
   "."             { return sym(SCLTerminals.ATTACHED_DOT, "."); }
   "-"             { return sym(SCLTerminals.MINUS, "-"); }
-//  "<" existentialVar ">" { yybegin(XML); return sym(SCLTerminals.XML_BEGIN); }
+//  "<" {existentialVar} ">" { yybegin(XML); return sym(SCLTerminals.XML_BEGIN); }
   "<"             { return sym(SCLTerminals.LESS, "<"); }
   ">"             { return sym(SCLTerminals.GREATER, ">"); }
   ";"             { return sym(SCLTerminals.SEMICOLON); }
@@ -151,6 +161,7 @@ char_literal    = "'" ([^'\\\ufffd] | "\\" [^\ufffd]) "'"
   "="             { return sym(SCLTerminals.EQUALS); }
   "::"            { return sym(SCLTerminals.HASTYPE); }
   ":"             { return sym(SCLTerminals.COLON); }
+  "\\" " "* match { return sym(SCLTerminals.LAMBDA_MATCH); }
   "\\"            { return sym(SCLTerminals.LAMBDA); }
   "\"\"\""        { string.setLength(0); stringStart=yychar; yybegin(LONG_STRING); return sym(SCLTerminals.BEGIN_STRING); }
   "\""            { string.setLength(0); stringStart=yychar; yybegin(STRING); return sym(SCLTerminals.BEGIN_STRING); }