コード例 #1
0
        //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]));
                }
            }
        }
コード例 #2
0
        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);
            }
        }