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); }
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)); }