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
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
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)
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)
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
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
def parse_identifier(self): p = self return ast.Identifier(p.ctok)