//Compiles a provided set of equations. This method is to be used for local //scopes only. private void CompileEquationSet(ElaEquationSet set, LabelMap map) { var list = RunForwardDeclaration(set.Equations, map); list = ProcessFunctions(list, map); list = ProcessBindings(list, map); //Expressions are not allowed in this context if (list.Count > 0) { for (var i = 0; i < list.Count; i++) { AddError(ElaCompilerError.InvalidExpression, list[i], FormatNode(list[i])); } } }
private void ProcessBinding(ElaEquationSet block, ElaEquation bid, ElaExpression left, ElaExpression right) { bid.Left = left; bid.Right = right; if (bindings.Peek() == unit) { block.Equations.Add(bid); return; } var fName = default(String); if (right != null && left.Type == ElaNodeType.Juxtaposition && !left.Parens) { var fc = (ElaJuxtaposition)left; if (fc.Target.Type == ElaNodeType.NameReference) { fName = fc.Target.GetName(); } } if (fName != null) { var lastB = bindings.Peek(); if (lastB != null && ((ElaJuxtaposition)lastB.Left).Target.GetName() == fName) { lastB.Next = bid; } else { block.Equations.Add(bid); } bindings.Pop(); bindings.Push(bid); } else { block.Equations.Add(bid); } }