PageRenderTime 53ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/pypy/interpreter/astcompiler/astbuilder.py

https://bitbucket.org/dac_io/pypy
Python | 1279 lines | 1263 code | 11 blank | 5 comment | 22 complexity | 1687ae9c9d63aaaaca9363b576bc36f5 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. from pypy.interpreter.astcompiler import ast, consts, misc
  2. from pypy.interpreter.astcompiler import asthelpers # Side effects
  3. from pypy.interpreter import error
  4. from pypy.interpreter.pyparser.pygram import syms, tokens
  5. from pypy.interpreter.pyparser.error import SyntaxError
  6. from pypy.interpreter.pyparser import parsestring
  7. from pypy.rlib.objectmodel import specialize
  8. def ast_from_node(space, node, compile_info):
  9. """Turn a parse tree, node, to AST."""
  10. return ASTBuilder(space, node, compile_info).build_ast()
  11. augassign_operator_map = {
  12. '+=' : ast.Add,
  13. '-=' : ast.Sub,
  14. '/=' : ast.Div,
  15. '//=' : ast.FloorDiv,
  16. '%=' : ast.Mod,
  17. '<<=' : ast.LShift,
  18. '>>=' : ast.RShift,
  19. '&=' : ast.BitAnd,
  20. '|=' : ast.BitOr,
  21. '^=' : ast.BitXor,
  22. '*=' : ast.Mult,
  23. '**=' : ast.Pow
  24. }
  25. operator_map = misc.dict_to_switch({
  26. tokens.VBAR : ast.BitOr,
  27. tokens.CIRCUMFLEX : ast.BitXor,
  28. tokens.AMPER : ast.BitAnd,
  29. tokens.LEFTSHIFT : ast.LShift,
  30. tokens.RIGHTSHIFT : ast.RShift,
  31. tokens.PLUS : ast.Add,
  32. tokens.MINUS : ast.Sub,
  33. tokens.STAR : ast.Mult,
  34. tokens.SLASH : ast.Div,
  35. tokens.DOUBLESLASH : ast.FloorDiv,
  36. tokens.PERCENT : ast.Mod
  37. })
  38. class ASTBuilder(object):
  39. def __init__(self, space, n, compile_info):
  40. self.space = space
  41. self.compile_info = compile_info
  42. self.root_node = n
  43. def build_ast(self):
  44. """Convert an top level parse tree node into an AST mod."""
  45. n = self.root_node
  46. if n.type == syms.file_input:
  47. stmts = []
  48. for i in range(len(n.children) - 1):
  49. stmt = n.children[i]
  50. if stmt.type == tokens.NEWLINE:
  51. continue
  52. sub_stmts_count = self.number_of_statements(stmt)
  53. if sub_stmts_count == 1:
  54. stmts.append(self.handle_stmt(stmt))
  55. else:
  56. stmt = stmt.children[0]
  57. for j in range(sub_stmts_count):
  58. small_stmt = stmt.children[j * 2]
  59. stmts.append(self.handle_stmt(small_stmt))
  60. return ast.Module(stmts)
  61. elif n.type == syms.eval_input:
  62. body = self.handle_testlist(n.children[0])
  63. return ast.Expression(body)
  64. elif n.type == syms.single_input:
  65. first_child = n.children[0]
  66. if first_child.type == tokens.NEWLINE:
  67. # An empty line.
  68. return ast.Interactive([])
  69. else:
  70. num_stmts = self.number_of_statements(first_child)
  71. if num_stmts == 1:
  72. stmts = [self.handle_stmt(first_child)]
  73. else:
  74. stmts = []
  75. for i in range(0, len(first_child.children), 2):
  76. stmt = first_child.children[i]
  77. if stmt.type == tokens.NEWLINE:
  78. break
  79. stmts.append(self.handle_stmt(stmt))
  80. return ast.Interactive(stmts)
  81. else:
  82. raise AssertionError("unknown root node")
  83. def number_of_statements(self, n):
  84. """Compute the number of AST statements contained in a node."""
  85. stmt_type = n.type
  86. if stmt_type == syms.compound_stmt:
  87. return 1
  88. elif stmt_type == syms.stmt:
  89. return self.number_of_statements(n.children[0])
  90. elif stmt_type == syms.simple_stmt:
  91. # Divide to remove semi-colons.
  92. return len(n.children) // 2
  93. else:
  94. raise AssertionError("non-statement node")
  95. def error(self, msg, n):
  96. """Raise a SyntaxError with the lineno and column set to n's."""
  97. raise SyntaxError(msg, n.lineno, n.column,
  98. filename=self.compile_info.filename)
  99. def error_ast(self, msg, ast_node):
  100. raise SyntaxError(msg, ast_node.lineno, ast_node.col_offset,
  101. filename=self.compile_info.filename)
  102. def check_forbidden_name(self, name, node):
  103. try:
  104. misc.check_forbidden_name(name)
  105. except misc.ForbiddenNameAssignment, e:
  106. self.error("cannot assign to %s" % (e.name,), node)
  107. def set_context(self, expr, ctx):
  108. """Set the context of an expression to Store or Del if possible."""
  109. try:
  110. expr.set_context(ctx)
  111. except ast.UnacceptableExpressionContext, e:
  112. self.error_ast(e.msg, e.node)
  113. except misc.ForbiddenNameAssignment, e:
  114. self.error_ast("cannot assign to %s" % (e.name,), e.node)
  115. def handle_print_stmt(self, print_node):
  116. dest = None
  117. expressions = None
  118. newline = True
  119. start = 1
  120. child_count = len(print_node.children)
  121. if child_count > 2 and print_node.children[1].type == tokens.RIGHTSHIFT:
  122. dest = self.handle_expr(print_node.children[2])
  123. start = 4
  124. if (child_count + 1 - start) // 2:
  125. expressions = [self.handle_expr(print_node.children[i])
  126. for i in range(start, child_count, 2)]
  127. if print_node.children[-1].type == tokens.COMMA:
  128. newline = False
  129. return ast.Print(dest, expressions, newline, print_node.lineno,
  130. print_node.column)
  131. def handle_del_stmt(self, del_node):
  132. targets = self.handle_exprlist(del_node.children[1], ast.Del)
  133. return ast.Delete(targets, del_node.lineno, del_node.column)
  134. def handle_flow_stmt(self, flow_node):
  135. first_child = flow_node.children[0]
  136. first_child_type = first_child.type
  137. if first_child_type == syms.break_stmt:
  138. return ast.Break(flow_node.lineno, flow_node.column)
  139. elif first_child_type == syms.continue_stmt:
  140. return ast.Continue(flow_node.lineno, flow_node.column)
  141. elif first_child_type == syms.yield_stmt:
  142. yield_expr = self.handle_expr(first_child.children[0])
  143. return ast.Expr(yield_expr, flow_node.lineno, flow_node.column)
  144. elif first_child_type == syms.return_stmt:
  145. if len(first_child.children) == 1:
  146. values = None
  147. else:
  148. values = self.handle_testlist(first_child.children[1])
  149. return ast.Return(values, flow_node.lineno, flow_node.column)
  150. elif first_child_type == syms.raise_stmt:
  151. exc = None
  152. value = None
  153. traceback = None
  154. child_count = len(first_child.children)
  155. if child_count >= 2:
  156. exc = self.handle_expr(first_child.children[1])
  157. if child_count >= 4:
  158. value = self.handle_expr(first_child.children[3])
  159. if child_count == 6:
  160. traceback = self.handle_expr(first_child.children[5])
  161. return ast.Raise(exc, value, traceback, flow_node.lineno,
  162. flow_node.column)
  163. else:
  164. raise AssertionError("unknown flow statement")
  165. def alias_for_import_name(self, import_name, store=True):
  166. while True:
  167. import_name_type = import_name.type
  168. if import_name_type == syms.import_as_name:
  169. name = import_name.children[0].value
  170. if len(import_name.children) == 3:
  171. as_name = import_name.children[2].value
  172. self.check_forbidden_name(as_name, import_name.children[2])
  173. else:
  174. as_name = None
  175. self.check_forbidden_name(name, import_name.children[0])
  176. return ast.alias(name, as_name)
  177. elif import_name_type == syms.dotted_as_name:
  178. if len(import_name.children) == 1:
  179. import_name = import_name.children[0]
  180. continue
  181. alias = self.alias_for_import_name(import_name.children[0],
  182. store=False)
  183. asname_node = import_name.children[2]
  184. alias.asname = asname_node.value
  185. self.check_forbidden_name(alias.asname, asname_node)
  186. return alias
  187. elif import_name_type == syms.dotted_name:
  188. if len(import_name.children) == 1:
  189. name = import_name.children[0].value
  190. if store:
  191. self.check_forbidden_name(name, import_name.children[0])
  192. return ast.alias(name, None)
  193. name_parts = [import_name.children[i].value
  194. for i in range(0, len(import_name.children), 2)]
  195. name = ".".join(name_parts)
  196. return ast.alias(name, None)
  197. elif import_name_type == tokens.STAR:
  198. return ast.alias("*", None)
  199. else:
  200. raise AssertionError("unknown import name")
  201. def handle_import_stmt(self, import_node):
  202. import_node = import_node.children[0]
  203. if import_node.type == syms.import_name:
  204. dotted_as_names = import_node.children[1]
  205. aliases = [self.alias_for_import_name(dotted_as_names.children[i])
  206. for i in range(0, len(dotted_as_names.children), 2)]
  207. return ast.Import(aliases, import_node.lineno, import_node.column)
  208. elif import_node.type == syms.import_from:
  209. child_count = len(import_node.children)
  210. module = None
  211. modname = None
  212. i = 1
  213. dot_count = 0
  214. while i < child_count:
  215. child = import_node.children[i]
  216. if child.type == syms.dotted_name:
  217. module = self.alias_for_import_name(child, False)
  218. i += 1
  219. break
  220. elif child.type != tokens.DOT:
  221. break
  222. i += 1
  223. dot_count += 1
  224. i += 1
  225. after_import_type = import_node.children[i].type
  226. star_import = False
  227. if after_import_type == tokens.STAR:
  228. names_node = import_node.children[i]
  229. star_import = True
  230. elif after_import_type == tokens.LPAR:
  231. names_node = import_node.children[i + 1]
  232. elif after_import_type == syms.import_as_names:
  233. names_node = import_node.children[i]
  234. if len(names_node.children) % 2 == 0:
  235. self.error("trailing comma is only allowed with "
  236. "surronding parenthesis", names_node)
  237. else:
  238. raise AssertionError("unknown import node")
  239. if star_import:
  240. aliases = [self.alias_for_import_name(names_node)]
  241. else:
  242. aliases = [self.alias_for_import_name(names_node.children[i])
  243. for i in range(0, len(names_node.children), 2)]
  244. if module is not None:
  245. modname = module.name
  246. return ast.ImportFrom(modname, aliases, dot_count,
  247. import_node.lineno, import_node.column)
  248. else:
  249. raise AssertionError("unknown import node")
  250. def handle_global_stmt(self, global_node):
  251. names = [global_node.children[i].value
  252. for i in range(1, len(global_node.children), 2)]
  253. return ast.Global(names, global_node.lineno, global_node.column)
  254. def handle_exec_stmt(self, exec_node):
  255. child_count = len(exec_node.children)
  256. globs = None
  257. locs = None
  258. to_execute = self.handle_expr(exec_node.children[1])
  259. if child_count >= 4:
  260. globs = self.handle_expr(exec_node.children[3])
  261. if child_count == 6:
  262. locs = self.handle_expr(exec_node.children[5])
  263. return ast.Exec(to_execute, globs, locs, exec_node.lineno,
  264. exec_node.column)
  265. def handle_assert_stmt(self, assert_node):
  266. child_count = len(assert_node.children)
  267. expr = self.handle_expr(assert_node.children[1])
  268. msg = None
  269. if len(assert_node.children) == 4:
  270. msg = self.handle_expr(assert_node.children[3])
  271. return ast.Assert(expr, msg, assert_node.lineno, assert_node.column)
  272. def handle_suite(self, suite_node):
  273. first_child = suite_node.children[0]
  274. if first_child.type == syms.simple_stmt:
  275. end = len(first_child.children) - 1
  276. if first_child.children[end - 1].type == tokens.SEMI:
  277. end -= 1
  278. stmts = [self.handle_stmt(first_child.children[i])
  279. for i in range(0, end, 2)]
  280. else:
  281. stmts = []
  282. for i in range(2, len(suite_node.children) - 1):
  283. stmt = suite_node.children[i]
  284. stmt_count = self.number_of_statements(stmt)
  285. if stmt_count == 1:
  286. stmts.append(self.handle_stmt(stmt))
  287. else:
  288. simple_stmt = stmt.children[0]
  289. for j in range(0, len(simple_stmt.children), 2):
  290. stmt = simple_stmt.children[j]
  291. if not stmt.children:
  292. break
  293. stmts.append(self.handle_stmt(stmt))
  294. return stmts
  295. def handle_if_stmt(self, if_node):
  296. child_count = len(if_node.children)
  297. if child_count == 4:
  298. test = self.handle_expr(if_node.children[1])
  299. suite = self.handle_suite(if_node.children[3])
  300. return ast.If(test, suite, None, if_node.lineno, if_node.column)
  301. otherwise_string = if_node.children[4].value
  302. if otherwise_string == "else":
  303. test = self.handle_expr(if_node.children[1])
  304. suite = self.handle_suite(if_node.children[3])
  305. else_suite = self.handle_suite(if_node.children[6])
  306. return ast.If(test, suite, else_suite, if_node.lineno,
  307. if_node.column)
  308. elif otherwise_string == "elif":
  309. elif_count = child_count - 4
  310. after_elif = if_node.children[elif_count + 1]
  311. if after_elif.type == tokens.NAME and \
  312. after_elif.value == "else":
  313. has_else = True
  314. elif_count -= 3
  315. else:
  316. has_else = False
  317. elif_count /= 4
  318. if has_else:
  319. last_elif = if_node.children[-6]
  320. last_elif_test = self.handle_expr(last_elif)
  321. elif_body = self.handle_suite(if_node.children[-4])
  322. else_body = self.handle_suite(if_node.children[-1])
  323. otherwise = [ast.If(last_elif_test, elif_body, else_body,
  324. last_elif.lineno, last_elif.column)]
  325. elif_count -= 1
  326. else:
  327. otherwise = None
  328. for i in range(elif_count):
  329. offset = 5 + (elif_count - i - 1) * 4
  330. elif_test_node = if_node.children[offset]
  331. elif_test = self.handle_expr(elif_test_node)
  332. elif_body = self.handle_suite(if_node.children[offset + 2])
  333. new_if = ast.If(elif_test, elif_body, otherwise,
  334. elif_test_node.lineno, elif_test_node.column)
  335. otherwise = [new_if]
  336. expr = self.handle_expr(if_node.children[1])
  337. body = self.handle_suite(if_node.children[3])
  338. return ast.If(expr, body, otherwise, if_node.lineno, if_node.column)
  339. else:
  340. raise AssertionError("unknown if statement configuration")
  341. def handle_while_stmt(self, while_node):
  342. loop_test = self.handle_expr(while_node.children[1])
  343. body = self.handle_suite(while_node.children[3])
  344. if len(while_node.children) == 7:
  345. otherwise = self.handle_suite(while_node.children[6])
  346. else:
  347. otherwise = None
  348. return ast.While(loop_test, body, otherwise, while_node.lineno,
  349. while_node.column)
  350. def handle_for_stmt(self, for_node):
  351. target_node = for_node.children[1]
  352. target_as_exprlist = self.handle_exprlist(target_node, ast.Store)
  353. if len(target_node.children) == 1:
  354. target = target_as_exprlist[0]
  355. else:
  356. target = ast.Tuple(target_as_exprlist, ast.Store,
  357. target_node.lineno, target_node.column)
  358. expr = self.handle_testlist(for_node.children[3])
  359. body = self.handle_suite(for_node.children[5])
  360. if len(for_node.children) == 9:
  361. otherwise = self.handle_suite(for_node.children[8])
  362. else:
  363. otherwise = None
  364. return ast.For(target, expr, body, otherwise, for_node.lineno,
  365. for_node.column)
  366. def handle_except_clause(self, exc, body):
  367. test = None
  368. target = None
  369. suite = self.handle_suite(body)
  370. child_count = len(exc.children)
  371. if child_count >= 2:
  372. test = self.handle_expr(exc.children[1])
  373. if child_count == 4:
  374. target_child = exc.children[3]
  375. target = self.handle_expr(target_child)
  376. self.set_context(target, ast.Store)
  377. return ast.ExceptHandler(test, target, suite, exc.lineno, exc.column)
  378. def handle_try_stmt(self, try_node):
  379. body = self.handle_suite(try_node.children[2])
  380. child_count = len(try_node.children)
  381. except_count = (child_count - 3 ) // 3
  382. otherwise = None
  383. finally_suite = None
  384. possible_extra_clause = try_node.children[-3]
  385. if possible_extra_clause.type == tokens.NAME:
  386. if possible_extra_clause.value == "finally":
  387. if child_count >= 9 and \
  388. try_node.children[-6].type == tokens.NAME:
  389. otherwise = self.handle_suite(try_node.children[-4])
  390. except_count -= 1
  391. finally_suite = self.handle_suite(try_node.children[-1])
  392. except_count -= 1
  393. else:
  394. otherwise = self.handle_suite(try_node.children[-1])
  395. except_count -= 1
  396. if except_count:
  397. handlers = []
  398. for i in range(except_count):
  399. base_offset = i * 3
  400. exc = try_node.children[3 + base_offset]
  401. except_body = try_node.children[5 + base_offset]
  402. handlers.append(self.handle_except_clause(exc, except_body))
  403. except_ast = ast.TryExcept(body, handlers, otherwise,
  404. try_node.lineno, try_node.column)
  405. if finally_suite is None:
  406. return except_ast
  407. body = [except_ast]
  408. return ast.TryFinally(body, finally_suite, try_node.lineno,
  409. try_node.column)
  410. def handle_with_stmt(self, with_node):
  411. body = self.handle_suite(with_node.children[-1])
  412. i = len(with_node.children) - 1
  413. while True:
  414. i -= 2
  415. item = with_node.children[i]
  416. test = self.handle_expr(item.children[0])
  417. if len(item.children) == 3:
  418. target = self.handle_expr(item.children[2])
  419. self.set_context(target, ast.Store)
  420. else:
  421. target = None
  422. wi = ast.With(test, target, body, with_node.lineno,
  423. with_node.column)
  424. if i == 1:
  425. break
  426. body = [wi]
  427. return wi
  428. def handle_classdef(self, classdef_node, decorators=None):
  429. name_node = classdef_node.children[1]
  430. name = name_node.value
  431. self.check_forbidden_name(name, name_node)
  432. if len(classdef_node.children) == 4:
  433. body = self.handle_suite(classdef_node.children[3])
  434. return ast.ClassDef(name, None, body, decorators,
  435. classdef_node.lineno, classdef_node.column)
  436. if classdef_node.children[3].type == tokens.RPAR:
  437. body = self.handle_suite(classdef_node.children[5])
  438. return ast.ClassDef(name, None, body, decorators,
  439. classdef_node.lineno, classdef_node.column)
  440. bases = self.handle_class_bases(classdef_node.children[3])
  441. body = self.handle_suite(classdef_node.children[6])
  442. return ast.ClassDef(name, bases, body, decorators, classdef_node.lineno,
  443. classdef_node.column)
  444. def handle_class_bases(self, bases_node):
  445. if len(bases_node.children) == 1:
  446. return [self.handle_expr(bases_node.children[0])]
  447. return self.get_expression_list(bases_node)
  448. def handle_funcdef(self, funcdef_node, decorators=None):
  449. name_node = funcdef_node.children[1]
  450. name = name_node.value
  451. self.check_forbidden_name(name, name_node)
  452. args = self.handle_arguments(funcdef_node.children[2])
  453. body = self.handle_suite(funcdef_node.children[4])
  454. return ast.FunctionDef(name, args, body, decorators,
  455. funcdef_node.lineno, funcdef_node.column)
  456. def handle_decorated(self, decorated_node):
  457. decorators = self.handle_decorators(decorated_node.children[0])
  458. definition = decorated_node.children[1]
  459. if definition.type == syms.funcdef:
  460. node = self.handle_funcdef(definition, decorators)
  461. elif definition.type == syms.classdef:
  462. node = self.handle_classdef(definition, decorators)
  463. else:
  464. raise AssertionError("unkown decorated")
  465. node.lineno = decorated_node.lineno
  466. node.col_offset = decorated_node.column
  467. return node
  468. def handle_decorators(self, decorators_node):
  469. return [self.handle_decorator(dec) for dec in decorators_node.children]
  470. def handle_decorator(self, decorator_node):
  471. dec_name = self.handle_dotted_name(decorator_node.children[1])
  472. if len(decorator_node.children) == 3:
  473. dec = dec_name
  474. elif len(decorator_node.children) == 5:
  475. dec = ast.Call(dec_name, None, None, None, None,
  476. decorator_node.lineno, decorator_node.column)
  477. else:
  478. dec = self.handle_call(decorator_node.children[3], dec_name)
  479. return dec
  480. def handle_dotted_name(self, dotted_name_node):
  481. base_value = dotted_name_node.children[0].value
  482. name = ast.Name(base_value, ast.Load, dotted_name_node.lineno,
  483. dotted_name_node.column)
  484. for i in range(2, len(dotted_name_node.children), 2):
  485. attr = dotted_name_node.children[i].value
  486. name = ast.Attribute(name, attr, ast.Load, dotted_name_node.lineno,
  487. dotted_name_node.column)
  488. return name
  489. def handle_arguments(self, arguments_node):
  490. if arguments_node.type == syms.parameters:
  491. if len(arguments_node.children) == 2:
  492. return ast.arguments(None, None, None, None)
  493. arguments_node = arguments_node.children[1]
  494. i = 0
  495. child_count = len(arguments_node.children)
  496. defaults = []
  497. args = []
  498. variable_arg = None
  499. keywords_arg = None
  500. have_default = False
  501. while i < child_count:
  502. argument = arguments_node.children[i]
  503. arg_type = argument.type
  504. if arg_type == syms.fpdef:
  505. parenthesized = False
  506. complex_args = False
  507. while True:
  508. if i + 1 < child_count and \
  509. arguments_node.children[i + 1].type == tokens.EQUAL:
  510. default_node = arguments_node.children[i + 2]
  511. defaults.append(self.handle_expr(default_node))
  512. i += 2
  513. have_default = True
  514. elif have_default:
  515. if parenthesized and not complex_args:
  516. msg = "parenthesized arg with default"
  517. else:
  518. msg = ("non-default argument follows default "
  519. "argument")
  520. self.error(msg, arguments_node)
  521. if len(argument.children) == 3:
  522. sub_arg = argument.children[1]
  523. if len(sub_arg.children) != 1:
  524. complex_args = True
  525. args.append(self.handle_arg_unpacking(sub_arg))
  526. else:
  527. parenthesized = True
  528. argument = sub_arg.children[0]
  529. continue
  530. if argument.children[0].type == tokens.NAME:
  531. name_node = argument.children[0]
  532. arg_name = name_node.value
  533. self.check_forbidden_name(arg_name, name_node)
  534. name = ast.Name(arg_name, ast.Param, name_node.lineno,
  535. name_node.column)
  536. args.append(name)
  537. i += 2
  538. break
  539. elif arg_type == tokens.STAR:
  540. name_node = arguments_node.children[i + 1]
  541. variable_arg = name_node.value
  542. self.check_forbidden_name(variable_arg, name_node)
  543. i += 3
  544. elif arg_type == tokens.DOUBLESTAR:
  545. name_node = arguments_node.children[i + 1]
  546. keywords_arg = name_node.value
  547. self.check_forbidden_name(keywords_arg, name_node)
  548. i += 3
  549. else:
  550. raise AssertionError("unknown node in argument list")
  551. if not defaults:
  552. defaults = None
  553. if not args:
  554. args = None
  555. return ast.arguments(args, variable_arg, keywords_arg, defaults)
  556. def handle_arg_unpacking(self, fplist_node):
  557. args = []
  558. for i in range((len(fplist_node.children) + 1) / 2):
  559. fpdef_node = fplist_node.children[i * 2]
  560. while True:
  561. child = fpdef_node.children[0]
  562. if child.type == tokens.NAME:
  563. arg = ast.Name(child.value, ast.Store, child.lineno,
  564. child.column)
  565. args.append(arg)
  566. else:
  567. child = fpdef_node.children[1]
  568. if len(child.children) == 1:
  569. fpdef_node = child.children[0]
  570. continue
  571. args.append(self.handle_arg_unpacking(child))
  572. break
  573. tup = ast.Tuple(args, ast.Store, fplist_node.lineno, fplist_node.column)
  574. self.set_context(tup, ast.Store)
  575. return tup
  576. def handle_stmt(self, stmt):
  577. stmt_type = stmt.type
  578. if stmt_type == syms.stmt:
  579. stmt = stmt.children[0]
  580. stmt_type = stmt.type
  581. if stmt_type == syms.simple_stmt:
  582. stmt = stmt.children[0]
  583. stmt_type = stmt.type
  584. if stmt_type == syms.small_stmt:
  585. stmt = stmt.children[0]
  586. stmt_type = stmt.type
  587. if stmt_type == syms.expr_stmt:
  588. return self.handle_expr_stmt(stmt)
  589. elif stmt_type == syms.print_stmt:
  590. return self.handle_print_stmt(stmt)
  591. elif stmt_type == syms.del_stmt:
  592. return self.handle_del_stmt(stmt)
  593. elif stmt_type == syms.pass_stmt:
  594. return ast.Pass(stmt.lineno, stmt.column)
  595. elif stmt_type == syms.flow_stmt:
  596. return self.handle_flow_stmt(stmt)
  597. elif stmt_type == syms.import_stmt:
  598. return self.handle_import_stmt(stmt)
  599. elif stmt_type == syms.global_stmt:
  600. return self.handle_global_stmt(stmt)
  601. elif stmt_type == syms.assert_stmt:
  602. return self.handle_assert_stmt(stmt)
  603. elif stmt_type == syms.exec_stmt:
  604. return self.handle_exec_stmt(stmt)
  605. else:
  606. raise AssertionError("unhandled small statement")
  607. elif stmt_type == syms.compound_stmt:
  608. stmt = stmt.children[0]
  609. stmt_type = stmt.type
  610. if stmt_type == syms.if_stmt:
  611. return self.handle_if_stmt(stmt)
  612. elif stmt_type == syms.while_stmt:
  613. return self.handle_while_stmt(stmt)
  614. elif stmt_type == syms.for_stmt:
  615. return self.handle_for_stmt(stmt)
  616. elif stmt_type == syms.try_stmt:
  617. return self.handle_try_stmt(stmt)
  618. elif stmt_type == syms.with_stmt:
  619. return self.handle_with_stmt(stmt)
  620. elif stmt_type == syms.funcdef:
  621. return self.handle_funcdef(stmt)
  622. elif stmt_type == syms.classdef:
  623. return self.handle_classdef(stmt)
  624. elif stmt_type == syms.decorated:
  625. return self.handle_decorated(stmt)
  626. else:
  627. raise AssertionError("unhandled compound statement")
  628. else:
  629. raise AssertionError("unknown statment type")
  630. def handle_expr_stmt(self, stmt):
  631. if len(stmt.children) == 1:
  632. expression = self.handle_testlist(stmt.children[0])
  633. return ast.Expr(expression, stmt.lineno, stmt.column)
  634. elif stmt.children[1].type == syms.augassign:
  635. # Augmented assignment.
  636. target_child = stmt.children[0]
  637. target_expr = self.handle_testlist(target_child)
  638. self.set_context(target_expr, ast.Store)
  639. value_child = stmt.children[2]
  640. if value_child.type == syms.testlist:
  641. value_expr = self.handle_testlist(value_child)
  642. else:
  643. value_expr = self.handle_expr(value_child)
  644. op_str = stmt.children[1].children[0].value
  645. operator = augassign_operator_map[op_str]
  646. return ast.AugAssign(target_expr, operator, value_expr,
  647. stmt.lineno, stmt.column)
  648. else:
  649. # Normal assignment.
  650. targets = []
  651. for i in range(0, len(stmt.children) - 2, 2):
  652. target_node = stmt.children[i]
  653. if target_node.type == syms.yield_expr:
  654. self.error("can't assign to yield expression", target_node)
  655. target_expr = self.handle_testlist(target_node)
  656. self.set_context(target_expr, ast.Store)
  657. targets.append(target_expr)
  658. value_child = stmt.children[-1]
  659. if value_child.type == syms.testlist:
  660. value_expr = self.handle_testlist(value_child)
  661. else:
  662. value_expr = self.handle_expr(value_child)
  663. return ast.Assign(targets, value_expr, stmt.lineno, stmt.column)
  664. def get_expression_list(self, tests):
  665. return [self.handle_expr(tests.children[i])
  666. for i in range(0, len(tests.children), 2)]
  667. def handle_testlist(self, tests):
  668. if len(tests.children) == 1:
  669. return self.handle_expr(tests.children[0])
  670. else:
  671. elts = self.get_expression_list(tests)
  672. return ast.Tuple(elts, ast.Load, tests.lineno, tests.column)
  673. def handle_expr(self, expr_node):
  674. # Loop until we return something.
  675. while True:
  676. expr_node_type = expr_node.type
  677. if expr_node_type == syms.test or expr_node_type == syms.old_test:
  678. first_child = expr_node.children[0]
  679. if first_child.type in (syms.lambdef, syms.old_lambdef):
  680. return self.handle_lambdef(first_child)
  681. elif len(expr_node.children) > 1:
  682. return self.handle_ifexp(expr_node)
  683. else:
  684. expr_node = first_child
  685. elif expr_node_type == syms.or_test or \
  686. expr_node_type == syms.and_test:
  687. if len(expr_node.children) == 1:
  688. expr_node = expr_node.children[0]
  689. continue
  690. seq = [self.handle_expr(expr_node.children[i])
  691. for i in range(0, len(expr_node.children), 2)]
  692. if expr_node_type == syms.or_test:
  693. op = ast.Or
  694. else:
  695. op = ast.And
  696. return ast.BoolOp(op, seq, expr_node.lineno, expr_node.column)
  697. elif expr_node_type == syms.not_test:
  698. if len(expr_node.children) == 1:
  699. expr_node = expr_node.children[0]
  700. continue
  701. expr = self.handle_expr(expr_node.children[1])
  702. return ast.UnaryOp(ast.Not, expr, expr_node.lineno,
  703. expr_node.column)
  704. elif expr_node_type == syms.comparison:
  705. if len(expr_node.children) == 1:
  706. expr_node = expr_node.children[0]
  707. continue
  708. operators = []
  709. operands = []
  710. expr = self.handle_expr(expr_node.children[0])
  711. for i in range(1, len(expr_node.children), 2):
  712. operators.append(self.handle_comp_op(expr_node.children[i]))
  713. operands.append(self.handle_expr(expr_node.children[i + 1]))
  714. return ast.Compare(expr, operators, operands, expr_node.lineno,
  715. expr_node.column)
  716. elif expr_node_type == syms.expr or \
  717. expr_node_type == syms.xor_expr or \
  718. expr_node_type == syms.and_expr or \
  719. expr_node_type == syms.shift_expr or \
  720. expr_node_type == syms.arith_expr or \
  721. expr_node_type == syms.term:
  722. if len(expr_node.children) == 1:
  723. expr_node = expr_node.children[0]
  724. continue
  725. return self.handle_binop(expr_node)
  726. elif expr_node_type == syms.yield_expr:
  727. if len(expr_node.children) == 2:
  728. exp = self.handle_testlist(expr_node.children[1])
  729. else:
  730. exp = None
  731. return ast.Yield(exp, expr_node.lineno, expr_node.column)
  732. elif expr_node_type == syms.factor:
  733. if len(expr_node.children) == 1:
  734. expr_node = expr_node.children[0]
  735. continue
  736. return self.handle_factor(expr_node)
  737. elif expr_node_type == syms.power:
  738. return self.handle_power(expr_node)
  739. else:
  740. raise AssertionError("unknown expr")
  741. def handle_lambdef(self, lambdef_node):
  742. expr = self.handle_expr(lambdef_node.children[-1])
  743. if len(lambdef_node.children) == 3:
  744. args = ast.arguments(None, None, None, None)
  745. else:
  746. args = self.handle_arguments(lambdef_node.children[1])
  747. return ast.Lambda(args, expr, lambdef_node.lineno, lambdef_node.column)
  748. def handle_ifexp(self, if_expr_node):
  749. body = self.handle_expr(if_expr_node.children[0])
  750. expression = self.handle_expr(if_expr_node.children[2])
  751. otherwise = self.handle_expr(if_expr_node.children[4])
  752. return ast.IfExp(expression, body, otherwise, if_expr_node.lineno,
  753. if_expr_node.column)
  754. def handle_comp_op(self, comp_op_node):
  755. comp_node = comp_op_node.children[0]
  756. comp_type = comp_node.type
  757. if len(comp_op_node.children) == 1:
  758. if comp_type == tokens.LESS:
  759. return ast.Lt
  760. elif comp_type == tokens.GREATER:
  761. return ast.Gt
  762. elif comp_type == tokens.EQEQUAL:
  763. return ast.Eq
  764. elif comp_type == tokens.LESSEQUAL:
  765. return ast.LtE
  766. elif comp_type == tokens.GREATEREQUAL:
  767. return ast.GtE
  768. elif comp_type == tokens.NOTEQUAL:
  769. return ast.NotEq
  770. elif comp_type == tokens.NAME:
  771. if comp_node.value == "is":
  772. return ast.Is
  773. elif comp_node.value == "in":
  774. return ast.In
  775. else:
  776. raise AssertionError("invalid comparison")
  777. else:
  778. raise AssertionError("invalid comparison")
  779. else:
  780. if comp_op_node.children[1].value == "in":
  781. return ast.NotIn
  782. elif comp_node.value == "is":
  783. return ast.IsNot
  784. else:
  785. raise AssertionError("invalid comparison")
  786. def handle_binop(self, binop_node):
  787. left = self.handle_expr(binop_node.children[0])
  788. right = self.handle_expr(binop_node.children[2])
  789. op = operator_map(binop_node.children[1].type)
  790. result = ast.BinOp(left, op, right, binop_node.lineno,
  791. binop_node.column)
  792. number_of_ops = (len(binop_node.children) - 1) / 2
  793. for i in range(1, number_of_ops):
  794. op_node = binop_node.children[i * 2 + 1]
  795. op = operator_map(op_node.type)
  796. sub_right = self.handle_expr(binop_node.children[i * 2 + 2])
  797. result = ast.BinOp(result, op, sub_right, op_node.lineno,
  798. op_node.column)
  799. return result
  800. def handle_factor(self, factor_node):
  801. # Fold '-' on constant numbers.
  802. if factor_node.children[0].type == tokens.MINUS and \
  803. len(factor_node.children) == 2:
  804. factor = factor_node.children[1]
  805. if factor.type == syms.factor and len(factor.children) == 1:
  806. power = factor.children[0]
  807. if power.type == syms.power and len(power.children) == 1:
  808. atom = power.children[0]
  809. if atom.type == syms.atom and \
  810. atom.children[0].type == tokens.NUMBER:
  811. num = atom.children[0]
  812. num.value = "-" + num.value
  813. return self.handle_atom(atom)
  814. expr = self.handle_expr(factor_node.children[1])
  815. op_type = factor_node.children[0].type
  816. if op_type == tokens.PLUS:
  817. op = ast.UAdd
  818. elif op_type == tokens.MINUS:
  819. op = ast.USub
  820. elif op_type == tokens.TILDE:
  821. op = ast.Invert
  822. else:
  823. raise AssertionError("invalid factor node")
  824. return ast.UnaryOp(op, expr, factor_node.lineno, factor_node.column)
  825. def handle_power(self, power_node):
  826. atom_expr = self.handle_atom(power_node.children[0])
  827. if len(power_node.children) == 1:
  828. return atom_expr
  829. for i in range(1, len(power_node.children)):
  830. trailer = power_node.children[i]
  831. if trailer.type != syms.trailer:
  832. break
  833. tmp_atom_expr = self.handle_trailer(trailer, atom_expr)
  834. tmp_atom_expr.lineno = atom_expr.lineno
  835. tmp_atom_expr.col_offset = atom_expr.col_offset
  836. atom_expr = tmp_atom_expr
  837. if power_node.children[-1].type == syms.factor:
  838. right = self.handle_expr(power_node.children[-1])
  839. atom_expr = ast.BinOp(atom_expr, ast.Pow, right, power_node.lineno,
  840. power_node.column)
  841. return atom_expr
  842. def handle_slice(self, slice_node):
  843. first_child = slice_node.children[0]
  844. if first_child.type == tokens.DOT:
  845. return ast.Ellipsis()
  846. if len(slice_node.children) == 1 and first_child.type == syms.test:
  847. index = self.handle_expr(first_child)
  848. return ast.Index(index)
  849. lower = None
  850. upper = None
  851. step = None
  852. if first_child.type == syms.test:
  853. lower = self.handle_expr(first_child)
  854. if first_child.type == tokens.COLON:
  855. if len(slice_node.children) > 1:
  856. second_child = slice_node.children[1]
  857. if second_child.type == syms.test:
  858. upper = self.handle_expr(second_child)
  859. elif len(slice_node.children) > 2:
  860. third_child = slice_node.children[2]
  861. if third_child.type == syms.test:
  862. upper = self.handle_expr(third_child)
  863. last_child = slice_node.children[-1]
  864. if last_child.type == syms.sliceop:
  865. if len(last_child.children) == 1:
  866. step = ast.Name("None", ast.Load, last_child.lineno,
  867. last_child.column)
  868. else:
  869. step_child = last_child.children[1]
  870. if step_child.type == syms.test:
  871. step = self.handle_expr(step_child)
  872. return ast.Slice(lower, upper, step)
  873. def handle_trailer(self, trailer_node, left_expr):
  874. first_child = trailer_node.children[0]
  875. if first_child.type == tokens.LPAR:
  876. if len(trailer_node.children) == 2:
  877. return ast.Call(left_expr, None, None, None, None,
  878. trailer_node.lineno, trailer_node.column)
  879. else:
  880. return self.handle_call(trailer_node.children[1], left_expr)
  881. elif first_child.type == tokens.DOT:
  882. attr = trailer_node.children[1].value
  883. return ast.Attribute(left_expr, attr, ast.Load,
  884. trailer_node.lineno, trailer_node.column)
  885. else:
  886. middle = trailer_node.children[1]
  887. if len(middle.children) == 1:
  888. slice = self.handle_slice(middle.children[0])
  889. return ast.Subscript(left_expr, slice, ast.Load,
  890. middle.lineno, middle.column)
  891. slices = []
  892. simple = True
  893. for i in range(0, len(middle.children), 2):
  894. slc = self.handle_slice(middle.children[i])
  895. if not isinstance(slc, ast.Index):
  896. simple = False
  897. slices.append(slc)
  898. if not simple:
  899. ext_slice = ast.ExtSlice(slices)
  900. return ast.Subscript(left_expr, ext_slice, ast.Load,
  901. middle.lineno, middle.column)
  902. elts = []
  903. for idx in slices:
  904. assert isinstance(idx, ast.Index)
  905. elts.append(idx.value)
  906. tup = ast.Tuple(elts, ast.Load, middle.lineno, middle.column)
  907. return ast.Subscript(left_expr, ast.Index(tup), ast.Load,
  908. middle.lineno, middle.column)
  909. def handle_call(self, args_node, callable_expr):
  910. arg_count = 0
  911. keyword_count = 0
  912. generator_count = 0
  913. for argument in args_node.children:
  914. if argument.type == syms.argument:
  915. if len(argument.children) == 1:
  916. arg_count += 1
  917. elif argument.children[1].type == syms.comp_for:
  918. generator_count += 1
  919. else:
  920. keyword_count += 1
  921. if generator_count > 1 or \
  922. (generator_count and (keyword_count or arg_count)):
  923. self.error("Generator expression must be parenthesized "
  924. "if not sole argument", args_node)
  925. if arg_count + keyword_count + generator_count > 255:
  926. self.error("more than 255 arguments", args_node)
  927. args = []
  928. keywords = []
  929. used_keywords = {}
  930. variable_arg = None
  931. keywords_arg = None
  932. child_count = len(args_node.children)
  933. i = 0
  934. while i < child_count:
  935. argument = args_node.children[i]
  936. if argument.type == syms.argument:
  937. if len(argument.children) == 1:
  938. expr_node = argument.children[0]
  939. if keywords:
  940. self.error("non-keyword arg after keyword arg",
  941. expr_node)
  942. if variable_arg:
  943. self.error("only named arguments may follow "
  944. "*expression", expr_node)
  945. args.append(self.handle_expr(expr_node))
  946. elif argument.children[1].type == syms.comp_for:
  947. args.append(self.handle_genexp(argument))
  948. else:
  949. keyword_node = argument.children[0]
  950. keyword_expr = self.handle_expr(keyword_node)
  951. if isinstance(keyword_expr, ast.Lambda):
  952. self.error("lambda cannot contain assignment",
  953. keyword_node)
  954. elif not isinstance(keyword_expr, ast.Name):
  955. self.error("keyword can't be an expression",
  956. keyword_node)
  957. keyword = keyword_expr.id
  958. if keyword in used_keywords:
  959. self.error("keyword argument repeated", keyword_node)
  960. used_keywords[keyword] = None
  961. self.check_forbidden_name(keyword, keyword_node)
  962. keyword_value = self.handle_expr(argument.children[2])
  963. keywords.append(ast.keyword(keyword, keyword_value))
  964. elif argument.type == tokens.STAR:
  965. variable_arg = self.handle_expr(args_node.children[i + 1])
  966. i += 1
  967. elif argument.type == tokens.DOUBLESTAR:
  968. keywords_arg = self.handle_expr(args_node.children[i + 1])
  969. i += 1
  970. i += 1
  971. if not args:
  972. args = None
  973. if not keywords:
  974. keywords = None
  975. return ast.Call(callable_expr, args, keywords, variable_arg,
  976. keywords_arg, callable_expr.lineno,
  977. callable_expr.col_offset)
  978. def parse_number(self, raw):
  979. base = 10
  980. if raw.startswith("-"):
  981. negative = True
  982. raw = raw.lstrip("-")
  983. else:
  984. negative = False
  985. if raw.startswith("0"):
  986. if len(raw) > 2 and raw[1] in "Xx":
  987. base = 16
  988. elif len(raw) > 2 and raw[1] in "Bb":
  989. base = 2
  990. ## elif len(raw) > 2 and raw[1] in "Oo": # Fallback below is enough
  991. ## base = 8
  992. elif len(raw) > 1:
  993. base = 8
  994. # strip leading characters
  995. i = 0
  996. limit = len(raw) - 1
  997. while i < limit:
  998. if base == 16 and raw[i] not in "0xX":
  999. break
  1000. if base == 8 and raw[i] not in "0oO":
  1001. break
  1002. if base == 2 and raw[i] not in "0bB":
  1003. break
  1004. i += 1
  1005. raw = raw[i:]
  1006. if not raw[0].isdigit():
  1007. raw = "0" + raw
  1008. if negative:
  1009. raw = "-" + raw
  1010. w_num_str = self.space.wrap(raw)
  1011. w_index = None
  1012. w_base = self.space.wrap(base)
  1013. if raw[-1] in "lL":
  1014. tp = self.space.w_long
  1015. return self.space.call_function(tp, w_num_str, w_base)
  1016. elif raw[-1] in "jJ":
  1017. tp = self.space.w_complex
  1018. return self.space.call_function(tp, w_num_str)
  1019. try:
  1020. return self.space.call_function(self.space.w_int, w_num_str, w_base)
  1021. except error.OperationError, e:
  1022. if not e.match(self.space, self.space.w_ValueError):
  1023. raise
  1024. return self.space.call_function(self.space.w_float, w_num_str)
  1025. def handle_atom(self, atom_node):
  1026. first_child = atom_node.children[0]
  1027. first_child_type = first_child.type
  1028. if first_child_type == tokens.NAME:
  1029. return ast.Name(first_child.value, ast.Load,
  1030. first_child.lineno, first_child.column)
  1031. elif first_child_type == tokens.STRING:
  1032. space = self.space
  1033. encoding = self.compile_info.encoding
  1034. flags = self.compile_info.flags
  1035. unicode_literals = flags & consts.CO_FUTURE_UNICODE_LITERALS
  1036. try:
  1037. sub_strings_w = [parsestring.parsestr(space, encoding, s.value,
  1038. unicode_literals)
  1039. for s in atom_node.children]
  1040. except error.OperationError, e:
  1041. if not e.match(space, space.w_UnicodeError):
  1042. raise
  1043. # UnicodeError in literal: turn into SyntaxError
  1044. self.error(e.errorstr(space), atom_node)
  1045. sub_strings_w = [] # please annotator
  1046. # This implements implicit string concatenation.
  1047. if len(sub_strings_w) > 1:
  1048. w_sub_strings = space.newlist(sub_strings_w)
  1049. w_join = space.getattr(space.wrap(""), space.wrap("join"))
  1050. final_string = space.call_function(w_join, w_sub_strings)
  1051. else:
  1052. final_string = sub_strings_w[0]
  1053. return ast.Str(final_string, atom_node.lineno, atom_node.column)
  1054. elif first_child_type == tokens.NUMBER:
  1055. num_value = self.parse_number(first_child.value)
  1056. return ast.Num(num_value, atom_node.lineno, atom_node.column)
  1057. elif first_child_type == tokens.LPAR:
  1058. second_child = atom_node.children[1]
  1059. if second_child.type == tokens.RPAR:
  1060. return ast.Tuple(None, ast.Load, atom_node.lineno,
  1061. atom_node.column)
  1062. elif second_child.type == syms.yield_expr:
  1063. return self.handle_expr(second_child)
  1064. return self.handle_testlist_gexp(second_child)
  1065. elif first_child_type == tokens.LSQB:
  1066. second_child = atom_node.children[1]
  1067. if second_child.type ==

Large files files are truncated, but you can click here to view the full file