Esempio n. 1
0
    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
Esempio n. 2
0
 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()