Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
nexedi
cython
Commits
7abc52a4
Commit
7abc52a4
authored
Aug 22, 2014
by
Robert Bradshaw
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'grammar3' into grammar-merge
Conflicts: Cython/Parser/Grammar
parents
61966bb0
3aa90569
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
51 additions
and
57 deletions
+51
-57
Cython/Compiler/Main.py
Cython/Compiler/Main.py
+1
-1
Cython/Parser/Grammar
Cython/Parser/Grammar
+50
-56
No files found.
Cython/Compiler/Main.py
View file @
7abc52a4
...
@@ -692,7 +692,7 @@ default_options = dict(
...
@@ -692,7 +692,7 @@ default_options = dict(
relative_path_in_code_position_comments
=
True
,
relative_path_in_code_position_comments
=
True
,
c_line_in_traceback
=
True
,
c_line_in_traceback
=
True
,
language_level
=
2
,
language_level
=
2
,
formal_grammar
=
Tru
e
,
formal_grammar
=
Fals
e
,
gdb_debug
=
False
,
gdb_debug
=
False
,
compile_time_env
=
None
,
compile_time_env
=
None
,
common_utility_include_dir
=
None
,
common_utility_include_dir
=
None
,
...
...
Cython/Parser/Grammar
View file @
7abc52a4
...
@@ -13,35 +13,38 @@
...
@@ -13,35 +13,38 @@
# Start symbols for the grammar:
# Start symbols for the grammar:
# single_input is a single interactive statement;
# single_input is a single interactive statement;
# file_input is a module or sequence of commands read from an input file;
# file_input is a module or sequence of commands read from an input file;
# eval_input is the input for the eval()
and input()
functions.
# eval_input is the input for the eval() functions.
# NB: compound_stmt in single_input is followed by extra NEWLINE!
# NB: compound_stmt in single_input is followed by extra NEWLINE!
single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
file_input: (NEWLINE | stmt)* ENDMARKER
file_input: (NEWLINE | stmt)* ENDMARKER
eval_input: testlist NEWLINE* ENDMARKER
eval_input: testlist NEWLINE* ENDMARKER
decorator: '@' dotted_
name
[ '(' [arglist] ')' ] NEWLINE
decorator: '@' dotted_
PY_NAME
[ '(' [arglist] ')' ] NEWLINE
decorators: decorator+
decorators: decorator+
decorated: decorators (classdef | funcdef | cdef_stmt)
decorated: decorators (classdef | funcdef | cdef_stmt)
funcdef: 'def' PY_NAME parameters ':' suite
funcdef: 'def' PY_NAME parameters ['->' test] ':' suite
parameters: '(' [varargslist] ')'
parameters: '(' [typedargslist] [',' '...'] ')'
varargslist: ((fpdef ['=' test] ',')*
typedargslist: (tfpdef ['=' test] (',' tfpdef ['=' test])* [','
('*' PY_NAME [',' '**' PY_NAME] | '**' PY_NAME) |
['*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef]]
fpdef ['=' (test | '*')] (',' fpdef ['=' (test | '*')])* [',']
| '*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef)
['.' '.' '.'])
tfpdef: maybe_typed_name [':' test]
fpdef: maybe_typed_name | '(' fplist ')'
varargslist: (vfpdef ['=' test] (',' vfpdef ['=' test])* [','
fplist: fpdef (',' fpdef)* [',']
['*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] | '**' vfpdef]]
| '*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] | '**' vfpdef)
vfpdef: maybe_typed_name
stmt: simple_stmt | compound_stmt | cdef_stmt | ctypedef_stmt | DEF_stmt | IF_stmt
stmt: simple_stmt | compound_stmt | cdef_stmt | ctypedef_stmt | DEF_stmt | IF_stmt
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
small_stmt: (expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt |
small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt |
import_stmt | global_stmt | exec_stmt | assert_stmt)
import_stmt | global_stmt | nonlocal_stmt | assert_stmt | print_stmt)
expr_stmt: testlist (augassign (yield_expr|testlist) |
expr_stmt: testlist_star_expr (augassign (yield_expr|testlist) |
('=' (yield_expr|testlist))*)
('=' (yield_expr|testlist_star_expr))*)
testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [',']
augassign: ('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' |
augassign: ('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' |
'<<=' | '>>=' | '**=' | '//=')
'<<=' | '>>=' | '**=' | '//=')
# For normal assignments, additional restrictions enforced by the interpreter
print_stmt: 'print' ( [ test (',' test)* [','] ] |
print_stmt: 'print' ( [ test (',' test)* [','] ] |
'>>' test [ (',' test)+ [','] ] )
'>>' test [ (',' test)+ [','] ] )
# For normal assignments, additional restrictions enforced by the interpreter
del_stmt: 'del' exprlist
del_stmt: 'del' exprlist
pass_stmt: 'pass'
pass_stmt: 'pass'
flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt
flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt
...
@@ -49,17 +52,20 @@ break_stmt: 'break'
...
@@ -49,17 +52,20 @@ break_stmt: 'break'
continue_stmt: 'continue'
continue_stmt: 'continue'
return_stmt: 'return' [testlist]
return_stmt: 'return' [testlist]
yield_stmt: yield_expr
yield_stmt: yield_expr
raise_stmt: 'raise' [test [',' test [',' test]]]
raise_stmt: 'raise' [test ['from' test]]
import_stmt: import_name | import_from
# raise_stmt: 'raise' [test [',' test [',' test]]]
import_name: ('import' | 'cimport') dotted_as_names
import_stmt: import_PY_NAME | import_from
import_from: ('from' ('.'* dotted_name | '.'+)
import_PY_NAME: ('import' | 'cimport') dotted_as_PY_NAMEs
('import' | 'cimport') ('*' | '(' import_as_names ')' | import_as_names))
# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS
import_as_name: PY_NAME ['as' PY_NAME]
import_from: ('from' (('.' | '...')* dotted_PY_NAME | ('.' | '...')+)
dotted_as_name: dotted_name ['as' PY_NAME]
('import' | 'cimport') ('*' | '(' import_as_PY_NAMEs ')' | import_as_PY_NAMEs))
import_as_names: import_as_name (',' import_as_name)* [',']
import_as_PY_NAME: PY_NAME ['as' PY_NAME]
dotted_as_names: dotted_as_name (',' dotted_as_name)*
dotted_as_PY_NAME: dotted_PY_NAME ['as' PY_NAME]
dotted_name: PY_NAME ('.' PY_NAME)*
import_as_PY_NAMEs: import_as_PY_NAME (',' import_as_PY_NAME)* [',']
global_stmt: ('global' | 'nonlocal') PY_NAME (',' PY_NAME)*
dotted_as_PY_NAMEs: dotted_as_PY_NAME (',' dotted_as_PY_NAME)*
dotted_PY_NAME: PY_NAME ('.' PY_NAME)*
global_stmt: 'global' PY_NAME (',' PY_NAME)*
nonlocal_stmt: 'nonlocal' PY_NAME (',' PY_NAME)*
exec_stmt: 'exec' expr ['in' test [',' test]]
exec_stmt: 'exec' expr ['in' test [',' test]]
assert_stmt: 'assert' test [',' test]
assert_stmt: 'assert' test [',' test]
...
@@ -76,24 +82,21 @@ try_stmt: ('try' ':' suite
...
@@ -76,24 +82,21 @@ try_stmt: ('try' ':' suite
with_stmt: 'with' with_item (',' with_item)* ':' suite
with_stmt: 'with' with_item (',' with_item)* ':' suite
with_item: test ['as' expr]
with_item: test ['as' expr]
# NB compile.c makes sure that the default except clause is last
# NB compile.c makes sure that the default except clause is last
except_clause: 'except' [test [
('as' | ',') test
]]
except_clause: 'except' [test [
'as' PY_NAME
]]
suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT
suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT
# Backward compatibility cruft to support:
# [ x for x in lambda: True, lambda: False if x() ]
# even while also allowing:
# lambda x: 5 if x else 2
# (But not a mix of the two)
testlist_safe: old_test [(',' old_test)+ [',']]
old_test: or_test | old_lambdef
old_lambdef: 'lambda' [varargslist] ':' old_test
test: or_test ['if' or_test 'else' test] | lambdef
test: or_test ['if' or_test 'else' test] | lambdef
test_nocond: or_test | lambdef_nocond
lambdef: 'lambda' [varargslist] ':' test
lambdef_nocond: 'lambda' [varargslist] ':' test_nocond
or_test: and_test ('or' and_test)*
or_test: and_test ('or' and_test)*
and_test: not_test ('and' not_test)*
and_test: not_test ('and' not_test)*
not_test: 'not' not_test | comparison
not_test: 'not' not_test | comparison
comparison: expr (comp_op expr)*
comparison: expr (comp_op expr)*
# <> isn't actually a valid comparison operator in Python. It's here for the
# sake of a __future__ import described in PEP 401
comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
star_expr: '*' expr
expr: xor_expr ('|' xor_expr)*
expr: xor_expr ('|' xor_expr)*
xor_expr: and_expr ('^' and_expr)*
xor_expr: and_expr ('^' and_expr)*
and_expr: shift_expr ('&' shift_expr)*
and_expr: shift_expr ('&' shift_expr)*
...
@@ -103,46 +106,37 @@ term: factor (('*'|'/'|'%'|'//') factor)*
...
@@ -103,46 +106,37 @@ term: factor (('*'|'/'|'%'|'//') factor)*
factor: ('+'|'-'|'~') factor | power | address | size_of | cast
factor: ('+'|'-'|'~') factor | power | address | size_of | cast
power: atom trailer* ['**' factor]
power: atom trailer* ['**' factor]
atom: ('(' [yield_expr|testlist_comp] ')' |
atom: ('(' [yield_expr|testlist_comp] ')' |
'[' [
listmaker
] ']' |
'[' [
testlist_comp
] ']' |
'{' [dictorsetmaker] '}' |
'{' [dictorsetmaker] '}' |
'`' testlist1 '`' |
new_expr |
new_expr |
PY_NAME | NUMBER | STRING+)
PY_NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False')
listmaker: test ( list_for | (',' test)* [','] )
testlist_comp: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )
testlist_comp: test ( comp_for | (',' test)* [','] )
lambdef: 'lambda' [varargslist] ':' test
trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' (PY_NAME | 'sizeof')
trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' (PY_NAME | 'sizeof')
subscriptlist: subscript (',' subscript)* [',']
subscriptlist: subscript (',' subscript)* [',']
subscript:
'.' '.' '.' |
test | [test] ':' [test] [sliceop]
subscript: test | [test] ':' [test] [sliceop]
sliceop: ':' [test]
sliceop: ':' [test]
exprlist:
expr (',' expr
)* [',']
exprlist:
(expr|star_expr) (',' (expr|star_expr)
)* [',']
testlist: test (',' test)* [',']
testlist: test (',' test)* [',']
dictorsetmaker: ( (test ':' test (comp_for | (',' test ':' test)* [','])) |
dictorsetmaker: ( (test ':' test (comp_for | (',' test ':' test)* [','])) |
(test (comp_for | (',' test)* [','])) )
(test (comp_for | (',' test)* [','])) )
classdef: 'class' PY_NAME ['(' [
test
list] ')'] ':' suite
classdef: 'class' PY_NAME ['(' [
arg
list] ')'] ':' suite
arglist: (argument ',')* (argument [',']
arglist: (argument ',')* (argument [',']
|'*' test (',' argument)* [',' '**' test]
|'*' test (',' argument)* [',' '**' test]
|'**' test)
|'**' test)
# The reason that keywords are test nodes instead of NAME is that using NAME
# The reason that keywords are test nodes instead of NAME is that using NAME
# results in an ambiguity. ast.c makes sure it's a NAME.
# results in an ambiguity. ast.c makes sure it's a NAME.
argument: test [comp_for] | test '=' test
argument: test [comp_for] | test '=' test # Really [keyword '='] test
list_iter: list_for | list_if
list_for: 'for' exprlist ('in' testlist_safe [list_iter] | for_from_clause)
list_if: 'if' old_test [list_iter]
comp_iter: comp_for | comp_if
comp_iter: comp_for | comp_if
comp_for: 'for' exprlist ('in' or_test [comp_iter] | for_from_clause)
comp_for: 'for' exprlist ('in' or_test | for_from_clause) [comp_iter]
comp_if: 'if' old_test [comp_iter]
comp_if: 'if' test_nocond [comp_iter]
testlist1: test (',' test)*
# not used in grammar, but may appear in "node" passed from Parser to Compiler
# not used in grammar, but may appear in "node" passed from Parser to Compiler
encoding_decl: NAME
encoding_decl: NAME
yield_expr: 'yield' ['from'] [testlist]
yield_expr: 'yield' [yield_arg]
yield_arg: 'from' test | testlist
# Cython extensions
# Cython extensions
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment