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.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.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;
this.lexer = new SCLPostLexer(reader);
}
+ public SCLPostLexer getLexer() {
+ return lexer;
+ }
+
public void setCompilationContext(CompilationContext context) {
this.context = context;
lexer.setCompilationContext(context);
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 EViewPattern((Expression)get(1), (Expression)get(3));
}
- @Override
- protected Object reduceCHRStatement() {
- return new CHRStatement((ListQualifier[])get(0), (ListQualifier[])get(2));
- }
-
@Override
protected Object reduceConstraintStatement() {
ConstructorAst constructor = (ConstructorAst)get(1);
return new ConstraintStatement(constructor.name, constructor.parameters, constructor.fieldNames, constructor.annotations);
}
- @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() {
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() {
@Override
protected Object reduceCHRSelect() {
- return new EPreCHRSelect((ListQualifier[])get(3), (Expression)get(1));
+ 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 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((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);
}
}