Example #1
0
 public LocalFuncExpr(Position position, IEnumerable <string> paramNames, FuncType type, IUnboundExpr body)
 {
     Position = position;
     ParamNames.AddRange(paramNames);
     Type = type;
     Body = body;
 }
Example #2
0
        public IUnboundExpr AcceptTransformer(IUnboundExprTransformer transformer)
        {
            Target = Target.AcceptTransformer(transformer);
            Value  = Value.AcceptTransformer(transformer);

            return(transformer.Transform(this));
        }
Example #3
0
        // <-- MATCH FlowExpr LINE? (CASE CaseExpr THEN Block)+ END
        //   | FlowExpr
        private IUnboundExpr MatchExpr()
        {
            Position position;

            if (ConsumeIf(TokenType.Match, out position))
            {
                IUnboundExpr matchExpr = FlowExpr();
                ConsumeIf(TokenType.Line);

                var      cases = new List <MatchCase>();
                Position casePosition;
                while (ConsumeIf(TokenType.Case, out casePosition))
                {
                    IPattern caseExpr = CaseExpr();
                    Consume(TokenType.Then);
                    IUnboundExpr bodyExpr = CaseBlock();

                    cases.Add(new MatchCase(casePosition, caseExpr, bodyExpr));

                    // optional line after case
                    ConsumeIf(TokenType.Line);
                }
                Consume(TokenType.End);

                return(new MatchExpr(position, matchExpr, cases));
            }
            else
            {
                return(FlowExpr());
            }
        }
Example #4
0
        public IUnboundExpr Process(string name, IUnboundExpr arg)
        {
            var tuple = arg as TupleExpr;

            if (tuple == null)
            {
                return(null);
            }
            if (tuple.Fields.Count != 2)
            {
                return(null);
            }

            if (name == "&")
            {
                // a & b -> if a then b else false
                return(new IfExpr(arg.Position, tuple.Fields[0], tuple.Fields[1], new BoolExpr(Position.None, false)));
            }
            else if (name == "|")
            {
                // a | b -> if a then true else b
                return(new IfExpr(arg.Position, tuple.Fields[0], new BoolExpr(Position.None, true), tuple.Fields[1]));
            }

            return(null);
        }
Example #5
0
        public Expr(IUnboundExpr unbound)
        {
            if (unbound == null)
            {
                throw new ArgumentNullException("unbound");
            }

            Unbound = unbound;
        }
Example #6
0
 public LetExpr(Position position, IEnumerable <string> names, IUnboundExpr condition,
                IUnboundExpr thenBody, IUnboundExpr elseBody)
 {
     Position  = position;
     Names     = new List <string>(names);
     Condition = condition;
     ThenBody  = thenBody;
     ElseBody  = elseBody;
 }
Example #7
0
        public IUnboundExpr Process(string name, IUnboundExpr arg)
        {
            string macro = name + " Expression";
            if (mScript.HasFunction(macro))
            {
                var argument = ToValue(arg);
                var result = mScript.Run(macro, argument);

                return ToExpr(result);
            }

            return null;
        }
        public IUnboundExpr Process(string name, IUnboundExpr arg)
        {
            string macro = name + " Expression";

            if (mScript.HasFunction(macro))
            {
                var argument = ToValue(arg);
                var result   = mScript.Run(macro, argument);

                return(ToExpr(result));
            }

            return(null);
        }
Example #9
0
        protected IUnboundExpr OneOrMoreLeft(TokenType separatorType, Func <IUnboundExpr> parseFunc, Func <IUnboundExpr, Token, IUnboundExpr, IUnboundExpr> combineFunc)
        {
            IUnboundExpr left = parseFunc();

            while (CurrentIs(separatorType))
            {
                Token separator = Consume(separatorType);

                IUnboundExpr right = parseFunc();

                left = combineFunc(left, separator, right);
            }

            return(left);
        }
Example #10
0
        private Define Define()
        {
            var names    = new List <string>();
            var position = CurrentPosition;

            do
            {
                names.Add(Consume(TokenType.Name).StringValue);
            }while (ConsumeIf(TokenType.Comma));

            Consume(TokenType.LeftArrow);
            IUnboundExpr body = Block();

            return(new Define(position, names, body));
        }
