Exemplo n.º 1
0
        public static void BuildOperators(Grammar g, ref int counter, string expressionName, string termName, string termishName)
        {
            var Counter = counter;

            //g.PrefixOperators["++", true, true] = new OperatorDetails("a", AssociativityType.Left, null);
            //g.PrefixOperators["--", true, true] = new OperatorDetails("a", AssociativityType.Left, null);
            //g.PostfixOperators["--", true, true] = new OperatorDetails("a", AssociativityType.Right, null);
            //g.PostfixOperators["++", true, true] = new OperatorDetails("a", AssociativityType.Right, null);
            g.AddInfixOperator("+", "Add");
            g.AddInfixOperator("~", "Add");
            g.AddInfixOperator("-", "Subtract");
            g.AddInfixOperator("*", "Multiply");
            g.AddInfixOperator("/", "Divide");
            g.AddInfixOperator("%", "Modulus");
            g.AddInfixOperator("<<", "LeftShift");
            g.AddInfixOperator(">>", "RightShift");
            g.AddInfixOperator("&&", "LogicalAnd");
            g.AddInfixOperator("||", "LogicalOr");
            g.AddInfixOperator("^^", "LogicalXor");
            g.AddInfixOperator("&", "BitwiseAnd");
            g.AddInfixOperator("|", "BitwiseOr");
            g.AddInfixOperator("^", "BitwiseXor");
            g.AddInfixMutator("+=", "AssignAdd");
            g.AddInfixMutator("-=", "AssignSubtract");
            g.AddInfixMutator("*=", "AssignMultiply");
            g.AddInfixMutator("/=", "AssignDivide");
            g.AddInfixMutator("%=", "AssignModulus");
            g.AddInfixMutator("<<=", "AssignLeftShift");
            g.AddInfixMutator(">>=", "AssignRightShift");
            g.AddInfixMutator("&=", "AssignAnd");
            g.AddInfixMutator("|=", "AssignOr");
            g.AddInfixMutator("^=", "AssignXor");
            g.AddInfixOperator("<", "LT");
            g.AddInfixOperator(">", "GT");
            g.AddInfixOperator("<=", "LE");
            g.AddInfixOperator(">=", "GE");
            g.AddInfixOperator("==", "EQ");
            g.AddInfixOperator("!=", "NE");
            //g.CircumfixOperators["(", true, true] = new OperatorDetails("a", AssociativityType.Left, null, ")");
            //g.PostCircumfixOperators["(", true, true] = new OperatorDetails("a", AssociativityType.Left, null, ")");

            g.InfixOperators["=", true, true] = new OperatorDetails("a", AssociativityType.Right, (Grammar gr, string optext, Operand left, Operand right) =>
            {
                var c     = gr.CodeGen;
                var match = c["m"];
                c.AssignAdd(c["VC"], 1); // create a local to store the intermediate result
                //c.WriteLine("an assignment to " + left.Field("Result").Cast(typeof(Field)).Invoke("FieldName"));
                c.InvokeAssign(c["cg"][c["VC"].Invoke("ToString")], left.Field("Result"), "Assign", right.Field("Result"));
                c.If(right.Field("Result").Property("Type").Property("Name").Invoke("StartsWith", "_Closure").LogicalAnd(left.Field("Result").Property("Type").IsInstanceOf(typeof(Field))));
                {
                    // propagate the closure's type generator so type inference works
                    //c.WriteLine("found a " + c["current_scope"][varname].Field("Type").Property("Name"));
                    //c.WriteLine(c["m"]["myInitializer"].Field("Result").Property("Type"));
                    c.Assign(c["current_scope"][left.Field("Result").Cast(typeof(Field)).Invoke("FieldName")].Field("TypeGen"), c["GG"].Field("ClosuresByName")[right.Field("Result").Property("Type").Property("Name")].Field("IntGen"));
                }
                c.End();
                c.Assign(match.Field("Result"), c["cg"][c["VC"].Invoke("ToString")]);
            });

            counter = Counter;
        }