void MatchExpr(out ElaExpression exp) { scanner.InjectBlock(); bindings.Push(unit); while (!(la.kind == 0 || la.kind == 29)) {SynErr(77); Get();} Expect(29); var match = new ElaMatch(t); exp = match; var block = default(ElaEquationSet); var cexp = default(ElaExpression); Expr(out cexp); match.Expression = cexp; Expect(34); BindingChain(out block); match.Entries = block; bindings.Pop(); EndBlock(); }
//Used to compile a 'match' expression. private void CompileMatchExpression(ElaMatch n, LabelMap map, Hints hints) { CompileExpression(n.Expression, map, Hints.None, n); AddLinePragma(n); CompileSimpleMatch(n.Entries.Equations, map, hints, n.Expression); if ((hints & Hints.Left) == Hints.Left) AddValueNotUsed(n); }
private ElaExpression ValidateDoBlock(ElaExpression exp) { if (exp.Type == ElaNodeType.Juxtaposition && ((ElaJuxtaposition)exp).Parameters[0] == null) { var ext = ((ElaJuxtaposition)exp).Parameters[1]; var ctx = default(ElaContext); if (ext.Type == ElaNodeType.Context) { ctx = (ElaContext)ext; ext = ctx.Expression; } var eqt = new ElaJuxtaposition { Spec = true }; eqt.SetLinePragma(exp.Line, exp.Column); eqt.Target = new ElaNameReference(t) { Name = ">>=" }; eqt.Parameters.Add(ext); var jux = new ElaJuxtaposition(); jux.SetLinePragma(exp.Line, exp.Column); jux.Target = new ElaNameReference { Name = "point" }; jux.Parameters.Add(new ElaUnitLiteral()); eqt.Parameters.Add(new ElaLambda { Left = new ElaPlaceholder(), Right = jux }); if (ctx != null) { ctx.Expression = eqt; exp = ctx; } else exp = eqt; } var root = exp; while (true) { if (exp.Type == ElaNodeType.Juxtaposition) { var juxta = (ElaJuxtaposition)exp; if (juxta.Parameters.Count == 2) { juxta.Parameters[0] = Reduce(juxta.Parameters[0], juxta); juxta.Parameters[1] = Reduce(juxta.Parameters[1], juxta); exp = juxta.Parameters[1]; } else break; } else if (exp.Type == ElaNodeType.LetBinding) { var lb = (ElaLetBinding)exp; lb.Expression = Reduce(lb.Expression, lb); exp = lb.Expression; } else if (exp.Type == ElaNodeType.Lambda) { var lb = (ElaLambda)exp; lb.Right = Reduce(lb.Right, lb); if (lb.Left.Type != ElaNodeType.NameReference && lb.Left.Type != ElaNodeType.Placeholder) { var em = new ElaMatch(); em.SetLinePragma(lb.Left.Line, lb.Left.Column); em.Expression = new ElaNameReference { Name = "$x01" }; em.Entries = new ElaEquationSet(); var eq1 = new ElaEquation(); eq1.SetLinePragma(lb.Left.Line, lb.Left.Column); eq1.Left = lb.Left; eq1.Right = lb.Right; em.Entries.Equations.Add(eq1); var eq2 = new ElaEquation(); eq2.SetLinePragma(lb.Left.Line, lb.Left.Column); eq2.Left = new ElaNameReference { Name = "$x02" }; var errExp = new ElaJuxtaposition(); errExp.SetLinePragma(lb.Left.Line, lb.Left.Column); errExp.Target = new ElaNameReference { Name = "failure" }; errExp.Parameters.Add(new ElaNameReference { Name = "$x02" }); eq2.Right = errExp; em.Entries.Equations.Add(eq2); lb.Left = new ElaNameReference { Name = "$x01" }; lb.Right = em; exp = lb; } else exp = lb.Right; } else break; } var ret = new ElaLazyLiteral { Expression = root }; ret.SetLinePragma(root.Line, root.Column); return ret; }