mirror of
https://github.com/davidhalter/parso.git
synced 2025-12-09 06:04:54 +08:00
Restructure the Python 2 grammar to be closer to the original Python 2 grammar in case of list comprehensions.
This commit is contained in:
@@ -103,10 +103,11 @@ term: factor (('*'|'/'|'%'|'//') factor)*
|
|||||||
factor: ('+'|'-'|'~') factor | power
|
factor: ('+'|'-'|'~') factor | power
|
||||||
power: atom trailer* ['**' factor]
|
power: atom trailer* ['**' factor]
|
||||||
atom: ('(' [yield_expr|testlist_comp] ')' |
|
atom: ('(' [yield_expr|testlist_comp] ')' |
|
||||||
'[' [testlist_comp] ']' |
|
'[' [listmaker] ']' |
|
||||||
'{' [dictorsetmaker] '}' |
|
'{' [dictorsetmaker] '}' |
|
||||||
'`' testlist1 '`' |
|
'`' testlist1 '`' |
|
||||||
NAME | NUMBER | STRING+)
|
NAME | NUMBER | STRING+)
|
||||||
|
listmaker: test ( list_for | (',' test)* [','] )
|
||||||
testlist_comp: test ( comp_for | (',' test)* [','] )
|
testlist_comp: test ( comp_for | (',' test)* [','] )
|
||||||
lambdef: 'lambda' [varargslist] ':' test
|
lambdef: 'lambda' [varargslist] ':' test
|
||||||
trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
|
trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
|
||||||
@@ -127,8 +128,12 @@ arglist: (argument ',')* (argument [',']
|
|||||||
# 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
|
||||||
|
|
||||||
|
list_iter: list_for | list_if
|
||||||
|
list_for: 'for' exprlist 'in' testlist_safe [list_iter]
|
||||||
|
list_if: 'if' old_test [list_iter]
|
||||||
|
|
||||||
comp_iter: comp_for | comp_if
|
comp_iter: comp_for | comp_if
|
||||||
comp_for: 'for' exprlist 'in' testlist_safe [comp_iter]
|
comp_for: 'for' exprlist 'in' or_test [comp_iter]
|
||||||
comp_if: 'if' old_test [comp_iter]
|
comp_if: 'if' old_test [comp_iter]
|
||||||
|
|
||||||
testlist1: test (',' test)*
|
testlist1: test (',' test)*
|
||||||
|
|||||||
@@ -38,6 +38,10 @@ class Parser(BaseParser):
|
|||||||
'while_stmt': tree.WhileStmt,
|
'while_stmt': tree.WhileStmt,
|
||||||
'try_stmt': tree.TryStmt,
|
'try_stmt': tree.TryStmt,
|
||||||
'comp_for': tree.CompFor,
|
'comp_for': tree.CompFor,
|
||||||
|
# Not sure if this is the best idea, but IMO it's the easiest way to
|
||||||
|
# avoid extreme amounts of work around the subtle difference of 2/3
|
||||||
|
# grammar in list comoprehensions.
|
||||||
|
'list_for': tree.CompFor,
|
||||||
'decorator': tree.Decorator,
|
'decorator': tree.Decorator,
|
||||||
'lambdef': tree.Lambda,
|
'lambdef': tree.Lambda,
|
||||||
'old_lambdef': tree.Lambda,
|
'old_lambdef': tree.Lambda,
|
||||||
@@ -101,6 +105,12 @@ class Parser(BaseParser):
|
|||||||
# ones and therefore have pseudo start/end positions and no
|
# ones and therefore have pseudo start/end positions and no
|
||||||
# prefixes. Just ignore them.
|
# prefixes. Just ignore them.
|
||||||
children = [children[0]] + children[2:-1]
|
children = [children[0]] + children[2:-1]
|
||||||
|
elif symbol == 'list_if':
|
||||||
|
# Make transitioning from 2 to 3 easier.
|
||||||
|
symbol = 'comp_if'
|
||||||
|
elif symbol == 'listmaker':
|
||||||
|
# Same as list_if above.
|
||||||
|
symbol = 'testlist_comp'
|
||||||
return self.default_node(symbol, children)
|
return self.default_node(symbol, children)
|
||||||
|
|
||||||
def convert_leaf(self, pgen_grammar, type, value, prefix, start_pos):
|
def convert_leaf(self, pgen_grammar, type, value, prefix, start_pos):
|
||||||
|
|||||||
Reference in New Issue
Block a user