Beispiel #1
0
 /// <summary>||运算符表达式</summary>
 public static Expr CreateOrElse(OrElseExpr Value)
 {
     return(new Expr {
         _Tag = ExprTag.OrElse, OrElse = Value
     });
 }
        private Expr TranslateExpr(SyntaxExpr e)
        {
            Expr m;

            if (e.OnLiteral)
            {
                m = Expr.CreateLiteral(TranslateLiteral(e.Literal.Literal));
            }
            else if (e.OnFunction)
            {
                var Parameters = new LinkedList <Expr>();
                var p          = e.Function.ParameterList;
                if (p.OnNull)
                {
                }
                else if (p.OnNonnull)
                {
                    var n = p.Nonnull.NonnullParameterList;
                    while (true)
                    {
                        if (n.OnSingle)
                        {
                            Parameters.AddFirst(TranslateExpr(n.Single.Expr));
                            break;
                        }
                        else if (n.OnMultiple)
                        {
                            Parameters.AddFirst(TranslateExpr(n.Multiple.Expr));
                            n = n.Multiple.NonnullParameterList;
                        }
                        else
                        {
                            throw new InvalidOperationException();
                        }
                    }
                }
                else
                {
                    throw new InvalidOperationException();
                }
                var Name = e.Function.Identifier.Name;
                if (Name == "if" && Parameters.Count == 3)
                {
                    var ie = new IfExpr {
                        Condition = Parameters.First.Value, TruePart = Parameters.First.Next.Value, FalsePart = Parameters.First.Next.Next.Value
                    };
                    Positions.Add(ie, Positions[e]);
                    m = Expr.CreateIf(ie);
                }
                else
                {
                    var fe = new FunctionExpr {
                        Name = Name, Parameters = Parameters.ToList()
                    };
                    Positions.Add(fe, Positions[e]);
                    m = Expr.CreateFunction(fe);
                }
            }
            else if (e.OnVariable)
            {
                var ve = new VariableExpr {
                    Name = e.Variable.Identifier.Name
                };
                Positions.Add(ve, Positions[e]);
                m = Expr.CreateVariable(ve);
            }
            else if (e.OnParen)
            {
                return(TranslateExpr(e.Paren.Expr));
            }
            else if (e.OnUnaryOperator)
            {
                var fe = new FunctionExpr {
                    Name = e.UnaryOperator.UnaryOperator.Name, Parameters = new List <Expr> {
                        TranslateExpr(e.UnaryOperator.Expr)
                    }
                };
                Positions.Add(fe, Positions[e]);
                m = Expr.CreateFunction(fe);
            }
            else if (e.OnBinaryOperator)
            {
                var Name = e.BinaryOperator.BinaryOperator.Name;
                if (Name == "&&")
                {
                    var aae = new AndAlsoExpr {
                        Left = TranslateExpr(e.BinaryOperator.Left), Right = TranslateExpr(e.BinaryOperator.Right)
                    };
                    Positions.Add(aae, Positions[e]);
                    m = Expr.CreateAndAlso(aae);
                }
                else if (Name == "||")
                {
                    var oee = new OrElseExpr {
                        Left = TranslateExpr(e.BinaryOperator.Left), Right = TranslateExpr(e.BinaryOperator.Right)
                    };
                    Positions.Add(oee, Positions[e]);
                    m = Expr.CreateOrElse(oee);
                }
                else
                {
                    var fe = new FunctionExpr {
                        Name = Name, Parameters = new List <Expr> {
                            TranslateExpr(e.BinaryOperator.Left), TranslateExpr(e.BinaryOperator.Right)
                        }
                    };
                    Positions.Add(fe, Positions[e]);
                    m = Expr.CreateFunction(fe);
                }
            }
            else
            {
                throw new InvalidOperationException();
            }
            Positions.Add(m, Positions[e]);
            return(m);
        }