Example #11
0
        // <-- Expression LINE? | LINE (Expression LINE)+ <terminator>
        /// <summary>
        /// Parses a block terminated by "end" or a continue terminator. Used for blocks
        /// that may end or be followed by something else (such as an "else" clause).
        /// </summary>
        /// <param name="continueTerminator"></param>
        private IUnboundExpr InnerBlock(TokenType continueTerminator)
        {
            if (ConsumeIf(TokenType.Line))
            {
                var expressions = new List <IUnboundExpr>();

                bool inBlock = true;
                while (inBlock)
                {
                    expressions.Add(Expression());
                    Consume(TokenType.Line);

                    if (CurrentIs(continueTerminator)) // don't consume
                    {
                        inBlock = false;
                    }
                    else if (ConsumeIf(TokenType.End))
                    {
                        inBlock = false;
                    }
                }

                return(new BlockExpr(expressions));
            }
            else
            {
                IUnboundExpr expr = Expression();

                if (CurrentIs(TokenType.Else))
                {
                    // don't consume
                }
                else if (CurrentIs(TokenType.Line, TokenType.Else))
                {
                    // just consume the line
                    Consume(TokenType.Line);
                }
                // for inner blocks, allow a line at the end. this is for cases like:
                // if foo then bar
                // else bang
                //
                // only do this if there is an "else" after the line so that we don't
                // eat the line after an "if/then"

                return(expr);
            }
        }
Example #12
0
        public Function(Position position, string name, FuncType type, IEnumerable<string> paramNames, IUnboundExpr body,
            IEnumerable<IBoundDecl> typeArgs, bool hasInferrableTypeArguments)
            : base(position, name, typeArgs)
        {
            if (position == null) throw new ArgumentNullException("position");
            if (type == null) throw new ArgumentNullException("type");

            if (paramNames != null)
            {
                ParamNames.AddRange(paramNames);
            }

            Body = new Expr(body);

            Type = type;
            HasInferrableTypeArguments = hasInferrableTypeArguments;
        }
Example #13
0
        public IUnboundExpr Process(string name, IUnboundExpr arg)
        {
            var tuple = arg as TupleExpr;

            if (tuple == null) return null;
            if (tuple.Fields.Count != 2) return null;

            if (name == "&")
            {
                // a & b -> if a then b else false
                return new IfExpr(arg.Position, tuple.Fields[0], tuple.Fields[1], new BoolExpr(Position.None, false));
            }
            else if (name == "|")
            {
                // a | b -> if a then true else b
                return new IfExpr(arg.Position, tuple.Fields[0], new BoolExpr(Position.None, true), tuple.Fields[1]);
            }

            return null;
        }
Example #14
0
        // <-- RecordExpr (ASSIGN (DOT | OPERATOR | e) Block)?
        private IUnboundExpr AssignExpr()
        {
            IUnboundExpr expr = RecordExpr();

            Position position;

            if (ConsumeIf(TokenType.LeftArrow, out position))
            {
                bool   isDot  = false;
                string opName = String.Empty;

                if (ConsumeIf(TokenType.Dot))
                {
                    isDot = true;
                }
                else if (CurrentIs(TokenType.Operator))
                {
                    Token op = Consume(TokenType.Operator);
                    opName = op.StringValue;
                }

                IUnboundExpr value = Block();

                mC.SetPosition(position);

                if (isDot)
                {
                    expr = mC.Assign(expr, mC.Call(value, expr));
                }
                else if (!String.IsNullOrEmpty(opName))
                {
                    expr = mC.Assign(expr, mC.Op(expr, opName, value));
                }
                else
                {
                    expr = mC.Assign(expr, value);
                }
            }

            return(expr);
        }
Example #15
0
 public IUnboundExpr Def(string name, IUnboundExpr value)
 {
     return(new DefineExpr(mPosition, name, value, false));
 }
 private Value ToValue(IUnboundExpr expr)
 {
     //### bob: implement me!
     return(new Value(true));
 }
Example #17
0
 public Function(Position position, string name, FuncType type, IEnumerable<string> paramNames, IUnboundExpr body)
     : this(position, name, type, paramNames, body, null, false)
 {
 }
Example #18
0
 public Function(Position position, string name, FuncType type, IEnumerable <string> paramNames, IUnboundExpr body)
     : this(position, name, type, paramNames, body, null, false)
 {
 }
Example #19
0
        public IUnboundExpr AcceptTransformer(IUnboundExprTransformer transformer)
        {
            Body = Body.AcceptTransformer(transformer);

            return(transformer.Transform(this));
        }
Example #20
0
 public IUnboundExpr Op(IUnboundExpr left, string op, IUnboundExpr right)
 {
     return Call(op, Tuple(left, right));
 }
Example #21
0
 public IUnboundExpr Def(IList<string> names, IUnboundExpr value)
 {
     return new DefineExpr(mPosition, names, value, false);
 }
