1 # cython: auto_cpdef=True, infer_types=True
6 # This should be done automatically
8 cython.declare(Nodes=object, ExprNodes=object, EncodedString=object)
14 from Cython.Compiler.Scanning import PyrexScanner, FileSourceDescriptor
18 from StringEncoding import EncodedString, BytesLiteral, _unicode, _bytes
19 from ModuleNode import ModuleNode
20 from Errors import error, warning, InternalError
21 from Cython import Utils
28 visibility = 'private'
37 def __init__(self, **kwds):
38 self.__dict__.update(kwds)
40 def __call__(self, **kwds):
43 d.update(self.__dict__)
47 def p_ident(s, message = "Expected an identifier"):
57 while s.sy == 'IDENT':
58 names.append(s.systring)
65 #------------------------------------------
69 #------------------------------------------
71 def p_binop_operator(s):
77 def p_binop_expr(s, ops, p_sub_expr):
80 op, pos = p_binop_operator(s)
82 n1 = ExprNodes.binop_node(pos, op, n1, n2)
84 if Future.division in s.context.future_directives:
85 n1.truedivision = True
87 n1.truedivision = None # unknown
90 #lambdef: 'lambda' [varargslist] ':' test
92 def p_lambdef(s, allow_conditional=True):
98 star_arg = starstar_arg = None
100 args, star_arg, starstar_arg = p_varargslist(
101 s, terminator=':', annotated=False)
103 if allow_conditional:
106 expr = p_test_nocond(s)
107 return ExprNodes.LambdaNode(
109 star_arg = star_arg, starstar_arg = starstar_arg,
112 #lambdef_nocond: 'lambda' [varargslist] ':' test_nocond
114 def p_lambdef_nocond(s):
115 return p_lambdef(s, allow_conditional=False)
117 #test: or_test ['if' or_test 'else' test] | lambdef
129 return ExprNodes.CondExprNode(pos, test=test, true_val=expr, false_val=other)
133 #test_nocond: or_test | lambdef_nocond
135 def p_test_nocond(s):
137 return p_lambdef_nocond(s)
141 #or_test: and_test ('or' and_test)*
144 return p_rassoc_binop_expr(s, ('or',), p_and_test)
146 def p_rassoc_binop_expr(s, ops, p_subexpr):
152 n2 = p_rassoc_binop_expr(s, ops, p_subexpr)
153 n1 = ExprNodes.binop_node(pos, op, n1, n2)
156 #and_test: not_test ('and' not_test)*
159 #return p_binop_expr(s, ('and',), p_not_test)
160 return p_rassoc_binop_expr(s, ('and',), p_not_test)
162 #not_test: 'not' not_test | comparison
168 return ExprNodes.NotNode(pos, operand = p_not_test(s))
170 return p_comparison(s)
172 #comparison: expr (comp_op expr)*
173 #comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
176 n1 = p_starred_expr(s)
177 if s.sy in comparison_ops:
180 n2 = p_starred_expr(s)
181 n1 = ExprNodes.PrimaryCmpNode(pos,
182 operator = op, operand1 = n1, operand2 = n2)
183 if s.sy in comparison_ops:
184 n1.cascade = p_cascaded_cmp(s)
187 def p_test_or_starred_expr(s):
189 return p_starred_expr(s)
193 def p_starred_expr(s):
202 expr = ExprNodes.StarredTargetNode(pos, expr)
205 def p_cascaded_cmp(s):
208 n2 = p_starred_expr(s)
209 result = ExprNodes.CascadedCmpNode(pos,
210 operator = op, operand2 = n2)
211 if s.sy in comparison_ops:
212 result.cascade = p_cascaded_cmp(s)
235 '<', '>', '==', '>=', '<=', '<>', '!=',
239 #expr: xor_expr ('|' xor_expr)*
242 return p_binop_expr(s, ('|',), p_xor_expr)
244 #xor_expr: and_expr ('^' and_expr)*
247 return p_binop_expr(s, ('^',), p_and_expr)
249 #and_expr: shift_expr ('&' shift_expr)*
252 return p_binop_expr(s, ('&',), p_shift_expr)
254 #shift_expr: arith_expr (('<<'|'>>') arith_expr)*
257 return p_binop_expr(s, ('<<', '>>'), p_arith_expr)
259 #arith_expr: term (('+'|'-') term)*
262 return p_binop_expr(s, ('+', '-'), p_term)
264 #term: factor (('*'|'/'|'%') factor)*
267 return p_binop_expr(s, ('*', '/', '%', '//'), p_factor)
269 #factor: ('+'|'-'|'~'|'&'|typecast|sizeof) factor | power
273 if sy in ('+', '-', '~'):
277 return ExprNodes.unop_node(pos, op, p_factor(s))
282 return ExprNodes.AmpersandNode(pos, operand = arg)
285 elif sy == 'IDENT' and s.systring == "sizeof":
294 base_type = p_c_base_type(s)
295 if base_type.name is None:
296 s.error("Unknown type")
297 declarator = p_c_declarator(s, empty = 1)
304 operand = p_factor(s)
305 return ExprNodes.TypecastNode(pos,
306 base_type = base_type,
307 declarator = declarator,
309 typecheck = typecheck)
312 # s.sy == ident "sizeof"
316 # Here we decide if we are looking at an expression or type
317 # If it is actually a type, but parsable as an expression,
318 # we treat it as an expression here.
319 if looking_at_expr(s):
321 node = ExprNodes.SizeofVarNode(pos, operand = operand)
323 base_type = p_c_base_type(s)
324 declarator = p_c_declarator(s, empty = 1)
325 node = ExprNodes.SizeofTypeNode(pos,
326 base_type = base_type, declarator = declarator)
330 def p_yield_expression(s):
334 if s.sy != ')' and s.sy not in statement_terminators:
338 return ExprNodes.YieldExprNode(pos, arg=arg)
340 def p_yield_statement(s):
342 yield_expr = p_yield_expression(s)
343 return Nodes.ExprStatNode(yield_expr.pos, expr=yield_expr)
345 #power: atom trailer* ('**' factor)*
348 if s.systring == 'new' and s.peek()[0] == 'IDENT':
351 while s.sy in ('(', '[', '.'):
352 n1 = p_trailer(s, n1)
357 n1 = ExprNodes.binop_node(pos, '**', n1, n2)
361 # s.systring == 'new'.
364 cppclass = p_c_base_type(s)
365 return p_call(s, ExprNodes.NewExprNode(pos, cppclass = cppclass))
367 #trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
369 def p_trailer(s, node1):
372 return p_call(s, node1)
374 return p_index(s, node1)
377 name = EncodedString( p_ident(s) )
378 return ExprNodes.AttributeNode(pos,
379 obj = node1, attribute = name)
381 # arglist: argument (',' argument)* [',']
382 # argument: [test '='] test # Really [keyword '='] test
384 def p_call(s, function):
392 while s.sy not in ('**', ')'):
395 s.error("only one star-arg parameter allowed",
404 s.error("Expected an identifier before '='",
406 encoded_name = EncodedString(arg.name)
407 keyword = ExprNodes.IdentifierStringNode(arg.pos, value = encoded_name)
409 keyword_args.append((keyword, arg))
412 s.error("Non-keyword arg following keyword arg",
415 s.error("Non-keyword arg following star-arg",
417 positional_args.append(arg)
423 if len(positional_args) == 1 and not star_arg:
424 positional_args = [ p_genexp(s, positional_args[0]) ]
427 starstar_arg = p_test(s)
431 if not (keyword_args or star_arg or starstar_arg):
432 return ExprNodes.SimpleCallNode(pos,
434 args = positional_args)
438 if positional_args or not star_arg:
439 arg_tuple = ExprNodes.TupleNode(pos,
440 args = positional_args)
442 star_arg_tuple = ExprNodes.AsTupleNode(pos, arg = star_arg)
444 arg_tuple = ExprNodes.binop_node(pos,
445 operator = '+', operand1 = arg_tuple,
446 operand2 = star_arg_tuple)
448 arg_tuple = star_arg_tuple
450 keyword_args = [ExprNodes.DictItemNode(pos=key.pos, key=key, value=value)
451 for key, value in keyword_args]
452 keyword_dict = ExprNodes.DictNode(pos,
453 key_value_pairs = keyword_args)
454 return ExprNodes.GeneralCallNode(pos,
456 positional_args = arg_tuple,
457 keyword_args = keyword_dict,
458 starstar_arg = starstar_arg)
460 #lambdef: 'lambda' [varargslist] ':' test
462 #subscriptlist: subscript (',' subscript)* [',']
464 def p_index(s, base):
468 subscripts = p_subscript_list(s)
469 if len(subscripts) == 1 and len(subscripts[0]) == 2:
470 start, stop = subscripts[0]
471 result = ExprNodes.SliceIndexNode(pos,
472 base = base, start = start, stop = stop)
474 indexes = make_slice_nodes(pos, subscripts)
475 if len(indexes) == 1:
478 index = ExprNodes.TupleNode(pos, args = indexes)
479 result = ExprNodes.IndexNode(pos,
480 base = base, index = index)
484 def p_subscript_list(s):
485 items = [p_subscript(s)]
490 items.append(p_subscript(s))
493 #subscript: '.' '.' '.' | test | [test] ':' [test] [':' [test]]
496 # Parse a subscript and return a list of
497 # 1, 2 or 3 ExprNodes, depending on how
498 # many slice elements were encountered.
502 return [ExprNodes.EllipsisNode(pos)]
504 start = p_slice_element(s, (':',))
508 stop = p_slice_element(s, (':', ',', ']'))
512 step = p_slice_element(s, (':', ',', ']'))
513 return [start, stop, step]
515 def p_slice_element(s, follow_set):
516 # Simple expression which may be missing iff
517 # it is followed by something in follow_set.
518 if s.sy not in follow_set:
523 def expect_ellipsis(s):
528 def make_slice_nodes(pos, subscripts):
529 # Convert a list of subscripts as returned
530 # by p_subscript_list into a list of ExprNodes,
531 # creating SliceNodes for elements with 2 or
534 for subscript in subscripts:
535 if len(subscript) == 1:
536 result.append(subscript[0])
538 result.append(make_slice_node(pos, *subscript))
541 def make_slice_node(pos, start, stop = None, step = None):
543 start = ExprNodes.NoneNode(pos)
545 stop = ExprNodes.NoneNode(pos)
547 step = ExprNodes.NoneNode(pos)
548 return ExprNodes.SliceNode(pos,
549 start = start, stop = stop, step = step)
551 #atom: '(' [yield_expr|testlist_comp] ')' | '[' [listmaker] ']' | '{' [dict_or_set_maker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
559 result = ExprNodes.TupleNode(pos, args = [])
560 elif s.sy == 'yield':
561 result = p_yield_expression(s)
563 result = p_testlist_comp(s)
567 return p_list_maker(s)
569 return p_dict_or_set_maker(s)
571 return p_backquote_expr(s)
577 while value[-1] in "UuLl":
578 if value[-1] in "Ll":
583 return ExprNodes.IntNode(pos,
590 return ExprNodes.FloatNode(pos, value = value)
592 value = s.systring[:-1]
594 return ExprNodes.ImagNode(pos, value = value)
595 elif sy == 'BEGIN_STRING':
596 kind, value = p_cat_string_literal(s)
598 return ExprNodes.CharNode(pos, value = value)
600 return ExprNodes.UnicodeNode(pos, value = value)
602 return ExprNodes.BytesNode(pos, value = value)
604 return ExprNodes.StringNode(pos, value = value)
606 name = EncodedString( s.systring )
609 return ExprNodes.NoneNode(pos)
611 return ExprNodes.BoolNode(pos, value=True)
612 elif name == "False":
613 return ExprNodes.BoolNode(pos, value=False)
615 return ExprNodes.NullNode(pos)
617 return p_name(s, name)
619 s.error("Expected an identifier or literal")
623 if not s.compile_time_expr and name in s.compile_time_env:
624 value = s.compile_time_env.lookup_here(name)
626 if isinstance(value, bool):
627 return ExprNodes.BoolNode(pos, value = value)
628 elif isinstance(value, int):
629 return ExprNodes.IntNode(pos, value = rep)
630 elif isinstance(value, long):
631 return ExprNodes.IntNode(pos, value = rep, longness = "L")
632 elif isinstance(value, float):
633 return ExprNodes.FloatNode(pos, value = rep)
634 elif isinstance(value, _unicode):
635 return ExprNodes.UnicodeNode(pos, value = value)
636 elif isinstance(value, _bytes):
637 return ExprNodes.BytesNode(pos, value = value)
639 error(pos, "Invalid type for compile-time constant: %s"
640 % value.__class__.__name__)
641 return ExprNodes.NameNode(pos, name = name)
643 def p_cat_string_literal(s):
644 # A sequence of one or more adjacent string literals.
645 # Returns (kind, value) where kind in ('b', 'c', 'u', '')
646 kind, value = p_string_literal(s)
647 if s.sy != 'BEGIN_STRING':
651 while s.sy == 'BEGIN_STRING':
653 next_kind, next_value = p_string_literal(s)
655 error(pos, "Cannot concatenate char literal with another string or char literal")
656 elif next_kind != kind:
657 error(pos, "Cannot mix string literals of different types, expected %s'', got %s''" %
660 strings.append(next_value)
662 value = EncodedString( u''.join(strings) )
664 value = BytesLiteral( StringEncoding.join_bytes(strings) )
665 value.encoding = s.source_encoding
668 def p_opt_string_literal(s):
669 if s.sy == 'BEGIN_STRING':
670 return p_string_literal(s)
674 def p_string_literal(s, kind_override=None):
675 # A single string or char literal.
676 # Returns (kind, value) where kind in ('b', 'c', 'u', '')
677 # s.sy == 'BEGIN_STRING'
680 kind = s.systring[:1].lower()
685 is_raw = s.systring[1:2].lower() == 'r'
688 if Future.unicode_literals in s.context.future_directives:
691 if kind_override is not None and kind_override in 'ub':
694 chars = StringEncoding.UnicodeLiteralBuilder()
696 chars = StringEncoding.BytesLiteralBuilder(s.source_encoding)
700 #print "p_string_literal: sy =", sy, repr(s.systring) ###
702 chars.append(s.systring)
708 chars.append(u'\\\n')
709 elif systr == u'\\\"':
711 elif systr == u'\\\'':
718 chars.append_charval( int(systr[1:], 8) )
721 elif c in u"abfnrtv":
723 StringEncoding.char_from_escape_sequence(systr))
727 if kind == 'u' or c == 'x':
728 chrval = int(systr[2:], 16)
729 if chrval > 1114111: # sys.maxunicode:
730 s.error("Invalid unicode escape '%s'" % systr,
733 warning(s.position(),
734 "Unicode characters above 65535 are not "
735 "necessarily portable across Python installations", 1)
736 chars.append_charval(chrval)
738 # unicode escapes in plain byte strings are not unescaped
741 chars.append(u'\\' + systr[1:])
742 elif sy == 'NEWLINE':
744 elif sy == 'END_STRING':
747 s.error("Unclosed string literal", pos = pos)
750 "Unexpected token %r:%r in string literal" %
753 value = chars.getchar()
755 error(pos, u"invalid character literal: %r" % value)
757 value = chars.getstring()
759 #print "p_string_literal: value =", repr(value) ###
762 # list_display ::= "[" [listmaker] "]"
763 # listmaker ::= expression ( comp_for | ( "," expression )* [","] )
764 # comp_iter ::= comp_for | comp_if
765 # comp_for ::= "for" expression_list "in" testlist [comp_iter]
766 # comp_if ::= "if" test [comp_iter]
774 return ExprNodes.ListNode(pos, args = [])
777 target = ExprNodes.ListNode(pos, args = [])
778 append = ExprNodes.ComprehensionAppendNode(
779 pos, expr=expr, target=ExprNodes.CloneNode(target))
780 loop = p_comp_for(s, Nodes.ExprStatNode(append.pos, expr=append))
782 return ExprNodes.ComprehensionNode(
783 pos, loop=loop, append=append, target=target)
787 exprs = p_simple_expr_list(s, expr)
791 return ExprNodes.ListNode(pos, args = exprs)
793 def p_comp_iter(s, body):
795 return p_comp_for(s, body)
797 return p_comp_if(s, body)
799 # insert the 'append' operation into the loop
802 def p_comp_for(s, body):
806 kw = p_for_bounds(s, allow_testlist=False)
807 kw['else_clause'] = None
808 kw['body'] = p_comp_iter(s, body)
809 return Nodes.ForStatNode(pos, **kw)
811 def p_comp_if(s, body):
815 test = p_test_nocond(s)
816 return Nodes.IfStatNode(pos,
817 if_clauses = [Nodes.IfClauseNode(pos, condition = test,
818 body = p_comp_iter(s, body))],
821 #dictmaker: test ':' test (',' test ':' test)* [',']
823 def p_dict_or_set_maker(s):
829 return ExprNodes.DictNode(pos, key_value_pairs = [])
831 if s.sy == ',' or s.sy == '}':
838 values.append( p_test(s) )
840 return ExprNodes.SetNode(pos, args=values)
843 target = ExprNodes.SetNode(pos, args=[])
844 append = ExprNodes.ComprehensionAppendNode(
845 item.pos, expr=item, target=ExprNodes.CloneNode(target))
846 loop = p_comp_for(s, Nodes.ExprStatNode(append.pos, expr=append))
848 return ExprNodes.ComprehensionNode(
849 pos, loop=loop, append=append, target=target)
851 # dict literal or comprehension
857 target = ExprNodes.DictNode(pos, key_value_pairs = [])
858 append = ExprNodes.DictComprehensionAppendNode(
859 item.pos, key_expr=key, value_expr=value,
860 target=ExprNodes.CloneNode(target))
861 loop = p_comp_for(s, Nodes.ExprStatNode(append.pos, expr=append))
863 return ExprNodes.ComprehensionNode(
864 pos, loop=loop, append=append, target=target)
867 items = [ExprNodes.DictItemNode(key.pos, key=key, value=value)]
876 ExprNodes.DictItemNode(key.pos, key=key, value=value))
878 return ExprNodes.DictNode(pos, key_value_pairs=items)
882 return ExprNodes.DictNode(pos, key_value_pairs = [])
884 # NOTE: no longer in Py3 :)
885 def p_backquote_expr(s):
892 args.append(p_test(s))
897 arg = ExprNodes.TupleNode(pos, args = args)
898 return ExprNodes.BackquoteNode(pos, arg = arg)
900 def p_simple_expr_list(s, expr=None):
901 exprs = expr is not None and [expr] or []
902 while s.sy not in expr_terminators:
903 exprs.append( p_test(s) )
909 def p_test_or_starred_expr_list(s, expr=None):
910 exprs = expr is not None and [expr] or []
911 while s.sy not in expr_terminators:
912 exprs.append( p_test_or_starred_expr(s) )
919 #testlist: test (',' test)* [',']
926 exprs = p_simple_expr_list(s, expr)
927 return ExprNodes.TupleNode(pos, args = exprs)
931 # testlist_star_expr: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )
933 def p_testlist_star_expr(s):
935 expr = p_test_or_starred_expr(s)
938 exprs = p_test_or_starred_expr_list(s, expr)
939 return ExprNodes.TupleNode(pos, args = exprs)
943 # testlist_comp: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )
945 def p_testlist_comp(s):
947 expr = p_test_or_starred_expr(s)
950 exprs = p_test_or_starred_expr_list(s, expr)
951 return ExprNodes.TupleNode(pos, args = exprs)
953 return p_genexp(s, expr)
957 def p_genexp(s, expr):
959 loop = p_comp_for(s, ExprNodes.YieldExprNode(expr.pos, arg=expr))
960 return ExprNodes.GeneratorExpressionNode(expr.pos, loop=loop)
962 expr_terminators = (')', ']', '}', ':', '=', 'NEWLINE')
964 #-------------------------------------------------------
968 #-------------------------------------------------------
970 def p_global_statement(s):
971 # assume s.sy == 'global'
974 names = p_ident_list(s)
975 return Nodes.GlobalNode(pos, names = names)
977 def p_expression_or_assignment(s):
978 expr_list = [p_testlist_star_expr(s)]
982 expr = p_yield_expression(s)
984 expr = p_testlist_star_expr(s)
985 expr_list.append(expr)
986 if len(expr_list) == 1:
987 if re.match(r"([+*/\%^\&|-]|<<|>>|\*\*|//)=", s.sy):
989 if not isinstance(lhs, (ExprNodes.AttributeNode, ExprNodes.IndexNode, ExprNodes.NameNode) ):
990 error(lhs.pos, "Illegal operand for inplace operation.")
994 rhs = p_yield_expression(s)
997 return Nodes.InPlaceAssignmentNode(lhs.pos, operator = operator, lhs = lhs, rhs = rhs)
999 if isinstance(expr, (ExprNodes.UnicodeNode, ExprNodes.StringNode, ExprNodes.BytesNode)):
1000 return Nodes.PassStatNode(expr.pos)
1002 return Nodes.ExprStatNode(expr.pos, expr = expr)
1005 if len(expr_list) == 2:
1006 return Nodes.SingleAssignmentNode(rhs.pos,
1007 lhs = expr_list[0], rhs = rhs)
1009 return Nodes.CascadedAssignmentNode(rhs.pos,
1010 lhs_list = expr_list[:-1], rhs = rhs)
1012 def p_print_statement(s):
1022 ends_with_comma = s.sy in ('NEWLINE', 'EOF')
1026 if s.sy not in ('NEWLINE', 'EOF'):
1027 args.append(p_test(s))
1030 if s.sy in ('NEWLINE', 'EOF'):
1033 args.append(p_test(s))
1034 arg_tuple = ExprNodes.TupleNode(pos, args = args)
1035 return Nodes.PrintStatNode(pos,
1036 arg_tuple = arg_tuple, stream = stream,
1037 append_newline = not ends_with_comma)
1039 def p_exec_statement(s):
1043 args = [ p_bit_expr(s) ]
1046 args.append(p_test(s))
1049 args.append(p_test(s))
1051 error(pos, "'exec' currently requires a target mapping (globals/locals)")
1052 return Nodes.ExecStatNode(pos, args = args)
1054 def p_del_statement(s):
1058 # FIXME: 'exprlist' in Python
1059 args = p_simple_expr_list(s)
1060 return Nodes.DelStatNode(pos, args = args)
1062 def p_pass_statement(s, with_newline = 0):
1066 s.expect_newline("Expected a newline")
1067 return Nodes.PassStatNode(pos)
1069 def p_break_statement(s):
1073 return Nodes.BreakStatNode(pos)
1075 def p_continue_statement(s):
1076 # s.sy == 'continue'
1079 return Nodes.ContinueStatNode(pos)
1081 def p_return_statement(s):
1085 if s.sy not in statement_terminators:
1086 value = p_testlist(s)
1089 return Nodes.ReturnStatNode(pos, value = value)
1091 def p_raise_statement(s):
1098 if s.sy not in statement_terminators:
1099 exc_type = p_test(s)
1102 exc_value = p_test(s)
1106 if exc_type or exc_value or exc_tb:
1107 return Nodes.RaiseStatNode(pos,
1108 exc_type = exc_type,
1109 exc_value = exc_value,
1112 return Nodes.ReraiseStatNode(pos)
1114 def p_import_statement(s):
1115 # s.sy in ('import', 'cimport')
1119 items = [p_dotted_name(s, as_allowed = 1)]
1122 items.append(p_dotted_name(s, as_allowed = 1))
1124 for pos, target_name, dotted_name, as_name in items:
1125 dotted_name = EncodedString(dotted_name)
1126 if kind == 'cimport':
1127 stat = Nodes.CImportStatNode(pos,
1128 module_name = dotted_name,
1131 if as_name and "." in dotted_name:
1132 name_list = ExprNodes.ListNode(pos, args = [
1133 ExprNodes.IdentifierStringNode(pos, value = EncodedString("*"))])
1136 stat = Nodes.SingleAssignmentNode(pos,
1137 lhs = ExprNodes.NameNode(pos,
1138 name = as_name or target_name),
1139 rhs = ExprNodes.ImportNode(pos,
1140 module_name = ExprNodes.IdentifierStringNode(
1141 pos, value = dotted_name),
1142 name_list = name_list))
1144 return Nodes.StatListNode(pos, stats = stats)
1146 def p_from_import_statement(s, first_statement = 0):
1150 (dotted_name_pos, _, dotted_name, _) = \
1151 p_dotted_name(s, as_allowed = 0)
1152 if s.sy in ('import', 'cimport'):
1156 s.error("Expected 'import' or 'cimport'")
1157 is_cimport = kind == 'cimport'
1158 is_parenthesized = False
1160 imported_names = [(s.position(), "*", None, None)]
1164 is_parenthesized = True
1166 imported_names = [p_imported_name(s, is_cimport)]
1169 if is_parenthesized and s.sy == ')':
1171 imported_names.append(p_imported_name(s, is_cimport))
1172 if is_parenthesized:
1174 dotted_name = EncodedString(dotted_name)
1175 if dotted_name == '__future__':
1176 if not first_statement:
1177 s.error("from __future__ imports must occur at the beginning of the file")
1179 for (name_pos, name, as_name, kind) in imported_names:
1180 if name == "braces":
1181 s.error("not a chance", name_pos)
1184 directive = getattr(Future, name)
1185 except AttributeError:
1186 s.error("future feature %s is not defined" % name, name_pos)
1188 s.context.future_directives.add(directive)
1189 return Nodes.PassStatNode(pos)
1190 elif kind == 'cimport':
1191 return Nodes.FromCImportStatNode(pos,
1192 module_name = dotted_name,
1193 imported_names = imported_names)
1195 imported_name_strings = []
1197 for (name_pos, name, as_name, kind) in imported_names:
1198 encoded_name = EncodedString(name)
1199 imported_name_strings.append(
1200 ExprNodes.IdentifierStringNode(name_pos, value = encoded_name))
1203 ExprNodes.NameNode(name_pos,
1204 name = as_name or name)))
1205 import_list = ExprNodes.ListNode(
1206 imported_names[0][0], args = imported_name_strings)
1207 dotted_name = EncodedString(dotted_name)
1208 return Nodes.FromImportStatNode(pos,
1209 module = ExprNodes.ImportNode(dotted_name_pos,
1210 module_name = ExprNodes.IdentifierStringNode(pos, value = dotted_name),
1211 name_list = import_list),
1214 imported_name_kinds = ('class', 'struct', 'union')
1216 def p_imported_name(s, is_cimport):
1219 if is_cimport and s.systring in imported_name_kinds:
1223 as_name = p_as_name(s)
1224 return (pos, name, as_name, kind)
1226 def p_dotted_name(s, as_allowed):
1228 target_name = p_ident(s)
1230 names = [target_name]
1233 names.append(p_ident(s))
1235 as_name = p_as_name(s)
1236 return (pos, target_name, u'.'.join(names), as_name)
1239 if s.sy == 'IDENT' and s.systring == 'as':
1245 def p_assert_statement(s):
1255 return Nodes.AssertStatNode(pos, cond = cond, value = value)
1257 statement_terminators = (';', 'NEWLINE', 'EOF')
1259 def p_if_statement(s):
1263 if_clauses = [p_if_clause(s)]
1264 while s.sy == 'elif':
1266 if_clauses.append(p_if_clause(s))
1267 else_clause = p_else_clause(s)
1268 return Nodes.IfStatNode(pos,
1269 if_clauses = if_clauses, else_clause = else_clause)
1275 return Nodes.IfClauseNode(pos,
1276 condition = test, body = body)
1278 def p_else_clause(s):
1285 def p_while_statement(s):
1291 else_clause = p_else_clause(s)
1292 return Nodes.WhileStatNode(pos,
1293 condition = test, body = body,
1294 else_clause = else_clause)
1296 def p_for_statement(s):
1300 kw = p_for_bounds(s, allow_testlist=True)
1301 kw['body'] = p_suite(s)
1302 kw['else_clause'] = p_else_clause(s)
1303 return Nodes.ForStatNode(pos, **kw)
1305 def p_for_bounds(s, allow_testlist=True):
1306 target = p_for_target(s)
1309 iterator = p_for_iterator(s, allow_testlist)
1310 return { 'target': target, 'iterator': iterator }
1311 elif not s.in_python_file:
1314 bound1 = p_bit_expr(s)
1316 # Support shorter "for a <= x < b" syntax
1317 bound1, target = target, None
1318 rel1 = p_for_from_relation(s)
1319 name2_pos = s.position()
1321 rel2_pos = s.position()
1322 rel2 = p_for_from_relation(s)
1323 bound2 = p_bit_expr(s)
1324 step = p_for_from_step(s)
1326 target = ExprNodes.NameNode(name2_pos, name = name2)
1328 if not target.is_name:
1330 "Target of for-from statement must be a variable name")
1331 elif name2 != target.name:
1333 "Variable name in for-from range does not match target")
1334 if rel1[0] != rel2[0]:
1336 "Relation directions in for-from do not match")
1337 return {'target': target,
1347 def p_for_from_relation(s):
1348 if s.sy in inequality_relations:
1353 s.error("Expected one of '<', '<=', '>' '>='")
1355 def p_for_from_step(s):
1358 step = p_bit_expr(s)
1363 inequality_relations = ('<', '<=', '>', '>=')
1365 def p_target(s, terminator):
1367 expr = p_starred_expr(s)
1371 while s.sy != terminator:
1372 exprs.append(p_starred_expr(s))
1376 return ExprNodes.TupleNode(pos, args = exprs)
1380 def p_for_target(s):
1381 return p_target(s, 'in')
1383 def p_for_iterator(s, allow_testlist=True):
1386 expr = p_testlist(s)
1389 return ExprNodes.IteratorNode(pos, sequence = expr)
1391 def p_try_statement(s):
1398 if s.sy in ('except', 'else'):
1399 while s.sy == 'except':
1400 except_clauses.append(p_except_clause(s))
1403 else_clause = p_suite(s)
1404 body = Nodes.TryExceptStatNode(pos,
1405 body = body, except_clauses = except_clauses,
1406 else_clause = else_clause)
1407 if s.sy != 'finally':
1409 # try-except-finally is equivalent to nested try-except/try-finally
1410 if s.sy == 'finally':
1412 finally_clause = p_suite(s)
1413 return Nodes.TryFinallyStatNode(pos,
1414 body = body, finally_clause = finally_clause)
1416 s.error("Expected 'except' or 'finally'")
1418 def p_except_clause(s):
1425 exc_type = p_test(s)
1426 if s.sy == ',' or (s.sy == 'IDENT' and s.systring == 'as'):
1428 exc_value = p_test(s)
1429 elif s.sy == 'IDENT' and s.systring == 'as':
1430 # Py3 syntax requires a name here
1434 exc_value = ExprNodes.NameNode(pos2, name = name)
1436 return Nodes.ExceptClauseNode(pos,
1437 pattern = exc_type, target = exc_value, body = body)
1439 def p_include_statement(s, ctx):
1441 s.next() # 'include'
1442 _, include_file_name = p_string_literal(s)
1443 s.expect_newline("Syntax error in include statement")
1444 if s.compile_time_eval:
1445 include_file_name = include_file_name.decode(s.source_encoding)
1446 include_file_path = s.context.find_include_file(include_file_name, pos)
1447 if include_file_path:
1448 s.included_files.append(include_file_name)
1449 f = Utils.open_source_file(include_file_path, mode="rU")
1450 source_desc = FileSourceDescriptor(include_file_path)
1451 s2 = PyrexScanner(f, source_desc, s, source_encoding=f.encoding, parse_comments=s.parse_comments)
1453 tree = p_statement_list(s2, ctx)
1460 return Nodes.PassStatNode(pos)
1462 def p_with_statement(s):
1465 # if s.sy == 'IDENT' and s.systring in ('gil', 'nogil'):
1466 if s.sy == 'IDENT' and s.systring == 'nogil':
1470 return Nodes.GILStatNode(pos, state = state, body = body)
1471 elif s.systring == 'template':
1476 templates.append(s.systring)
1478 while s.systring == ',':
1480 templates.append(s.systring)
1485 s.expect_newline("Syntax error in template function declaration")
1488 body_ctx.templates = templates
1489 func_or_var = p_c_func_or_var_declaration(s, pos, body_ctx)
1493 error(pos, "Syntax error in template function declaration")
1497 if s.sy == 'IDENT' and s.systring == 'as':
1499 allow_multi = (s.sy == '(')
1500 target = p_target(s, ':')
1501 if not allow_multi and isinstance(target, ExprNodes.TupleNode):
1502 s.error("Multiple with statement target values not allowed without paranthesis")
1504 return Nodes.WithStatNode(pos, manager = manager,
1505 target = target, body = body)
1507 def p_simple_statement(s, first_statement = 0):
1508 #print "p_simple_statement:", s.sy, s.systring ###
1509 if s.sy == 'global':
1510 node = p_global_statement(s)
1511 elif s.sy == 'print':
1512 node = p_print_statement(s)
1513 elif s.sy == 'exec':
1514 node = p_exec_statement(s)
1516 node = p_del_statement(s)
1517 elif s.sy == 'break':
1518 node = p_break_statement(s)
1519 elif s.sy == 'continue':
1520 node = p_continue_statement(s)
1521 elif s.sy == 'return':
1522 node = p_return_statement(s)
1523 elif s.sy == 'raise':
1524 node = p_raise_statement(s)
1525 elif s.sy in ('import', 'cimport'):
1526 node = p_import_statement(s)
1527 elif s.sy == 'from':
1528 node = p_from_import_statement(s, first_statement = first_statement)
1529 elif s.sy == 'yield':
1530 node = p_yield_statement(s)
1531 elif s.sy == 'assert':
1532 node = p_assert_statement(s)
1533 elif s.sy == 'pass':
1534 node = p_pass_statement(s)
1536 node = p_expression_or_assignment(s)
1539 def p_simple_statement_list(s, ctx, first_statement = 0):
1540 # Parse a series of simple statements on one line
1541 # separated by semicolons.
1542 stat = p_simple_statement(s, first_statement = first_statement)
1546 #print "p_simple_statement_list: maybe more to follow" ###
1548 if s.sy in ('NEWLINE', 'EOF'):
1550 stats.append(p_simple_statement(s))
1551 stat = Nodes.StatListNode(stats[0].pos, stats = stats)
1552 s.expect_newline("Syntax error in simple statement list")
1555 def p_compile_time_expr(s):
1556 old = s.compile_time_expr
1557 s.compile_time_expr = 1
1558 expr = p_testlist(s)
1559 s.compile_time_expr = old
1562 def p_DEF_statement(s):
1564 denv = s.compile_time_env
1568 expr = p_compile_time_expr(s)
1569 value = expr.compile_time_value(denv)
1570 #print "p_DEF_statement: %s = %r" % (name, value) ###
1571 denv.declare(name, value)
1573 return Nodes.PassStatNode(pos)
1575 def p_IF_statement(s, ctx):
1577 saved_eval = s.compile_time_eval
1578 current_eval = saved_eval
1579 denv = s.compile_time_env
1582 s.next() # 'IF' or 'ELIF'
1583 expr = p_compile_time_expr(s)
1584 s.compile_time_eval = current_eval and bool(expr.compile_time_value(denv))
1585 body = p_suite(s, ctx)
1586 if s.compile_time_eval:
1593 s.compile_time_eval = current_eval
1594 body = p_suite(s, ctx)
1598 result = Nodes.PassStatNode(pos)
1599 s.compile_time_eval = saved_eval
1602 def p_statement(s, ctx, first_statement = 0):
1603 cdef_flag = ctx.cdef_flag
1605 if s.sy == 'ctypedef':
1606 if ctx.level not in ('module', 'module_pxd'):
1607 s.error("ctypedef statement not allowed here")
1609 # error(s.position(), "'api' not allowed with 'ctypedef'")
1610 return p_ctypedef_statement(s, ctx)
1612 return p_DEF_statement(s)
1614 return p_IF_statement(s, ctx)
1615 elif s.sy == 'DECORATOR':
1616 if ctx.level not in ('module', 'class', 'c_class', 'function', 'property', 'module_pxd', 'c_class_pxd'):
1618 s.error('decorator not allowed here')
1620 decorators = p_decorators(s)
1621 if s.sy not in ('def', 'cdef', 'cpdef', 'class'):
1622 s.error("Decorators can only be followed by functions or classes")
1623 elif s.sy == 'pass' and cdef_flag:
1625 return p_pass_statement(s, with_newline = 1)
1631 elif s.sy == 'cpdef':
1636 if ctx.level not in ('module', 'module_pxd', 'function', 'c_class', 'c_class_pxd'):
1637 s.error('cdef statement not allowed here')
1639 node = p_cdef_statement(s, ctx(overridable = overridable))
1640 if decorators is not None:
1641 if not isinstance(node, (Nodes.CFuncDefNode, Nodes.CVarDefNode)):
1642 s.error("Decorators can only be followed by functions or Python classes")
1643 node.decorators = decorators
1647 s.error("'api' not allowed with this statement")
1649 # def statements aren't allowed in pxd files, except
1650 # as part of a cdef class
1651 if ('pxd' in ctx.level) and (ctx.level != 'c_class_pxd'):
1652 s.error('def statement not allowed here')
1654 return p_def_statement(s, decorators)
1655 elif s.sy == 'class':
1656 if ctx.level != 'module':
1657 s.error("class definition not allowed here")
1658 return p_class_statement(s, decorators)
1659 elif s.sy == 'include':
1660 if ctx.level not in ('module', 'module_pxd'):
1661 s.error("include statement not allowed here")
1662 return p_include_statement(s, ctx)
1663 elif ctx.level == 'c_class' and s.sy == 'IDENT' and s.systring == 'property':
1664 return p_property_decl(s)
1665 elif s.sy == 'pass' and ctx.level != 'property':
1666 return p_pass_statement(s, with_newline = 1)
1668 if ctx.level in ('c_class_pxd', 'property'):
1669 s.error("Executable statement not allowed here")
1671 return p_if_statement(s)
1672 elif s.sy == 'while':
1673 return p_while_statement(s)
1675 return p_for_statement(s)
1677 return p_try_statement(s)
1678 elif s.sy == 'with':
1679 return p_with_statement(s)
1681 return p_simple_statement_list(
1682 s, ctx, first_statement = first_statement)
1684 def p_statement_list(s, ctx, first_statement = 0):
1685 # Parse a series of statements separated by newlines.
1688 while s.sy not in ('DEDENT', 'EOF'):
1689 stats.append(p_statement(s, ctx, first_statement = first_statement))
1694 return Nodes.StatListNode(pos, stats = stats)
1696 def p_suite(s, ctx = Ctx(), with_doc = 0, with_pseudo_doc = 0):
1701 if s.sy == 'NEWLINE':
1704 if with_doc or with_pseudo_doc:
1705 doc = p_doc_string(s)
1706 body = p_statement_list(s, ctx)
1710 s.error("'api' not allowed with this statement")
1711 if ctx.level in ('module', 'class', 'function', 'other'):
1712 body = p_simple_statement_list(s, ctx)
1714 body = p_pass_statement(s)
1715 s.expect_newline("Syntax error in declarations")
1721 def p_positional_and_keyword_args(s, end_sy_set, templates = None):
1723 Parses positional and keyword arguments. end_sy_set
1724 should contain any s.sy that terminate the argument list.
1725 Argument expansion (* and **) are not allowed.
1727 Returns: (positional_args, keyword_args)
1729 positional_args = []
1733 while s.sy not in end_sy_set:
1734 if s.sy == '*' or s.sy == '**':
1735 s.error('Argument expansion not allowed here.')
1738 if s.sy == 'IDENT' and s.peek()[0] == '=':
1740 s.next() # s.sy is '='
1742 if looking_at_expr(s):
1745 base_type = p_c_base_type(s, templates = templates)
1746 declarator = p_c_declarator(s, empty = 1)
1747 arg = Nodes.CComplexBaseTypeNode(base_type.pos,
1748 base_type = base_type, declarator = declarator)
1750 keyword_node = ExprNodes.IdentifierStringNode(
1751 arg.pos, value = EncodedString(ident))
1752 keyword_args.append((keyword_node, arg))
1756 if looking_at_expr(s):
1759 base_type = p_c_base_type(s, templates = templates)
1760 declarator = p_c_declarator(s, empty = 1)
1761 arg = Nodes.CComplexBaseTypeNode(base_type.pos,
1762 base_type = base_type, declarator = declarator)
1764 positional_args.append(arg)
1766 if len(keyword_args) > 0:
1767 s.error("Non-keyword arg following keyword arg",
1771 if s.sy not in end_sy_set:
1773 s.error("Unmatched %s" % " or ".join(end_sy_set))
1776 return positional_args, keyword_args
1778 def p_c_base_type(s, self_flag = 0, nonempty = 0, templates = None):
1779 # If self_flag is true, this is the base type for the
1780 # self argument of a C method of an extension type.
1782 return p_c_complex_base_type(s)
1784 return p_c_simple_base_type(s, self_flag, nonempty = nonempty, templates = templates)
1786 def p_calling_convention(s):
1787 if s.sy == 'IDENT' and s.systring in calling_convention_words:
1794 calling_convention_words = ("__stdcall", "__cdecl", "__fastcall")
1796 def p_c_complex_base_type(s):
1800 base_type = p_c_base_type(s)
1801 declarator = p_c_declarator(s, empty = 1)
1803 return Nodes.CComplexBaseTypeNode(pos,
1804 base_type = base_type, declarator = declarator)
1806 def p_c_simple_base_type(s, self_flag, nonempty, templates = None):
1807 #print "p_c_simple_base_type: self_flag =", self_flag, nonempty
1814 if not s.sy == 'IDENT':
1815 error(pos, "Expected an identifier, found '%s'" % s.sy)
1816 if looking_at_base_type(s):
1817 #print "p_c_simple_base_type: looking_at_base_type at", s.position()
1819 if s.sy == 'IDENT' and s.systring in special_basic_c_types:
1820 signed, longness = special_basic_c_types[s.systring]
1824 signed, longness = p_sign_and_longness(s)
1825 if s.sy == 'IDENT' and s.systring in basic_c_type_names:
1830 if s.sy == 'IDENT' and s.systring == 'complex':
1833 elif looking_at_dotted_name(s):
1834 #print "p_c_simple_base_type: looking_at_type_name at", s.position()
1838 module_path.append(name)
1844 if nonempty and s.sy != 'IDENT':
1845 # Make sure this is not a declaration of a variable or function.
1848 if s.sy == '*' or s.sy == '**' or s.sy == '&':
1849 s.put_back('(', '(')
1851 s.put_back('(', '(')
1852 s.put_back('IDENT', name)
1854 elif s.sy not in ('*', '**', '[', '&'):
1855 s.put_back('IDENT', name)
1858 type_node = Nodes.CSimpleBaseTypeNode(pos,
1859 name = name, module_path = module_path,
1860 is_basic_c_type = is_basic, signed = signed,
1861 complex = complex, longness = longness,
1862 is_self_arg = self_flag, templates = templates)
1865 type_node = p_buffer_or_template(s, type_node, templates)
1870 type_node = Nodes.CNestedBaseTypeNode(pos, base_type = type_node, name = name)
1874 def p_buffer_or_template(s, base_type_node, templates):
1878 # Note that buffer_positional_options_count=1, so the only positional argument is dtype.
1879 # For templated types, all parameters are types.
1880 positional_args, keyword_args = (
1881 p_positional_and_keyword_args(s, (']',), templates)
1885 keyword_dict = ExprNodes.DictNode(pos,
1887 ExprNodes.DictItemNode(pos=key.pos, key=key, value=value)
1888 for key, value in keyword_args
1890 result = Nodes.TemplatedTypeNode(pos,
1891 positional_args = positional_args,
1892 keyword_args = keyword_dict,
1893 base_type_node = base_type_node)
1897 def looking_at_name(s):
1898 return s.sy == 'IDENT' and not s.systring in calling_convention_words
1900 def looking_at_expr(s):
1901 if s.systring in base_type_start_words:
1903 elif s.sy == 'IDENT':
1910 dotted_path.append(s.systring)
1912 saved = s.sy, s.systring
1915 elif s.sy == '*' or s.sy == '**':
1917 is_type = s.sy == ')'
1921 is_type = s.sy == '*'
1925 is_type = s.sy == ']'
1927 dotted_path.reverse()
1928 for p in dotted_path:
1929 s.put_back('IDENT', p)
1930 s.put_back('.', '.')
1931 s.put_back('IDENT', name)
1936 def looking_at_base_type(s):
1937 #print "looking_at_base_type?", s.sy, s.systring, s.position()
1938 return s.sy == 'IDENT' and s.systring in base_type_start_words
1940 def looking_at_dotted_name(s):
1944 result = s.sy == '.'
1945 s.put_back('IDENT', name)
1950 basic_c_type_names = ("void", "char", "int", "float", "double", "bint")
1952 special_basic_c_types = {
1953 # name : (signed, longness)
1954 "Py_UNICODE" : (0, 0),
1955 "Py_ssize_t" : (2, 0),
1960 sign_and_longness_words = ("short", "long", "signed", "unsigned")
1962 base_type_start_words = \
1963 basic_c_type_names + sign_and_longness_words + tuple(special_basic_c_types)
1965 def p_sign_and_longness(s):
1968 while s.sy == 'IDENT' and s.systring in sign_and_longness_words:
1969 if s.systring == 'unsigned':
1971 elif s.systring == 'signed':
1973 elif s.systring == 'short':
1975 elif s.systring == 'long':
1978 return signed, longness
1981 literal = p_opt_string_literal(s)
1984 cname = EncodedString(cname)
1985 cname.encoding = s.source_encoding
1990 def p_c_declarator(s, ctx = Ctx(), empty = 0, is_type = 0, cmethod_flag = 0,
1991 assignable = 0, nonempty = 0,
1992 calling_convention_allowed = 0):
1993 # If empty is true, the declarator must be empty. If nonempty is true,
1994 # the declarator must be nonempty. Otherwise we don't care.
1995 # If cmethod_flag is true, then if this declarator declares
1996 # a function, it's a C method of an extension type.
2000 if s.sy == ')' or looking_at_name(s):
2001 base = Nodes.CNameDeclaratorNode(pos, name = EncodedString(u""), cname = None)
2002 result = p_c_func_declarator(s, pos, ctx, base, cmethod_flag)
2004 result = p_c_declarator(s, ctx, empty = empty, is_type = is_type,
2005 cmethod_flag = cmethod_flag,
2006 nonempty = nonempty,
2007 calling_convention_allowed = 1)
2010 result = p_c_simple_declarator(s, ctx, empty, is_type, cmethod_flag,
2011 assignable, nonempty)
2012 if not calling_convention_allowed and result.calling_convention and s.sy != '(':
2013 error(s.position(), "%s on something that is not a function"
2014 % result.calling_convention)
2015 while s.sy in ('[', '('):
2018 result = p_c_array_declarator(s, result)
2021 result = p_c_func_declarator(s, pos, ctx, result, cmethod_flag)
2025 def p_c_array_declarator(s, base):
2033 return Nodes.CArrayDeclaratorNode(pos, base = base, dimension = dim)
2035 def p_c_func_declarator(s, pos, ctx, base, cmethod_flag):
2036 # Opening paren has already been skipped
2037 args = p_c_arg_list(s, ctx, cmethod_flag = cmethod_flag,
2038 nonempty_declarators = 0)
2039 ellipsis = p_optional_ellipsis(s)
2042 exc_val, exc_check = p_exception_value_clause(s)
2043 with_gil = p_with_gil(s)
2044 return Nodes.CFuncDeclaratorNode(pos,
2045 base = base, args = args, has_varargs = ellipsis,
2046 exception_value = exc_val, exception_check = exc_check,
2047 nogil = nogil or ctx.nogil or with_gil, with_gil = with_gil)
2049 supported_overloaded_operators = cython.set([
2050 '+', '-', '*', '/', '%',
2051 '++', '--', '~', '|', '&', '^', '<<', '>>',
2052 '==', '!=', '>=', '>', '<=', '<',
2056 def p_c_simple_declarator(s, ctx, empty, is_type, cmethod_flag,
2057 assignable, nonempty):
2059 calling_convention = p_calling_convention(s)
2062 base = p_c_declarator(s, ctx, empty = empty, is_type = is_type,
2063 cmethod_flag = cmethod_flag,
2064 assignable = assignable, nonempty = nonempty)
2065 result = Nodes.CPtrDeclaratorNode(pos,
2067 elif s.sy == '**': # scanner returns this as a single token
2069 base = p_c_declarator(s, ctx, empty = empty, is_type = is_type,
2070 cmethod_flag = cmethod_flag,
2071 assignable = assignable, nonempty = nonempty)
2072 result = Nodes.CPtrDeclaratorNode(pos,
2073 base = Nodes.CPtrDeclaratorNode(pos,
2077 base = p_c_declarator(s, ctx, empty = empty, is_type = is_type,
2078 cmethod_flag = cmethod_flag,
2079 assignable = assignable, nonempty = nonempty)
2080 result = Nodes.CReferenceDeclaratorNode(pos, base = base)
2084 name = EncodedString(s.systring)
2086 error(s.position(), "Declarator should be empty")
2088 cname = p_opt_cname(s)
2089 if name != "operator" and s.sy == '=' and assignable:
2094 error(s.position(), "Empty declarator")
2097 if cname is None and ctx.namespace is not None:
2098 cname = ctx.namespace + "::" + name
2099 if name == 'operator' and ctx.visibility == 'extern':
2102 # Handle diphthong operators.
2109 if op in ['-', '+', '|', '&'] and s.sy == op:
2115 if op not in supported_overloaded_operators:
2116 s.error("Overloading operator '%s' not yet supported." % op)
2118 result = Nodes.CNameDeclaratorNode(pos,
2119 name = name, cname = cname, default = rhs)
2120 result.calling_convention = calling_convention
2124 if s.sy == 'IDENT' and s.systring == 'nogil':
2133 s.expect_keyword('gil')
2138 def p_exception_value_clause(s):
2141 if s.sy == 'except':
2152 exc_val = p_name(s, name)
2158 return exc_val, exc_check
2160 c_arg_list_terminators = ('*', '**', '.', ')')
2162 def p_c_arg_list(s, ctx = Ctx(), in_pyfunc = 0, cmethod_flag = 0,
2163 nonempty_declarators = 0, kw_only = 0, annotated = 1):
2164 # Comma-separated list of C argument declarations, possibly empty.
2165 # May have a trailing comma.
2167 is_self_arg = cmethod_flag
2168 while s.sy not in c_arg_list_terminators:
2169 args.append(p_c_arg_decl(s, ctx, in_pyfunc, is_self_arg,
2170 nonempty = nonempty_declarators, kw_only = kw_only,
2171 annotated = annotated))
2178 def p_optional_ellipsis(s):
2185 def p_c_arg_decl(s, ctx, in_pyfunc, cmethod_flag = 0, nonempty = 0,
2186 kw_only = 0, annotated = 1):
2188 not_none = or_none = 0
2191 if s.in_python_file:
2192 # empty type declaration
2193 base_type = Nodes.CSimpleBaseTypeNode(pos,
2194 name = None, module_path = [],
2195 is_basic_c_type = 0, signed = 0,
2196 complex = 0, longness = 0,
2197 is_self_arg = cmethod_flag, templates = None)
2199 base_type = p_c_base_type(s, cmethod_flag, nonempty = nonempty)
2200 declarator = p_c_declarator(s, ctx, nonempty = nonempty)
2201 if s.sy in ('not', 'or') and not s.in_python_file:
2204 if s.sy == 'IDENT' and s.systring == 'None':
2207 s.error("Expected 'None'")
2209 error(pos, "'%s None' only allowed in Python functions" % kind)
2210 or_none = kind == 'or'
2211 not_none = kind == 'not'
2212 if annotated and s.sy == ':':
2214 annotation = p_test(s)
2217 if 'pxd' in s.level:
2218 if s.sy not in ['*', '?']:
2219 error(pos, "default values cannot be specified in pxd files, use ? or *")
2220 default = ExprNodes.BoolNode(1)
2224 return Nodes.CArgDeclNode(pos,
2225 base_type = base_type,
2226 declarator = declarator,
2227 not_none = not_none,
2230 annotation = annotation,
2234 if s.sy == 'IDENT' and s.systring == 'api':
2240 def p_cdef_statement(s, ctx):
2242 ctx.visibility = p_visibility(s, ctx.visibility)
2243 ctx.api = ctx.api or p_api(s)
2245 if ctx.visibility not in ('private', 'public'):
2246 error(pos, "Cannot combine 'api' with '%s'" % ctx.visibility)
2247 if (ctx.visibility == 'extern') and s.sy == 'from':
2248 return p_cdef_extern_block(s, pos, ctx)
2249 elif s.sy == 'import':
2251 return p_cdef_extern_block(s, pos, ctx)
2255 error(pos, "cdef blocks cannot be declared cpdef")
2256 return p_cdef_block(s, ctx)
2259 error(pos, "cdef blocks cannot be declared cpdef")
2260 return p_cdef_block(s, ctx)
2261 elif s.sy == 'class':
2262 if ctx.level not in ('module', 'module_pxd'):
2263 error(pos, "Extension type definition not allowed here")
2265 error(pos, "Extension types cannot be declared cpdef")
2266 return p_c_class_definition(s, pos, ctx)
2267 elif s.sy == 'IDENT' and s.systring == 'cppclass':
2268 if ctx.visibility != 'extern':
2269 error(pos, "C++ classes need to be declared extern")
2270 return p_cpp_class_definition(s, pos, ctx)
2271 elif s.sy == 'IDENT' and s.systring in ("struct", "union", "enum", "packed"):
2272 if ctx.level not in ('module', 'module_pxd'):
2273 error(pos, "C struct/union/enum definition not allowed here")
2275 error(pos, "C struct/union/enum cannot be declared cpdef")
2276 if s.systring == "enum":
2277 return p_c_enum_definition(s, pos, ctx)
2279 return p_c_struct_or_union_definition(s, pos, ctx)
2281 return p_c_func_or_var_declaration(s, pos, ctx)
2283 def p_cdef_block(s, ctx):
2284 return p_suite(s, ctx(cdef_flag = 1))
2286 def p_cdef_extern_block(s, pos, ctx):
2288 error(pos, "cdef extern blocks cannot be declared cpdef")
2294 _, include_file = p_string_literal(s)
2295 ctx = ctx(cdef_flag = 1, visibility = 'extern')
2296 if s.systring == "namespace":
2298 ctx.namespace = p_string_literal(s, kind_override='u')[1]
2301 body = p_suite(s, ctx)
2302 return Nodes.CDefExternNode(pos,
2303 include_file = include_file,
2305 namespace = ctx.namespace)
2307 def p_c_enum_definition(s, pos, ctx):
2308 # s.sy == ident 'enum'
2313 cname = p_opt_cname(s)
2314 if cname is None and ctx.namespace is not None:
2315 cname = ctx.namespace + "::" + name
2322 if s.sy != 'NEWLINE':
2323 p_c_enum_line(s, items)
2325 s.next() # 'NEWLINE'
2327 while s.sy not in ('DEDENT', 'EOF'):
2328 p_c_enum_line(s, items)
2330 return Nodes.CEnumDefNode(
2331 pos, name = name, cname = cname, items = items,
2332 typedef_flag = ctx.typedef_flag, visibility = ctx.visibility,
2333 in_pxd = ctx.level == 'module_pxd')
2335 def p_c_enum_line(s, items):
2337 p_c_enum_item(s, items)
2340 if s.sy in ('NEWLINE', 'EOF'):
2342 p_c_enum_item(s, items)
2345 s.expect_newline("Syntax error in enum item list")
2347 def p_c_enum_item(s, items):
2350 cname = p_opt_cname(s)
2355 items.append(Nodes.CEnumDefItemNode(pos,
2356 name = name, cname = cname, value = value))
2358 def p_c_struct_or_union_definition(s, pos, ctx):
2360 if s.systring == 'packed':
2363 if s.sy != 'IDENT' or s.systring != 'struct':
2364 s.expected('struct')
2365 # s.sy == ident 'struct' or 'union'
2369 cname = p_opt_cname(s)
2370 if cname is None and ctx.namespace is not None:
2371 cname = ctx.namespace + "::" + name
2379 while s.sy != 'DEDENT':
2382 p_c_func_or_var_declaration(s, s.position(), body_ctx))
2385 s.expect_newline("Expected a newline")
2388 s.expect_newline("Syntax error in struct or union definition")
2389 return Nodes.CStructOrUnionDefNode(pos,
2390 name = name, cname = cname, kind = kind, attributes = attributes,
2391 typedef_flag = ctx.typedef_flag, visibility = ctx.visibility,
2392 in_pxd = ctx.level == 'module_pxd', packed = packed)
2394 def p_visibility(s, prev_visibility):
2396 visibility = prev_visibility
2397 if s.sy == 'IDENT' and s.systring in ('extern', 'public', 'readonly'):
2398 visibility = s.systring
2399 if prev_visibility != 'private' and visibility != prev_visibility:
2400 s.error("Conflicting visibility options '%s' and '%s'"
2401 % (prev_visibility, visibility))
2405 def p_c_modifiers(s):
2406 if s.sy == 'IDENT' and s.systring in ('inline',):
2407 modifier = s.systring
2409 return [modifier] + p_c_modifiers(s)
2412 def p_c_func_or_var_declaration(s, pos, ctx):
2413 cmethod_flag = ctx.level in ('c_class', 'c_class_pxd')
2414 modifiers = p_c_modifiers(s)
2415 base_type = p_c_base_type(s, nonempty = 1, templates = ctx.templates)
2416 declarator = p_c_declarator(s, ctx, cmethod_flag = cmethod_flag,
2417 assignable = 1, nonempty = 1)
2418 declarator.overridable = ctx.overridable
2420 if ctx.level not in ('module', 'c_class', 'module_pxd', 'c_class_pxd') and not ctx.templates:
2421 s.error("C function definition not allowed here")
2422 doc, suite = p_suite(s, Ctx(level = 'function'), with_doc = 1)
2423 result = Nodes.CFuncDefNode(pos,
2424 visibility = ctx.visibility,
2425 base_type = base_type,
2426 declarator = declarator,
2429 modifiers = modifiers,
2431 overridable = ctx.overridable)
2434 # s.error("'api' not allowed with variable declaration")
2435 declarators = [declarator]
2438 if s.sy == 'NEWLINE':
2440 declarator = p_c_declarator(s, ctx, cmethod_flag = cmethod_flag,
2441 assignable = 1, nonempty = 1)
2442 declarators.append(declarator)
2443 s.expect_newline("Syntax error in C variable declaration")
2444 result = Nodes.CVarDefNode(pos,
2445 visibility = ctx.visibility,
2446 base_type = base_type,
2447 declarators = declarators,
2448 in_pxd = ctx.level == 'module_pxd',
2450 overridable = ctx.overridable)
2453 def p_ctypedef_statement(s, ctx):
2454 # s.sy == 'ctypedef'
2457 visibility = p_visibility(s, ctx.visibility)
2459 ctx = ctx(typedef_flag = 1, visibility = visibility)
2463 return p_c_class_definition(s, pos, ctx)
2464 elif s.sy == 'IDENT' and s.systring in ('packed', 'struct', 'union', 'enum'):
2465 if s.systring == 'enum':
2466 return p_c_enum_definition(s, pos, ctx)
2468 return p_c_struct_or_union_definition(s, pos, ctx)
2470 base_type = p_c_base_type(s, nonempty = 1)
2471 if base_type.name is None:
2472 s.error("Syntax error in ctypedef statement")
2473 declarator = p_c_declarator(s, ctx, is_type = 1, nonempty = 1)
2474 s.expect_newline("Syntax error in ctypedef statement")
2475 return Nodes.CTypeDefNode(
2476 pos, base_type = base_type,
2477 declarator = declarator, visibility = visibility,
2478 in_pxd = ctx.level == 'module_pxd')
2480 def p_decorators(s):
2482 while s.sy == 'DECORATOR':
2485 decstring = p_dotted_name(s, as_allowed=0)[2]
2486 names = decstring.split('.')
2487 decorator = ExprNodes.NameNode(pos, name=EncodedString(names[0]))
2488 for name in names[1:]:
2489 decorator = ExprNodes.AttributeNode(pos,
2490 attribute=EncodedString(name),
2493 decorator = p_call(s, decorator)
2494 decorators.append(Nodes.DecoratorNode(pos, decorator=decorator))
2495 s.expect_newline("Expected a newline after decorator")
2498 def p_def_statement(s, decorators=None):
2502 name = EncodedString( p_ident(s) )
2504 args, star_arg, starstar_arg = p_varargslist(s, terminator=')')
2507 error(pos, "Python function cannot be declared nogil")
2508 return_type_annotation = None
2511 return_type_annotation = p_test(s)
2512 doc, body = p_suite(s, Ctx(level = 'function'), with_doc = 1)
2513 return Nodes.DefNode(pos, name = name, args = args,
2514 star_arg = star_arg, starstar_arg = starstar_arg,
2515 doc = doc, body = body, decorators = decorators,
2516 return_type_annotation = return_type_annotation)
2518 def p_varargslist(s, terminator=')', annotated=1):
2519 args = p_c_arg_list(s, in_pyfunc = 1, nonempty_declarators = 1,
2520 annotated = annotated)
2526 star_arg = p_py_arg_decl(s)
2529 args.extend(p_c_arg_list(s, in_pyfunc = 1,
2530 nonempty_declarators = 1, kw_only = 1))
2531 elif s.sy != terminator:
2532 s.error("Syntax error in Python function argument list")
2535 starstar_arg = p_py_arg_decl(s)
2536 return (args, star_arg, starstar_arg)
2538 def p_py_arg_decl(s):
2544 annotation = p_test(s)
2545 return Nodes.PyArgDeclNode(pos, name = name, annotation = annotation)
2547 def p_class_statement(s, decorators):
2551 class_name = EncodedString( p_ident(s) )
2552 class_name.encoding = s.source_encoding
2555 base_list = p_simple_expr_list(s)
2559 doc, body = p_suite(s, Ctx(level = 'class'), with_doc = 1)
2560 return Nodes.PyClassDefNode(pos,
2562 bases = ExprNodes.TupleNode(pos, args = base_list),
2563 doc = doc, body = body, decorators = decorators)
2565 def p_c_class_definition(s, pos, ctx):
2569 class_name = p_ident(s)
2572 module_path.append(class_name)
2573 class_name = p_ident(s)
2574 if module_path and ctx.visibility != 'extern':
2575 error(pos, "Qualified class name only allowed for 'extern' C class")
2576 if module_path and s.sy == 'IDENT' and s.systring == 'as':
2578 as_name = p_ident(s)
2580 as_name = class_name
2581 objstruct_name = None
2583 base_class_module = None
2584 base_class_name = None
2587 base_class_path = [p_ident(s)]
2590 base_class_path.append(p_ident(s))
2592 s.error("C class may only have one base class")
2594 base_class_module = ".".join(base_class_path[:-1])
2595 base_class_name = base_class_path[-1]
2597 if ctx.visibility not in ('public', 'extern'):
2598 error(s.position(), "Name options only allowed for 'public' or 'extern' C class")
2599 objstruct_name, typeobj_name = p_c_class_options(s)
2601 if ctx.level == 'module_pxd':
2602 body_level = 'c_class_pxd'
2604 body_level = 'c_class'
2605 doc, body = p_suite(s, Ctx(level = body_level), with_doc = 1)
2607 s.expect_newline("Syntax error in C class definition")
2610 if ctx.visibility == 'extern':
2612 error(pos, "Module name required for 'extern' C class")
2614 error(pos, "Type object name specification not allowed for 'extern' C class")
2615 elif ctx.visibility == 'public':
2616 if not objstruct_name:
2617 error(pos, "Object struct name specification required for 'public' C class")
2618 if not typeobj_name:
2619 error(pos, "Type object name specification required for 'public' C class")
2620 elif ctx.visibility == 'private':
2622 error(pos, "Only 'public' C class can be declared 'api'")
2624 error(pos, "Invalid class visibility '%s'" % ctx.visibility)
2625 return Nodes.CClassDefNode(pos,
2626 visibility = ctx.visibility,
2627 typedef_flag = ctx.typedef_flag,
2629 module_name = ".".join(module_path),
2630 class_name = class_name,
2632 base_class_module = base_class_module,
2633 base_class_name = base_class_name,
2634 objstruct_name = objstruct_name,
2635 typeobj_name = typeobj_name,
2636 in_pxd = ctx.level == 'module_pxd',
2640 def p_c_class_options(s):
2641 objstruct_name = None
2647 if s.systring == 'object':
2649 objstruct_name = p_ident(s)
2650 elif s.systring == 'type':
2652 typeobj_name = p_ident(s)
2656 s.expect(']', "Expected 'object' or 'type'")
2657 return objstruct_name, typeobj_name
2659 def p_property_decl(s):
2661 s.next() # 'property'
2663 doc, body = p_suite(s, Ctx(level = 'property'), with_doc = 1)
2664 return Nodes.PropertyNode(pos, name = name, doc = doc, body = body)
2666 def p_doc_string(s):
2667 if s.sy == 'BEGIN_STRING':
2669 kind, result = p_cat_string_literal(s)
2671 s.expect_newline("Syntax error in doc string")
2673 # warning(pos, "Python 3 requires docstrings to be unicode strings")
2675 result.encoding = None # force a unicode string
2680 def p_code(s, level=None):
2681 body = p_statement_list(s, Ctx(level = level), first_statement = 1)
2683 s.error("Syntax error in statement [%s,%s]" % (
2684 repr(s.sy), repr(s.systring)))
2687 COMPILER_DIRECTIVE_COMMENT_RE = re.compile(r"^#\s*cython:\s*((\w|[.])+\s*=.*)$")
2689 def p_compiler_directive_comments(s):
2691 while s.sy == 'commentline':
2692 m = COMPILER_DIRECTIVE_COMMENT_RE.match(s.systring)
2694 directives = m.group(1).strip()
2696 result.update( Options.parse_directive_list(
2697 directives, ignore_unknown=True) )
2698 except ValueError, e:
2699 s.error(e.args[0], fatal=False)
2703 def p_module(s, pxd, full_module_name):
2706 directive_comments = p_compiler_directive_comments(s)
2707 s.parse_comments = False
2709 doc = p_doc_string(s)
2711 level = 'module_pxd'
2715 body = p_statement_list(s, Ctx(level = level), first_statement = 1)
2717 s.error("Syntax error in statement [%s,%s]" % (
2718 repr(s.sy), repr(s.systring)))
2719 return ModuleNode(pos, doc = doc, body = body,
2720 full_module_name = full_module_name,
2721 directive_comments = directive_comments)
2723 def p_cpp_class_definition(s, pos, ctx):
2724 # s.sy == 'cppclass'
2727 class_name = p_ident(s)
2728 cname = p_opt_cname(s)
2729 if cname is None and ctx.namespace is not None:
2730 cname = ctx.namespace + "::" + class_name
2732 error(pos, "Qualified class name not allowed C++ class")
2735 templates = [p_ident(s)]
2738 templates.append(p_ident(s))
2744 base_classes = [p_dotted_name(s, False)[2]]
2747 base_classes.append(p_dotted_name(s, False)[2])
2752 error(s.position(), "Name options not allowed for C++ class")
2758 body_ctx = Ctx(visibility = ctx.visibility)
2759 body_ctx.templates = templates
2760 while s.sy != 'DEDENT':
2761 if s.systring == 'cppclass':
2763 p_cpp_class_definition(s, s.position(), body_ctx))
2764 elif s.sy != 'pass':
2766 p_c_func_or_var_declaration(s, s.position(), body_ctx))
2769 s.expect_newline("Expected a newline")
2773 s.expect_newline("Syntax error in C++ class definition")
2774 return Nodes.CppClassNode(pos,
2777 base_classes = base_classes,
2778 visibility = ctx.visibility,
2779 in_pxd = ctx.level == 'module_pxd',
2780 attributes = attributes,
2781 templates = templates)
2785 #----------------------------------------------
2789 #----------------------------------------------
2791 def print_parse_tree(f, node, level, key = None):
2792 from types import ListType, TupleType
2793 from Nodes import Node
2798 f.write("%s: " % key)
2801 f.write("(%s @ %s\n" % (node[0], node[1]))
2802 for i in xrange(2, len(node)):
2803 print_parse_tree(f, node[i], level+1)
2804 f.write("%s)\n" % ind)
2806 elif isinstance(node, Node):
2809 except AttributeError:
2810 tag = node.__class__.__name__
2811 f.write("%s @ %s\n" % (tag, node.pos))
2812 for name, value in node.__dict__.items():
2813 if name != 'tag' and name != 'pos':
2814 print_parse_tree(f, value, level+1, name)
2818 for i in xrange(len(node)):
2819 print_parse_tree(f, node[i], level+1)
2820 f.write("%s]\n" % ind)
2822 f.write("%s%s\n" % (ind, node))