konnte nicht ganz herausfinden, es Liste von Listen wurde die Handhabung oder von Listen oder eine Liste von Sätzen usw. eingestellt ..
Es Listen von Sätzen oder was auch immer nicht unterscheiden:
atom: ('(' [yield_expr|testlist_comp] ')' |
'[' [listmaker] ']' |
'{' [dictorsetmaker] '}' |
'`' testlist1 '`' |
NAME | NUMBER | STRING+)
Die Art, wie sie die Rekursion der Art handhaben, die Sie beschreiben, ist, dass listmaker
, dictorsetmaker
usw. schließlich atom
enthalten kann. Zum Beispiel:
listmaker: test (list_for | (',' test)* [','])
test: or_test ['if' or_test 'else' test] | lambdef
or_test: and_test ('or' and_test)*
and_test: not_test ('and' not_test)*
not_test: 'not' not_test | comparison
comparison: expr (comp_op expr)*
expr: xor_expr ('|' xor_expr)*
xor_expr: and_expr ('^' and_expr)*
and_expr: shift_expr ('&' shift_expr)*
shift_expr: arith_expr (('<<'|'>>') arith_expr)*
arith_expr: term (('+'|'-') term)*
term: factor (('*'|'/'|'%'|'//') factor)*
factor: ('+'|'-'|'~') factor | power
power: atom trailer* ['**' factor]
Es gibt viele Zwischenprodukte; Das liegt daran, dass sie für eine Reihe mathematischer Operatoren Vorrang haben müssen. Dann gibt es list_for
, die das Hinzufügen der zusätzlichen Sachen für ein Listenverständnis erlaubt.
Ein wesentlich vereinfachtes Beispiel könnte wie folgt aussehen:
atom: ('[' [list_or_set] ']' |
'{' [list_or_set] '}' |
NAME | NUMBER | STRING+)
list_or_set: atom (',' atom)* [',']
Oder wenn Sie den Unterschied zwischen den Listen will und setzt auf dieser Ebene getroffen werden:
atom: list | set | NAME | NUMBER | STRING+
list: '[' atom (',' atom)* [','] ']'
set: '{' atom (',' atom)* [','] '}'
„Es unterscheidet nicht“ ist falsch; es gibt natürlich getrennte 'listmaker'- und' dictorsetmaker'-Produktionen, und der Parser kann sich darauf verlassen, um den AST zu bauen, anstatt die Klammern erneut prüfen zu müssen, um herauszufinden, was er hat. –