Example #1
0
        public InterpreterResult Visit(VarAssignmentNode node, Context context)
        {
            if (!context.SymbolTable.IsDefined(node.VarNameTok.Value))
            {
                return(new InterpreterResult(null, new RuntimeError($"{node.VarNameTok.Value} is not defined", node.VarNameTok.Pos_Start, node.VarNameTok.Pos_End, context)));
            }
            var result = Visit(node.ValueNode, context);

            if (result.Error != null)
            {
                return(result.Error);
            }
            context.SymbolTable[node.VarNameTok.Value] = result.Result;
            return(result);
        }
Example #2
0
        private ParseResult ForExpr()
        {
            var start = current_token.Pos_Start.Copy();

            Advance();
            Node initNode = null;

            if (current_token.Type == TokenType.INDENTIFIER)
            {
                Token idToken = current_token;
                Advance();
                if (current_token.Equals(TokenType.EQ))
                {
                    Advance();
                    var expr = Expr();
                    if (expr.HasError())
                    {
                        return(expr);
                    }
                    initNode = new VarAssignmentNode(idToken, expr.Node).SetPos(idToken.Pos_Start, idToken.Pos_End);
                }
            }
            else if (current_token.Equals(new Token(TokenType.KEYWORD, "var")))
            {
                var declarationResult = GetVarDeclaration();
                if (declarationResult.HasError())
                {
                    return(declarationResult);
                }
                initNode = declarationResult.Node;
            }
            else
            {
                return(new InvalidSyntaxError("Expected identifier or var", current_token.Pos_Start, current_token.Pos_End));
            }

            if (!current_token.Equals(new Token(TokenType.KEYWORD, "to")))
            {
                return(new InvalidSyntaxError("Expected 'to'", current_token.Pos_Start, current_token.Pos_End));
            }
            Advance();

            var endResult = Expr();

            if (endResult.HasError())
            {
                return(endResult);
            }
            ParseResult stepResult = null;

            if (current_token.Equals(new Token(TokenType.KEYWORD, "step")))
            {
                Advance();
                stepResult = Expr();
                if (stepResult.HasError())
                {
                    return(stepResult);
                }
            }
            if (!current_token.Equals(new Token(TokenType.KEYWORD, "then")))
            {
                return(new InvalidSyntaxError("Expected 'then'", current_token.Pos_Start, current_token.Pos_End));
            }
            Advance();

            var bodyResult = Expr();

            if (bodyResult.HasError())
            {
                return(bodyResult);
            }

            return(new ForNode(initNode, endResult.Node, stepResult?.Node, bodyResult.Node).SetPos(start, current_token.Pos_End));
        }