Exemple #1
0
        public void Parser_CanParseFunctionLiteral()
        {
            string input = @"
fn(x, y) { x + y; }
";

            AST result = this.subject.ParseProgram(input);

            Assert.Empty(result.Errors);
            Assert.Equal(1, result.Program.Statements.Count);

            ExpressionStatement actual       = this.AssertAndCast <ExpressionStatement>(result.Program.Statements[0]);
            FunctionLiteral     fnExpression = this.AssertAndCast <FunctionLiteral>(actual.Expression);

            Assert.Equal(2, fnExpression.Parameters.Count);

            Identifier paramExpr = this.AssertAndCast <Identifier>(fnExpression.Parameters[0]);

            Assert.Equal("x", paramExpr.Value);
            paramExpr = this.AssertAndCast <Identifier>(fnExpression.Parameters[1]);
            Assert.Equal("y", paramExpr.Value);

            Assert.Equal(1, fnExpression.Body.Statements.Count);
            ExpressionStatement body     = this.AssertAndCast <ExpressionStatement>(fnExpression.Body.Statements[0]);
            InfixExpression     bodyExpr = this.AssertAndCast <InfixExpression>(body.Expression);

            Assert.Equal("x", bodyExpr.Left.TokenLiteral);
            Assert.Equal(TokenType.Plus, bodyExpr.Operator);
            Assert.Equal("y", bodyExpr.Right.TokenLiteral);
        }
Exemple #2
0
        private Object evalInfixExpression(InfixExpression infixExpression)
        {
            var    context = ExecutionContext.Peek();
            var    left    = Eval(context, infixExpression.Left);
            var    right   = Eval(context, infixExpression.Right);
            Object result  = null;

            switch (infixExpression.Operator.Type)
            {
            case Token.TokenType.Equal:
                result = new Bool(left.Same(right));
                break;

            case Token.TokenType.NotEqual:
                result = new Bool(!left.Same(right));
                break;

            case Token.TokenType.Plus:
                result = left.Add(right);
                break;

            default: break;
            }
            return(result);
        }
Exemple #3
0
        private string buildInfixExpression(InfixExpression infixExpression)
        {
            var result = "";

            result += Build(infixExpression.Left) + " ";
            result += infixExpression.Operator.Literal + " ";
            result += Build(infixExpression.Right);
            return(result);
        }
        private IExpression parseInfixExpression(IExpression left)
        {
            var expression = new InfixExpression(currentToken, currentToken.Literal, left);

            var precedence = CurrentPrecedence();

            NextToken();

            expression.Right = ParseExpression(precedence);
            return(expression);
        }
        private IExpression ParseInfixExpression(IExpression left)
        {
            var exp = new InfixExpression {
                Token = CurToken, Left = left, Operator = CurToken.Literal
            };
            var precedence = CurPrecedence();

            NextToken();
            exp.Right = ParseExpression(precedence);

            return(exp);
        }
Exemple #6
0
        private Expression ParseInfixExpression(Expression left)
        {
            InfixExpression exp = new InfixExpression {
                Token    = this._curToken,
                Operator = this._curToken.Literal,
                Left     = left,
            };
            Precedence prece = this.CurPrecedence();

            this.NextToken();
            exp.Right = this.ParseExpression(prece);
            return(exp);
        }
Exemple #7
0
        public async Task CalcCommand(SocketMessage message, [FullText] string expression)
        {
            var expr = new InfixExpression(expression);

            try
            {
                var value = expr.Evaluate(null);
                await message.Channel.SendMessageAsync($"{value}");
            }
            catch (Exception)
            {
                await message.Channel.SendMessageAsync("Sorry, I can't calculate that");
            }
        }
Exemple #8
0
        private Expression ParseInfixExpression(Expression left)
        {
            InfixExpression exp = new InfixExpression
            {
                Left     = left,
                Token    = _currentToken,
                Operator = _currentToken.Literal,
            };
            Precedence precedence = _precedences[_currentToken.Type];

            ReadNextToken();
            exp.Right = ParseExpression(precedence);
            return(exp);
        }
Exemple #9
0
        public IExpression ParseInfixExpression(IExpression left)
        {
            var expression = new InfixExpression()
            {
                Token    = this.CurrentToken,
                Operator = this.CurrentToken.Literal,
                Left     = left,
            };

            var precedence = this.CurrentPrecedence;

            this.ReadToken();
            expression.Right = this.ParseExpression(precedence);

            return(expression);
        }
Exemple #10
0
        private IExpression ParseInfixExpression(IExpression left)
        {
            var expr = new InfixExpression
            {
                Token    = currentToken,
                Operator = currentToken.Literal,
                Left     = left
            };
            var precedence = CurrentPrecedence();

            // skip current token
            NextToken();
            expr.Right = ParseExpression(precedence);

            return(expr);
        }
