]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLParserImpl.java
(refs #7250) Merging master, minor CHR bugfixes
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / parsing / parser / SCLParserImpl.java
index bbf944f1e28b8c84cf78b00895fbca516158e8e4..09fc79e0f531030b8ff2d1dfa720a00c22428dfb 100644 (file)
@@ -8,6 +8,7 @@ import java.util.List;
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
 import org.simantics.scl.compiler.common.precedence.Associativity;
 import org.simantics.scl.compiler.common.precedence.Precedence;
+import org.simantics.scl.compiler.compilation.CompilationContext;
 import org.simantics.scl.compiler.constants.CharacterConstant;
 import org.simantics.scl.compiler.constants.StringConstant;
 import org.simantics.scl.compiler.elaboration.equation.EqBasic;
@@ -21,7 +22,6 @@ import org.simantics.scl.compiler.elaboration.expressions.EBinaryRightSide;
 import org.simantics.scl.compiler.elaboration.expressions.EBlock;
 import org.simantics.scl.compiler.elaboration.expressions.EConstant;
 import org.simantics.scl.compiler.elaboration.expressions.EEnforce;
-import org.simantics.scl.compiler.elaboration.expressions.EEntityTypeAnnotation;
 import org.simantics.scl.compiler.elaboration.expressions.EEquations;
 import org.simantics.scl.compiler.elaboration.expressions.EFieldAccess;
 import org.simantics.scl.compiler.elaboration.expressions.EIf;
@@ -41,7 +41,7 @@ import org.simantics.scl.compiler.elaboration.expressions.ETransformation;
 import org.simantics.scl.compiler.elaboration.expressions.ETypeAnnotation;
 import org.simantics.scl.compiler.elaboration.expressions.EVar;
 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
-import org.simantics.scl.compiler.elaboration.expressions.EWhen;
+import org.simantics.scl.compiler.elaboration.expressions.EViewPattern;
 import org.simantics.scl.compiler.elaboration.expressions.Expression;
 import org.simantics.scl.compiler.elaboration.expressions.GuardedExpression;
 import org.simantics.scl.compiler.elaboration.expressions.GuardedExpressionGroup;
@@ -51,7 +51,10 @@ import org.simantics.scl.compiler.elaboration.expressions.accessor.FieldAccessor
 import org.simantics.scl.compiler.elaboration.expressions.accessor.IdAccessor;
 import org.simantics.scl.compiler.elaboration.expressions.accessor.StringAccessor;
 import org.simantics.scl.compiler.elaboration.expressions.block.BindStatement;
+import org.simantics.scl.compiler.elaboration.expressions.block.CHRStatement;
+import org.simantics.scl.compiler.elaboration.expressions.block.ConstraintStatement;
 import org.simantics.scl.compiler.elaboration.expressions.block.GuardStatement;
+import org.simantics.scl.compiler.elaboration.expressions.block.IncludeStatement;
 import org.simantics.scl.compiler.elaboration.expressions.block.LetStatement;
 import org.simantics.scl.compiler.elaboration.expressions.block.RuleStatement;
 import org.simantics.scl.compiler.elaboration.expressions.block.Statement;
@@ -72,6 +75,7 @@ import org.simantics.scl.compiler.elaboration.query.pre.QPreBinds;
 import org.simantics.scl.compiler.elaboration.query.pre.QPreEquals;
 import org.simantics.scl.compiler.elaboration.query.pre.QPreGuard;
 import org.simantics.scl.compiler.errors.Locations;
+import org.simantics.scl.compiler.internal.header.ModuleHeader;
 import org.simantics.scl.compiler.internal.parsing.Symbol;
 import org.simantics.scl.compiler.internal.parsing.Token;
 import org.simantics.scl.compiler.internal.parsing.declarations.ConstructorAst;
@@ -87,6 +91,7 @@ import org.simantics.scl.compiler.internal.parsing.declarations.DInstanceAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DMappingRelationAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DRelationAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DRuleAst;
+import org.simantics.scl.compiler.internal.parsing.declarations.DRulesetAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DTypeAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DValueAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DValueTypeAst;
@@ -111,9 +116,15 @@ public class SCLParserImpl extends SCLParser {
 
     private final SCLPostLexer lexer;
     private SCLParserOptions options;
+    private CompilationContext context;
 
     public SCLParserImpl(Reader reader) {
-        lexer = new SCLPostLexer(reader);
+        this.lexer = new SCLPostLexer(reader);
+    }
+    
+    public void setCompilationContext(CompilationContext context) {
+        this.context = context;
+        lexer.setCompilationContext(context);
     }
     
     public void setParserOptions(SCLParserOptions options) {
@@ -153,10 +164,23 @@ public class SCLParserImpl extends SCLParser {
     @Override
     protected Object reduceModule() {
         ArrayList<DeclarationAst> declarations = new ArrayList<DeclarationAst>(length()/2+1);
-        for(int i=0;i<length();i+=2)
-            declarations.add((DeclarationAst)get(i));
+        for(int i=0;i<length();i+=2) {
+            DeclarationAst declaration = (DeclarationAst)get(i);
+            if(declaration == null)
+                continue;
+            declarations.add(declaration);
+        }
         return declarations;
     }
+    
+    @Override
+    protected Object reduceModuleHeader() {
+        FieldAssignment[] fields = new FieldAssignment[length()/2-1];
+        for(int i=0;i<fields.length;++i)
+            fields[i] = (FieldAssignment)get(2+i*2);
+        context.header = ModuleHeader.process(context.errorLog, fields);
+        return null;
+    }
 
     @Override
     protected Object reduceLocalTypeAnnotation() {
@@ -220,6 +244,7 @@ public class SCLParserImpl extends SCLParser {
                 );
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     protected Object reduceClassDefinition() {
         int i=1;
@@ -273,6 +298,7 @@ public class SCLParserImpl extends SCLParser {
         return fundeps;
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     protected Object reduceInstanceDefinition() {
         int i=1;
@@ -298,6 +324,7 @@ public class SCLParserImpl extends SCLParser {
                 declarations);
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     protected Object reduceDerivingInstanceDefinition() {
         int i=2;
@@ -381,6 +408,7 @@ public class SCLParserImpl extends SCLParser {
         return get(0);
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     protected Object reduceImportJava() {
         return new DImportJavaAst(((Token)get(2)).text, (ArrayList<DeclarationAst>)get(4));
@@ -686,6 +714,14 @@ public class SCLParserImpl extends SCLParser {
         case_.setLhs(Locations.combine(patterns[0].location, patterns[patterns.length-1].location));
         return new ELambda(case_);
     }
+    
+    @Override
+    protected Object reduceLambdaMatch() {
+        Case[] cases = new Case[length()/2-1];
+        for(int i=0;i<cases.length;++i)
+            cases[i] = (Case)get(i*2+2);
+        return new ELambda(cases);
+    }
 
     @Override
     protected Object reduceLet() {
@@ -704,7 +740,7 @@ public class SCLParserImpl extends SCLParser {
         return new EIf(
                 (Expression)get(1),
                 (Expression)get(3),
-                (Expression)get(5));
+                length() == 6 ? (Expression)get(5) : null);
     }
 
     @Override
@@ -728,14 +764,7 @@ public class SCLParserImpl extends SCLParser {
     protected Object reduceSelect() {
         return new ESelect(((Token)get(0)).id, (Expression)get(1), new QConjunction((Query[])get(3)));
     }
-    
-    @Override
-    protected Object reduceWhen() {
-        return new EWhen(
-                new QConjunction((Query[])get(1)),
-                (Expression)get(3));
-    }
-    
+       
     @Override
     protected Object reduceEnforce() {
         return new EEnforce(new QConjunction((Query[])get(1)));
@@ -875,11 +904,7 @@ public class SCLParserImpl extends SCLParser {
         return new TApplyAst((TypeAst)get(0), parameters);
     }
 
-    @Override
-    protected Object reduceDummy1() {
-        throw new UnsupportedOperationException();
-    }
-
+    @SuppressWarnings("unchecked")
     @Override
     protected void postReduce(Object reduced) {
         if(!(reduced instanceof Symbol))
@@ -887,6 +912,20 @@ public class SCLParserImpl extends SCLParser {
         Symbol sym = (Symbol)reduced;
         if(sym.location != Locations.NO_LOCATION || length() == 0)
             return;
+        Object first = get(0);
+        if(!(first instanceof Symbol)) {
+            if(first instanceof List) {
+                List<Object> ll = (List<Object>)first;
+                first = ll.get(0);
+            }
+            else {
+                Object[] ll = (Object[])first;
+                if(ll.length > 0)
+                    first = ll[0];
+                else
+                    first = get(1);
+            }
+        }
         Object last = get(length()-1);
         if(!(last instanceof Symbol)) {
             if(last instanceof List) {
@@ -901,7 +940,7 @@ public class SCLParserImpl extends SCLParser {
                     last = get(length()-2);
             }
         }
-        sym.location = (((Symbol)get(0)).location & 0xffffffff00000000L) 
+        sym.location = (((Symbol)first).location & 0xffffffff00000000L) 
                 | (((Symbol)last).location & 0xffffffffL);
         /*for(int i=0;i<length();++i) {
             Object obj = get(i);
@@ -927,30 +966,30 @@ public class SCLParserImpl extends SCLParser {
 
     @Override
     protected Object reduceIdAccessor() {
-        return new IdAccessor(((Token)get(0)).text);
+        return new IdAccessor('.', ((Token)get(0)).text);
     }
 
     @Override
     protected Object reduceStringAccessor() {
-        return new StringAccessor(((Token)get(1)).text);
+        return new StringAccessor('.', ((Token)get(1)).text);
     }
 
     @Override
     protected Object reduceExpAccessor() {
-        return new ExpressionAccessor((Expression)get(1));
+        return new ExpressionAccessor('.', (Expression)get(1));
     }
 
     @Override
     protected Object reduceFieldAccess() {
         if(length() == 1)
             return get(0);
-        FieldAccessor[] accessors = new FieldAccessor[length()/2];
-        for(int i=0;i<accessors.length;++i) {
-            FieldAccessor accessor = (FieldAccessor)get(i*2+2);
-            accessor.accessSeparator = ((Token)get(i*2+1)).text.charAt(0);
-            accessors[i] = accessor;
+        Expression result = (Expression)get(0);
+        for(int i=2;i<length();i+=2) {
+            FieldAccessor accessor = (FieldAccessor)get(i);
+            accessor.accessSeparator = ((Token)get(i-1)).text.charAt(0);
+            result = new EFieldAccess(result, accessor);
         }
-        return new EFieldAccess((Expression)get(0), accessors);
+        return result;
     }
 
     @Override
@@ -994,14 +1033,6 @@ public class SCLParserImpl extends SCLParser {
     protected Object reduceRuleStatement() {
         return new RuleStatement((Expression)get(0), new QConjunction((Query[])get(2)));
     }
-    
-    @Override
-    protected Object reduceEntityTypeAnnotation() {
-        return new EEntityTypeAnnotation((Expression)get(0), (Token)get(2), 
-                length() > 3 
-                ? new QConjunction((Query[])get(length()-1))
-                : null);
-    }
 
     @Override
     protected Object reduceHashedId() {
@@ -1078,6 +1109,7 @@ public class SCLParserImpl extends SCLParser {
 
     private static final String[] EMPTY_STRING_ARRAY = new String[0];
     
+    @SuppressWarnings("unchecked")
     @Override
     protected Object reduceRuleDefinition() {
         String[] extendsNames = EMPTY_STRING_ARRAY;
@@ -1134,6 +1166,7 @@ public class SCLParserImpl extends SCLParser {
                 );
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     protected Object reduceRelationDefinition() {
         return new DRelationAst((Expression)get(0), 
@@ -1207,4 +1240,71 @@ public class SCLParserImpl extends SCLParser {
     protected Object reduceBasicEquation() {
         return new EqBasic((Expression)get(0), (Expression)get(2));
     }
+
+    @Override
+    protected Object reduceViewPattern() {
+        return new EViewPattern((Expression)get(1), (Expression)get(3));
+    }
+
+    @Override
+    protected Object reduceCHRStatement() {
+        return new CHRStatement((ListQualifier[])get(0), (ListQualifier[])get(2));
+    }
+
+    @Override
+    protected Object reduceConstraintStatement() {
+        TypeAst[] parameterTypes = new TypeAst[length()-2];
+        for(int i=0;i<parameterTypes.length;++i)
+            parameterTypes[i] = (TypeAst)get(2+i);
+        return new ConstraintStatement((Token)get(1), parameterTypes);
+    }
+
+    @Override
+    protected Object reduceCHRQuery() {
+        ListQualifier[] query = new ListQualifier[(length()+1)/2];
+        for(int i=0;i<query.length;++i)
+            query[i] = (ListQualifier)get(i*2);
+        return query;
+    }
+
+    /*
+    @Override
+    protected Object reduceWhen() {
+        return new EWhen(
+                new QConjunction((Query[])get(1)),
+                (Expression)get(3));
+    }*/
+    
+    @Override
+    protected Object reduceVerboseCHRQuery() {
+        ListQualifier[] query = new ListQualifier[(length()-1)/2];
+        for(int i=0;i<query.length;++i)
+            query[i] = (ListQualifier)get(i*2+1);
+        return query;
+    }
+    
+    @Override
+    protected Object reduceVerboseCHRStatement() {
+        return new CHRStatement((ListQualifier[])get(1), (ListQualifier[])get(3));
+    }
+
+    @Override
+    protected Object reduceDummy() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected Object reduceRulesetDefinition() {
+        Token name = (Token)get(1);
+        EBlock block = (EBlock)get(3);
+        return new DRulesetAst(name.text, block);
+    }
+
+    @Override
+    protected Object reduceLocalInclude() {
+        Token name = (Token)get(1);
+        Expression value = (Expression)get(2);
+        return new IncludeStatement(name, value);
+    }
+
 }