Example #22
0
 public IUnboundExpr Assign(IUnboundExpr target, IUnboundExpr value)
 {
     return(new AssignExpr(mPosition, target, value));
 }
Example #23
0
 private Value ToValue(IUnboundExpr expr)
 {
     //### bob: implement me!
     return new Value(true);
 }
Example #24
0
 public IUnboundExpr Call(string name, IUnboundExpr arg)
 {
     return(new CallExpr(new NameExpr(mPosition, name), arg));
 }
Example #25
0
 public IUnboundExpr While(IUnboundExpr condition, IUnboundExpr body)
 {
     return(new WhileExpr(mPosition, condition, body));
 }
Example #26
0
 public IUnboundExpr Op(IUnboundExpr left, string op, IUnboundExpr right)
 {
     return(Call(op, Tuple(left, right)));
 }
Example #27
0
 public IUnboundExpr If(IUnboundExpr condition, IUnboundExpr thenBody, IUnboundExpr elseBody)
 {
     return(new IfExpr(mPosition, condition, thenBody, elseBody));
 }
Example #28
0
 public IUnboundExpr Def(IList <string> names, IUnboundExpr value)
 {
     return(new DefineExpr(mPosition, names, value, false));
 }
Example #29
0
 public IUnboundExpr Call(IUnboundExpr target, IUnboundExpr arg)
 {
     return new CallExpr(target, arg);
 }
Example #30
0
 public IUnboundExpr Def(string name, IUnboundExpr value)
 {
     return new DefineExpr(mPosition, name, value, false);
 }
Example #31
0
 public DefineExpr(Position position, IEnumerable <string> names, IUnboundExpr value, bool isMutable)
     : this(isMutable, new Define[] { new Define(position, names, value) })
 {
 }
Example #32
0
 public IUnboundExpr If(IUnboundExpr condition, IUnboundExpr thenBody, IUnboundExpr elseBody)
 {
     return new IfExpr(mPosition, condition, thenBody, elseBody);
 }
Example #33
0
 public Define(Position position, IEnumerable <string> names, IUnboundExpr value)
 {
     Position = position;
     Names    = new List <string>(names);
     Value    = value;
 }
Example #34
0
 public MatchExpr(Position position, IUnboundExpr value, IList <MatchCase> cases)
 {
     Position = position;
     Value    = value;
     Cases    = cases;
 }
Example #35
0
 /// <summary>
 /// Instantiates a new instance of AssignExpr.
 /// </summary>
 /// <param name="position">Where the expression occurs in the source file.</param>
 /// <param name="target">The target of the assignment.</param>
 /// <param name="value">The value being assigned.</param>
 public AssignExpr(Position position, IUnboundExpr target, IUnboundExpr value)
 {
     Position = position;
     Target   = target;
     Value    = value;
 }
Example #36
0
 public LoopClause(Position position, string name, IUnboundExpr expression)
 {
     Position   = position;
     Name       = name;
     Expression = expression;
 }
Example #37
0
 public MatchCase(Position position, IPattern caseExpr, IUnboundExpr body)
 {
     Position = position;
     Pattern  = caseExpr;
     Body     = body;
 }
Example #38
0
        public Function(Position position, string name, FuncType type, IEnumerable <string> paramNames, IUnboundExpr body,
                        IEnumerable <IBoundDecl> typeArgs, bool hasInferrableTypeArguments)
            : base(position, name, typeArgs)
        {
            if (position == null)
            {
                throw new ArgumentNullException("position");
            }
            if (type == null)
            {
                throw new ArgumentNullException("type");
            }

            if (paramNames != null)
            {
                ParamNames.AddRange(paramNames);
            }

            Body = new Expr(body);

            Type = type;
            HasInferrableTypeArguments = hasInferrableTypeArguments;
        }
Example #39
0
 public IUnboundExpr While(IUnboundExpr condition, IUnboundExpr body)
 {
     return new WhileExpr(mPosition, condition, body);
 }
Example #40
0
 public IUnboundExpr Assign(IUnboundExpr target, IUnboundExpr value)
 {
     return new AssignExpr(mPosition, target, value);
 }
Example #41
0
 public IUnboundExpr Call(string name, IUnboundExpr arg)
 {
     return new CallExpr(new NameExpr(mPosition, name), arg);
 }
Example #42
0
 public DefineExpr(Position position, string name, IUnboundExpr value, bool isMutable)
     : this(isMutable, new Define[] { new Define(position, new string[] { name }, value) })
 {
 }
Example #43
0
 public IUnboundExpr Call(IUnboundExpr target, IUnboundExpr arg)
 {
     return(new CallExpr(target, arg));
 }