Example #1
0
        public Node ParseAssignment()
        {
            Node left = ParseOr();

            if (match(TokenType.EQUAL))
            {
                Node right = ParseAssignment();

                if (left is VariableNode)
                {
                    Token name = ((VariableNode)left).variable;
                    return(new AssignNode(name, right, ((VariableNode)left).is_global));
                }
                else if (left is TableGetNode)
                {
                    TableGetNode get = (TableGetNode)left;
                    return(new TableSetNode(get.value, get.get_name, right));
                }
                else if (left is TableGetExprNode)
                {
                    TableGetExprNode get = (TableGetExprNode)left;
                    return(new TableSetExprNode(get.value, get.get_expr, right));
                }
            }

            return(left);
        }
Example #2
0
        public Node ParseGetAndCall()
        {
            Node left = ParsePrimary();

            while (true)
            {
                if (match(TokenType.LEFT_PAREN))
                {
                    left = FinishParseCall(left);
                }
                else if (match(TokenType.DOT))
                {
                    Token name = consume(TokenType.IDENTIFIER, "Expected property name after '.'");
                    left = new TableGetNode(left, name);
                }
                else if (match(TokenType.POINTER_ARROW))
                {
                    Token name = consume(TokenType.IDENTIFIER, "Expected function name after '->'");
                    left = new TableGetNode(left, name, true);
                }
                else if (match(TokenType.LEFT_SQR))
                {
                    if (match(TokenType.RIGHT_SQR))
                    {
                        throw error(previous(), "Expected expression inside indexing");
                    }

                    Node index_expr = ParseExpression();
                    consume(TokenType.RIGHT_SQR, "Expected ']' after indexing expression");

                    left = new TableGetExprNode(left, index_expr);
                }
                else
                {
                    break;
                }
            }

            return(left);
        }