def for_statement(self): self.consume(TokenType.LEFT_PAREN, "Expect '(' after 'for'.") # initializer = None if self.match(TokenType.SEMICOLON): initializer = None elif self.match(TokenType.VAR): initializer = self.var_declaration() else: initializer = self.expression_statement() condition = None if not self.check(TokenType.SEMICOLON): condition = self.expression() self.consume(TokenType.SEMICOLON, "Expect ';' after loop condition.") increment = None if not self.check(TokenType.RIGHT_PAREN): increment = self.expression() self.consume(TokenType.RIGHT_PAREN, "Expect ')' after for clauses.") body = self.statement() if increment is not None: body = Stmt.Block([body, Stmt.Expression(increment)]) condition = SyntaxTree.Literal( True) if condition is None else condition body = Stmt.While(condition, body) if initializer is not None: body = Stmt.Block([initializer, body]) return body
def statement(self): if self.match(TokenType.FOR): return self.for_statement() elif self.match(TokenType.IF): return self.if_statement() elif self.match(TokenType.PRINT): return self.print_statement() elif self.match(TokenType.RETURN): return self.return_statement() elif self.match(TokenType.WHILE): return self.while_statement() elif self.match(TokenType.LEFT_BRACE): return Stmt.Block(self.block()) else: return self.expression_statement()