Exemple #11
0
 public static Object.Object EvalInfixExpression(InfixExpression expression)
 {
     Object.Object left = Eval(expression.Left);
     Object.IntegerObject leftInteger = left as Object.IntegerObject;
     if(leftInteger == null)
     {
         throw new Exception("Infix expression left branch is not Object.IntegerObject");
     }
     Object.Object right = Eval(expression.Right);
     Object.IntegerObject rightInteger = right as Object.IntegerObject;
     if(rightInteger == null)
     {
         throw new Exception("Infix expression right branch is not Object.IntegerObject");
     }
     return InfixExpression(leftInteger, expression.Operator, rightInteger);
 }
Exemple #12
0
        private IExpression ParseInfixExpression(IExpression left)
        {
            var expression = new InfixExpression
            {
                Token    = _currentToken,
                Operator = _currentToken.Literal,
                Left     = left
            };

            var precedense = CurPrecedence();

            NextToken();
            expression.Right = ParseExpression(precedense);

            return(expression);
        }
Exemple #13
0
        public void Parser_CanParseInfixExpressions(string input, int expectedLeft, TokenType expectedOp, int expectedRight)
        {
            AST result = this.subject.ParseProgram(input);

            Assert.Equal(1, result.Program.Statements.Count);
            Assert.Empty(result.Errors);

            ExpressionStatement stmt = this.AssertAndCast <ExpressionStatement>(result.Program.Statements[0]);
            InfixExpression     exp  = this.AssertAndCast <InfixExpression>(stmt.Expression);

            Assert.Equal(expectedOp, exp.Operator);

            IntegerLiteral intExpression = this.AssertAndCast <IntegerLiteral>(exp.Left);

            Assert.Equal(expectedLeft, intExpression.Value);

            intExpression = this.AssertAndCast <IntegerLiteral>(exp.Right);
            Assert.Equal(expectedRight, intExpression.Value);
        }
Exemple #14
0
        private ExpressionNode ParseInfixExpression(ExpressionNode left)
        {
            if (TokenPrecedence == 0) // all infix tokens have binding powers
            {
                UnexpectedToken();
            }

            switch (Token)
            {
            case TokenType.ARROW:
                return(ParseArrowFunction(left));

            case TokenType.PERIOD:
                return(ParseStaticLookupExpression(left));

            case TokenType.LPAREN:
                return(ParseInvocationExpression(left));

            case TokenType.LBRACK:
                return(ParseDynamicLookupExpression(left));

            case TokenType.CONDITIONAL:
                return(ParseConditionalExpression(left));

            case TokenType.ASSIGN:
            case TokenType.ASSIGN_ADD:
            case TokenType.ASSIGN_DIV:
            case TokenType.ASSIGN_MOD:
            case TokenType.ASSIGN_MUL:
            case TokenType.ASSIGN_SUB:
                return(ParseAssignmentExpression(left));

            default: {
                InfixExpression ret = NewNode <InfixExpression>();
                ret.Left = left;
                int precedence = TokenPrecedence;
                NextToken();
                ret.Right = ParseExpression(precedence);
                return(ret);
            }
            }
        }
Exemple #15
0
        public void Parser_CanParseArrayLiterals()
        {
            string input = @"[1, 2 * 2, 3 + 3]";

            AST result = this.subject.ParseProgram(input);

            Assert.Empty(result.Errors);
            Assert.Equal(1, result.Program.Statements.Count);
            ExpressionStatement expr        = this.AssertAndCast <ExpressionStatement>(result.Program.Statements[0]);
            ArrayLiteral        arrayResult = this.AssertAndCast <ArrayLiteral>(expr.Expression);

            Assert.Equal(3, arrayResult.Elements.Count);

            IntegerLiteral intLiteral = this.AssertAndCast <IntegerLiteral>(arrayResult.Elements[0]);

            Assert.Equal(1, intLiteral.Value);

            InfixExpression exprLiteral = this.AssertAndCast <InfixExpression>(arrayResult.Elements[1]);

            Assert.Equal("(2 * 2)", exprLiteral.StringValue);

            exprLiteral = this.AssertAndCast <InfixExpression>(arrayResult.Elements[2]);
            Assert.Equal("(3 + 3)", exprLiteral.StringValue);
        }
 private static bool HasDerivative(InfixExpression node)
 {
     return(HasDerivative(node.Left) || HasDerivative(node.Right));
 }
Exemple #17
0
 private void CompileInfixExpression(InstructionSet instructionSet, InfixExpression node, Scope scope, LocalTable table)
 {
     CompileExpression(instructionSet, node.Left, scope, table);
     CompileExpression(instructionSet, node.Right, scope, table);
     instructionSet.Define(InstructionType.Send, node.Operator, "1");
 }
