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.chr.ast.CHRAstAtom;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstBinds;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstConjunction;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstEquals;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstQuery;
import org.simantics.scl.compiler.elaboration.equation.EqBasic;
import org.simantics.scl.compiler.elaboration.equation.EqGuard;
import org.simantics.scl.compiler.elaboration.equation.Equation;
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;
import org.simantics.scl.compiler.elaboration.expressions.EListLiteral;
import org.simantics.scl.compiler.elaboration.expressions.ELiteral;
import org.simantics.scl.compiler.elaboration.expressions.EMatch;
+import org.simantics.scl.compiler.elaboration.expressions.EPreCHRSelect;
import org.simantics.scl.compiler.elaboration.expressions.ERange;
import org.simantics.scl.compiler.elaboration.expressions.ERealLiteral;
import org.simantics.scl.compiler.elaboration.expressions.ERecord;
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.BlockType;
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;
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;
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;
import org.simantics.scl.compiler.internal.parsing.types.TForAllAst;
import org.simantics.scl.compiler.internal.parsing.types.TFunctionAst;
import org.simantics.scl.compiler.internal.parsing.types.TListAst;
+import org.simantics.scl.compiler.internal.parsing.types.TPlainEffectAst;
import org.simantics.scl.compiler.internal.parsing.types.TPredAst;
import org.simantics.scl.compiler.internal.parsing.types.TTupleAst;
import org.simantics.scl.compiler.internal.parsing.types.TVarAst;
private final SCLPostLexer lexer;
private SCLParserOptions options;
+ private CompilationContext context;
public SCLParserImpl(Reader reader) {
- lexer = new SCLPostLexer(reader);
+ this.lexer = new SCLPostLexer(reader);
+ }
+
+ public SCLPostLexer getLexer() {
+ return lexer;
+ }
+
+ public void setCompilationContext(CompilationContext context) {
+ this.context = context;
+ lexer.setCompilationContext(context);
}
public void setParserOptions(SCLParserOptions options) {
@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() {
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++);
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++);
@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
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()) {
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
@Override
protected Object reduceBlank() {
- return new EVar("_");
+ return new EVar(((Token)get(0)).location, "_");
}
@Override
protected Object reduceDo() {
EBlock block = (EBlock)get(1);
Token doToken = (Token)get(0);
- block.setMonadic( doToken.text.equals("mdo") );
+ switch(doToken.text) {
+ case "mdo":
+ block.setBlockType(BlockType.Monad);
+ break;
+ case "edo":
+ block.setBlockType(BlockType.MonadE);
+ break;
+ }
block.location = Locations.location(Locations.beginOf(doToken.location), Locations.endOf(block.location));
return block;
}
protected Object reduceGreater() {
return new EVar(((Token)get(0)).text);
}
+
+ @Override
+ protected Object reduceDoubleLess() {
+ return new EVar(((Token)get(0)).text);
+ }
+
+ @Override
+ protected Object reduceDoubleGreater() {
+ return new EVar(((Token)get(0)).text);
+ }
@Override
protected Object reduceDot() {
return new TApplyAst((TypeAst)get(0), parameters);
}
- @Override
- protected Object reduceDummy1() {
- throw new UnsupportedOperationException();
- }
-
@SuppressWarnings("unchecked")
@Override
protected void postReduce(Object reduced) {
@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
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() {
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
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
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;
+ ConstructorAst constructor = (ConstructorAst)get(1);
+ return new ConstraintStatement(constructor.name, constructor.parameters, constructor.fieldNames, constructor.annotations);
}
/*
new QConjunction((Query[])get(1)),
(Expression)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);
+ }
+
+ /*@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;
+ }*/
+
+ @Override
+ protected Object reduceCHRSelect() {
+ return new EPreCHRSelect((CHRAstQuery)get(3), (Expression)get(1));
+ }
+
+ @Override
+ protected Object reduceCHRAtom() {
+ return CHRAstAtom.atom((Expression)get(0));
+ }
+
+ @Override
+ protected Object reduceCHREquals() {
+ return new CHRAstEquals((Expression)get(0), (Expression)get(2));
+ }
+
+ @Override
+ protected Object reduceCHRBinds() {
+ return new CHRAstBinds((Expression)get(0), (Expression)get(2));
+ }
+
+ @Override
+ protected Object reduceCHRConjunction() {
+ CHRAstQuery[] conjuncts = new CHRAstQuery[(length()+1)/2];
+ for(int i=0;i<conjuncts.length;++i)
+ conjuncts[i] = (CHRAstQuery)get(i*2);
+ return CHRAstConjunction.conjunction(conjuncts);
+ }
@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;
+ protected Object reduceVerboseCHRConjunction() {
+ CHRAstQuery[] conjuncts = new CHRAstQuery[(length()-1)/2];
+ for(int i=0;i<conjuncts.length;++i)
+ conjuncts[i] = (CHRAstQuery)get(i*2+1);
+ return CHRAstConjunction.conjunction(conjuncts);
}
@Override
protected Object reduceVerboseCHRStatement() {
- return new CHRStatement((ListQualifier[])get(1), (ListQualifier[])get(3));
+ return new CHRStatement((CHRAstQuery)get(1), (CHRAstQuery)get(3));
+ }
+
+ @Override
+ protected Object reduceCHRStatement() {
+ return new CHRStatement((CHRAstQuery)get(0), (CHRAstQuery)get(2));
+ }
+
+ @Override
+ protected Object reduceWildcard() {
+ return new FieldAssignment(FieldAssignment.WILDCARD, null);
+ }
+
+ @Override
+ protected Object reducePlainEffect() {
+ ArrayList<TypeAst> effects = new ArrayList<TypeAst>(length()/2);
+ for(int i=1;i<length();i+=2) {
+ Token token = (Token)get(i);
+ TVarAst ast = new TVarAst(token.text);
+ ast.location = token.location;
+ effects.add(ast);
+ }
+ return new TPlainEffectAst(effects);
}
}