]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLParserImpl.java
Merge "Resolve some dependency problems with SDK features"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / parsing / parser / SCLParserImpl.java
index 799e59099b924a005ff59d8a3bf048dfd3e6b3ee..34f8d6a9f0da95e4e6a01a95021d82f893176ca8 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;
@@ -53,6 +54,7 @@ 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;
@@ -73,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;
@@ -86,9 +89,9 @@ import org.simantics.scl.compiler.internal.parsing.declarations.DFixityAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DImportJavaAst;
 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.DModuleHeader;
 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;
@@ -113,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) {
@@ -158,7 +167,7 @@ public class SCLParserImpl extends SCLParser {
         for(int i=0;i<length();i+=2) {
             DeclarationAst declaration = (DeclarationAst)get(i);
             if(declaration == null)
-                throw new NullPointerException();
+                continue;
             declarations.add(declaration);
         }
         return declarations;
@@ -169,7 +178,8 @@ public class SCLParserImpl extends SCLParser {
         FieldAssignment[] fields = new FieldAssignment[length()/2-1];
         for(int i=0;i<fields.length;++i)
             fields[i] = (FieldAssignment)get(2+i*2);
-        return new DModuleHeader(fields);
+        context.header = ModuleHeader.process(context.errorLog, fields);
+        return null;
     }
 
     @Override
@@ -298,7 +308,7 @@ public class SCLParserImpl extends SCLParser {
         else
             context = (ArrayList<TypeAst>)get(i++);
         Token nameToken = (Token)get(i++);
-        EVar name = new EVar(nameToken.location, nameToken.text);
+        EVar name = new EVar(nameToken);
         ArrayList<TypeAst> parameters = new ArrayList<TypeAst>();
         while(i < length()) {
             Object symbol = get(i++);
@@ -324,7 +334,7 @@ public class SCLParserImpl extends SCLParser {
         else
             context = (ArrayList<TypeAst>)get(i++);
         Token nameToken = (Token)get(i++);
-        EVar name = new EVar(nameToken.location, nameToken.text);
+        EVar name = new EVar(nameToken);
         ArrayList<TypeAst> parameters = new ArrayList<TypeAst>();
         while(i < length()) {
             Object symbol = get(i++);
@@ -414,12 +424,12 @@ public class SCLParserImpl extends SCLParser {
 
     @Override
     protected Object reduceVarId() {
-        return new EVar(((Token)get(0)).text);
+        return new EVar((Token)get(0));
     }
 
     @Override
     protected Object reduceEscapedSymbol() {
-        return new EVar(((Token)get(0)).text);
+        return new EVar((Token)get(0));
     }
 
     @Override
@@ -450,7 +460,7 @@ public class SCLParserImpl extends SCLParser {
         EVar negation = null;
         if(get(i) instanceof Token) {
             Token token = (Token)get(i++);
-            negation = new EVar(token.location, token.text);
+            negation = new EVar(token);
         }
         EBinary binary = new EBinary((Expression)get(i++), negation);
         while(i < length()) {
@@ -517,7 +527,7 @@ public class SCLParserImpl extends SCLParser {
         TypeAst[] parameters = new TypeAst[length()-idPos-1];
         for(int i=0;i<parameters.length;++i)
             parameters[i] = (TypeAst)get(i+idPos+1);
-        return new ConstructorAst(annotations, ((Token)get(idPos)).text, parameters, null);
+        return new ConstructorAst(annotations, (Token)get(idPos), parameters, null);
     }
 
     @Override
@@ -571,7 +581,7 @@ public class SCLParserImpl extends SCLParser {
 
     @Override
     protected Object reduceBlank() {
-        return new EVar("_");
+        return new EVar(((Token)get(0)).location, "_");
     }
 
     @Override
@@ -1168,7 +1178,7 @@ public class SCLParserImpl extends SCLParser {
         FieldAssignment[] fields = new FieldAssignment[length()/2-1];
         for(int i=0;i<fields.length;++i)
             fields[i] = (FieldAssignment)get(2+i*2);
-        return new ERecord((Token)get(0), fields);
+        return new ERecord(new EVar((Token)get(0)), fields);
     }
 
     @Override
@@ -1198,7 +1208,7 @@ public class SCLParserImpl extends SCLParser {
             parameters[i] = fieldDesc.type;
             fieldNames[i] = fieldDesc.name;
         }
-        return new ConstructorAst(annotations, ((Token)get(idPos)).text, parameters, fieldNames);
+        return new ConstructorAst(annotations, (Token)get(idPos), parameters, fieldNames);
     }
 
     @Override
@@ -1243,10 +1253,8 @@ public class SCLParserImpl extends SCLParser {
 
     @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);
+        ConstructorAst constructor = (ConstructorAst)get(1);
+        return new ConstraintStatement(constructor.name, constructor.parameters, constructor.fieldNames, constructor.annotations);
     }
 
     @Override
@@ -1283,4 +1291,26 @@ public class SCLParserImpl extends SCLParser {
         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);
+    }
+
+    @Override
+    protected Object reduceConstraintSpec() {
+        Expression[] expressions = new Expression[length()/2-1];
+        for(int i=0;i<expressions.length;++i)
+            expressions[i] = (Expression)get(2*i+1);
+        return expressions;
+    }
+
 }