Exemple #18
0
        private Expression CompileInfixExpression(InfixExpression node)
        {
            ValueTypes NeededType;

            switch (node.Token)
            {
            case TokenType.EQ:
            case TokenType.NE:
                NeededType = ValueTypes.BOXED;
                break;

            case TokenType.COMMA:
                NeededType = ValueTypes.VOID;
                break;

            case TokenType.OR:
            case TokenType.AND:
                NeededType = ValueTypes.BOOL;
                break;

            case TokenType.ADD:
            case TokenType.SUB:
            case TokenType.MUL:
            case TokenType.DIV:
            case TokenType.MOD:
            case TokenType.LT:
            case TokenType.GT:
            case TokenType.LTE:
            case TokenType.GTE:
                NeededType = ValueTypes.DOUBLE;
                break;

            default:
                throw new Exception(String.Format("Encounterd an impossible infix operator {0}", node.Token));
            }
            Expression Left  = CompileExpression(node.Left, NeededType);
            Expression Right = CompileExpression(node.Right, NeededType);

            switch (node.Token)
            {
            case TokenType.COMMA:
                return(Expression.Block(Left, Right));

            case TokenType.OR:
                return(Expression.OrElse(Left, Right));

            case TokenType.AND:
                return(Expression.AndAlso(Left, Right));

            case TokenType.ADD:
                return(Expression.Add(Left, Right));

            case TokenType.SUB:
                return(Expression.Subtract(Left, Right));

            case TokenType.DIV:
                return(Expression.Divide(Left, Right));

            case TokenType.MUL:
                return(Expression.Multiply(Left, Right));

            case TokenType.MOD:
                return(Expression.Modulo(Left, Right));

            case TokenType.EQ:
                return(Expression.Equal(Left, Right));

            case TokenType.NE:
                return(Expression.NotEqual(Left, Right));

            case TokenType.LT:
                return(Expression.LessThan(Left, Right));

            case TokenType.GT:
                return(Expression.GreaterThan(Left, Right));

            case TokenType.LTE:
                return(Expression.LessThanOrEqual(Left, Right));

            case TokenType.GTE:
                return(Expression.GreaterThanOrEqual(Left, Right));

            default:
                throw new Exception(String.Format("Encounterd an impossible infix operator {0}", node.Token));
            }
        }
Exemple #19
0
        /// <summary>
        /// This method converts infix to postfix notation
        /// </summary>
        /// <returns></returns>
        public string Convert()
        {
            //this stack holds the operators
            Stack <Operator> operator_stack = new Stack <Operator>();
            //this stack check for correct parenthesis
            Stack <String> parenthesis_check = new Stack <string>();

            //this array of strings holds each "word" or "letter" or "symbol/operator" or etc.
            String[] fields = InfixExpression.Split(' ');

            //this loop makes sure there there is correct pairing of parenthesis
            for (int i = 0; i < fields.Length; i++)
            {
                if (fields[i] == "(")
                {
                    parenthesis_check.Push("(");
                }
                else if (fields[i] == ")")
                {
                    parenthesis_check.Pop();
                }
            }
            //if the parenthesis stack isn't empty, something went wrong
            if (parenthesis_check.Count != 0)
            {
                MessageBox.Show("Error with expression, check for possible missing parenthesis", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return("");
            }

            //this for loop reads each field one at a time
            for (int i = 0; i < fields.Length; i++)
            {
                //this adds fields that aren't operators to the output string
                if (!IsOperatorSymbol(fields[i]) && fields[i] != ")")
                {
                    PostfixExpression += fields[i] + " ";
                }
                //this pushes operators to the operator stack
                else if (IsOperatorSymbol(fields[i]))
                {
                    //if it is not a ( or ) and the stack's count is not 0
                    if (!fields[i].Equals("(") && !fields[i].Equals(")") && operator_stack.Count != 0)
                    {
                        //loop until lower precedence or ( are found. Pops a item off stack and adds to output string
                        while ((new Operator(operator_stack.Peek().ToString())).Precedence >= (new Operator(fields[i]).Precedence) && !operator_stack.Peek().ToString().Equals("("))
                        {
                            PostfixExpression += operator_stack.Pop() + " ";
                            if (operator_stack.Count == 0)
                            {
                                break;                            //if the stack is empty break out of the loop
                            }
                        }
                        operator_stack.Push(new Operator(fields[i])); //push the new operator onto the stack
                    }
                    else
                    {
                        operator_stack.Push(new Operator(fields[i]));
                    }
                }
                //Upon finding a close parenthesis, the stack is popped and added to the output string until the opening parenthesis is found. Then the opening parenthesis is popped off.
                else if (fields[i].Equals(")"))
                {
                    try
                    {
                        //while the top of that stack isn't a (
                        while (operator_stack.Peek().ToString() != "(")
                        {
                            //if the operator on top isn't a (, pop it and add it to the output string
                            if (!(operator_stack.Peek().ToString() == "("))
                            {
                                PostfixExpression += operator_stack.Pop() + " ";
                            }
                        }
                        //pop the ( from the stack
                        operator_stack.Pop();
                    }
                    catch (Exception exc)
                    {
                        MessageBox.Show("Error with expression, check for possible missing parenthesis", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                //This pops the rest of the operators off the stack and adds them to the output string
            }
            while (operator_stack.Count > 0)
            {
                PostfixExpression += operator_stack.Pop() + " ";
            }

            return(PostfixExpression);
        }