Exemplo n.º 1
0
    def param_list(self):
        """
        param list, 函数形参列表
        """
        print("param_list....", self.tok, self.lit)
        node = ast.ParamList()

        if self.tok == token.tk_identifier:
            node.append_identifier(ast.Identifier(self.pos, self.tok,
                                                  self.lit))
            self.next_token()
            while self.tok == token.tk_comma:
                self.skip(token.tk_comma)

                if self.tok == token.tk_identifier:
                    node.append_identifier(
                        ast.Identifier(self.pos, self.tok, self.lit))
                    self.next_token()
                else:
                    break
                    # self.error("param error")
        else:
            pass
        print("param_list...>", node)
        return node
Exemplo n.º 2
0
    def function_def_statement(self):
        """
        function_def_statement
        """
        print("function_def_statement....", self.tok, self.lit)
        self.skip(token.kw_def)

        # ident = self.tok
        ident = ast.Identifier(self.pos, self.tok, self.lit)

        self.next_token()

        self.skip(token.tk_left_parenthesis)

        # if self.tok == token.tk_right_parenthesis:
        #     param_list = None
        # else:
        param_list = self.param_list()
        # self.next_token()

        self.skip(token.tk_right_parenthesis)

        block = self.statement_block()

        node = ast.DefStatement(ident, param_list, block)

        print("function_def_statement....>>", node)
        return node
Exemplo n.º 3
0
    def path_statement(self):
        print("path statement....")
        identifier_list = []
        identifier = ast.Identifier(self.pos, self.tok, self.lit)
        identifier_list.append(identifier)
        self.next_token()

        while self.tok == token.tk_period:
            self.skip(token.tk_period)
            if self.tok == token.tk_identifier:
                identifier = ast.Identifier(self.pos, self.tok, self.lit)
                identifier_list.append(identifier)
                self.next_token()
            else:
                self.error("path statement...")
        print("path statement....>>")
        return ast.PathStatement(identifier_list)
Exemplo n.º 4
0
 def import_statement(self):
     """
     import
     """
     print("import statement...")
     self.skip(token.kw_import)
     node = self.path_statement()
     if self.tok == token.kw_as:
         self.skip(token.kw_as)
         if self.tok == token.tk_identifier:
             identifier = ast.Identifier(self.pos, self.tok, self.lit)
         else:
             self.error("as error")
             return
     else:
         identifier = None
     print("import statement ....>>")
     return ast.ImportStatement(node, identifier)
Exemplo n.º 5
0
    def atom(self):
        """原子"""
        print("atom....", self.tok, self.lit)

        if self.tok == token.tk_left_parenthesis:  # (
            self.skip(token.tk_left_parenthesis)
            node = self.boolean_expression()
            node = ast.ParenthForm(node)
            self.skip(token.tk_right_parenthesis)

        elif self.tok == token.tk_left_middle_bracket:
            self.skip(token.tk_left_middle_bracket)
            node = self.expression_list()
            node = ast.ListDisplay(node)
            self.skip(token.tk_right_middle_bracket)

        elif self.tok == token.tk_identifier:
            node = ast.Identifier(self.pos, self.tok, self.lit)
            self.next_token()
            if self.tok == token.tk_left_parenthesis:
                self.skip(token.tk_left_parenthesis)
                node2 = self.expression_list()
                node = ast.Call(node, node2)
                self.skip(token.tk_right_parenthesis)

        elif self.tok == token.tk_string:
            node = ast.StringLiteral(self.pos, self.tok, self.lit)
            self.next_token()

        elif self.tok == token.tk_floatnumber:
            node = ast.FloatNumber(self.pos, self.tok, self.lit)
            self.next_token()

        elif self.tok == token.tk_integer:
            node = ast.Integer(self.pos, self.tok, self.lit)
            self.next_token()

        else:
            node = None
            self.error('atom unexcept ', self.tok, self.lit, self.tok)

        return node
Exemplo n.º 6
0
    def atom(self):
        """原子"""
        print("atom....", self.tok, self.lit)

        if self.tok == token.tk_left_parenthesis:  # (
            self.skip(token.tk_left_parenthesis)
            node = self.boolean_expression()
            node = ast.ParenthForm(node)
            self.skip(token.tk_right_parenthesis)

        elif self.tok == token.tk_left_middle_bracket:  # [
            self.skip(token.tk_left_middle_bracket)
            node = self.expression_list()
            node = ast.ListDisplay(node)
            self.skip(token.tk_right_middle_bracket)

        elif self.tok == token.tk_identifier:  #
            node = ast.Identifier(self.pos, self.tok, self.lit)
            self.next_token()

        elif self.tok == token.kw_self:  # self
            node = ast.Self()
            self.skip(token.kw_self)

        elif self.tok == token.tk_string:
            node = ast.StringLiteral(self.pos, self.tok, self.lit)
            self.next_token()

        elif self.tok == token.tk_floatnumber:
            node = ast.FloatNumber(self.pos, self.tok, self.lit)
            self.next_token()

        elif self.tok == token.tk_integer:
            node = ast.Integer(self.pos, self.tok, self.lit)
            self.next_token()

        else:
            node = None
            self.error('atom unexcept >>', self.pos, self.tok, self.lit, node)

        while self.tok == token.tk_left_parenthesis \
                or self.tok == token.tk_period:

            if self.tok == token.tk_left_parenthesis:
                self.skip(token.tk_left_parenthesis)
                if self.tok == token.tk_right_parenthesis:
                    node2 = None
                else:
                    node2 = self.expression_list()
                node = ast.Call(node, node2)
                self.skip(token.tk_right_parenthesis)

            elif self.tok == token.tk_period:

                self.skip(token.tk_period)
                if self.tok == token.tk_identifier:
                    node = ast.PeriodForm(
                        node, ast.Identifier(self.pos, self.tok, self.lit))
                    self.next_token()
                else:
                    node = None
                    self.error('atom unexcept parse periodform >>', self.pos,
                               self.tok, self.lit, node)

            else:
                self.error("atom unexcept, in while....>>")

        return node
Exemplo n.º 7
0
 def parse_identifier(self):
     p = self
     return ast.Identifier(p.ctok)