Il modulo compiler.ast viene generato da un file di testo che descrive ogni tipo di nodo ed i suoi elementi. Ogni tipo di nodo viene rappresentato come una classe che eredita dalla classe base astratta compiler.ast.Node e definisce un insieme di attributi denominati per i nodi figli.
) |
Le istanze Node vengono create automaticamente dal generatore del parser. Per le specifiche istanze Node si consiglia di utilizzare un'interfaccia che sfrutti gli attributi pubblici per l'accesso ai nodi figli. Un attributo pubblico può essere legato ad un singolo nodo o ad una sequenza di nodi, a seconda del tipo di Node. Per esempio l'attributo bases di un nodo Class è legato a una lista di nodi di classi base, e l'attributo doc viene legato ad un singolo nodo.
Ogni istanza di Node possiede un attributo lineno, che
potrebbe essere None
.
XXX Non sono sicuro che le regole per alcuni nodi avranno un'attributo lineno.utile
Tutti gli oggetti Node offrono i seguenti metodi:
) |
) |
Questi due esempi illustrano la struttura generale delle classi Node. L'istruzione while viene definita attraverso la seguente produzione grammaticale:
while_stmt: "while" expression ":" suite ["else" ":" suite]
Il nodo While ha tre attributi: test, body ed else_ (se il nome naturale di un attributo è anche una parola riservata di Python allora non può essere usato come nome di un attributo. Una sottolineatura viene aggiunta alla parola per renderla un identificatore valido, quindi else_ invece di else).
L'istruzione if è più complicata, perché può includere diversi test.
if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
Il nodo If definisce soltanto due attributi: tests ed else_. L'attributo tests è una sequenza di espressioni da valutare, coppie di istruzioni consecutive. C'è una coppia per ogni clausola if/elif. Il primo elemento della coppia è l'espressione da valutare. Il secondo elemento è un nodo Stmt che contiene il codice da eseguire se la condizione è vera.
Il metodo getChildren() di If restituisce una lista appiattita di nodi figli. Se ci sono tre clausole if/elif e nessuna clausola else, allora getChildren() restituirà una lista di sei elementi: la prima espressione da valutare, il primo Stmt, il secondo testo dell'espressione, etc.
La seguente tabella elenca ognuna delle sottoclassi di Node, definite in compiler.ast ed ognuno degli attributi pubblici disponibili nelle rispettive istanze. I valori della gran parte degli attributi sono essi stessi istanze di Node o sequenze di istanze. Quando il valore è qualcosa di diverso da un'istanza, il tipo viene specificato nel commento a fianco. Gli attributi vengono elencati nell'ordine nel quale vengono restituiti dai metodi getChildren() e getChildNodes().
Tipo di Nodo | Attributo | Valore |
---|---|---|
Add | left | operando sinistro |
right | operando destro | |
And | nodes | lista degli operandi |
AssAttr | attributo destinazione dell'assegnamento | |
expr | espressione a sinistra del punto | |
attrname | il nome dell'attributo, una stringa | |
flags | XXX | |
AssList | nodes | elenco degli elementi della lista che vengono assegnati |
AssName | name | nome che viene assegnato |
flags | XXX | |
AssTuple | nodes | lista di elementi della tupla che vengono assegnati |
Assert | test | l'espressione da valutare |
fail | il valore di AssertionError | |
Assign | nodes | una lista degli obiettivi dell'assegnamento, uno per ogni segno di uguale |
expr | il valore che viene assegnato | |
AugAssign | node | |
op | ||
expr | ||
Backquote | expr | |
Bitand | nodes | |
Bitor | nodes | |
Bitxor | nodes | |
Break | ||
CallFunc | node | espressione per la chiamata |
args | una lista di argomenti | |
star_args | il valore di *-arg esteso | |
dstar_args | il valore di **-arg esteso | |
Class | name | il nome della classe, una stringa |
bases | una lista di classi base | |
doc | doc string, una stringa o None |
|
code | il corpo dell'istruzione class | |
Compare | expr | |
ops | ||
Const | value | |
Continue | ||
Dict | items | |
Discard | expr | |
Div | left | |
right | ||
Ellipsis | ||
Exec | expr | |
locals | ||
globals | ||
For | assign | |
list | ||
body | ||
else_ | ||
From | modname | |
names | ||
Function | name | nome usato in def, una stringa |
argnames | lista dei nomi degli argomenti, come stringhe | |
defaults | lista dei valori predefiniti | |
flags | xxx | |
doc | doc string, una stringa o None |
|
code | il corpo della funzione | |
Getattr | expr | |
attrname | ||
Global | names | |
If | tests | |
else_ | ||
Import | names | |
Invert | expr | |
Keyword | name | |
expr | ||
Lambda | argnames | |
defaults | ||
flags | ||
code | ||
LeftShift | left | |
right | ||
List | nodes | |
ListComp | expr | |
quals | ||
ListCompFor | assign | |
list | ||
ifs | ||
ListCompIf | test | |
Mod | left | |
right | ||
Module | doc | doc string, una stringa o None |
node | corpo del modulo, un Stmt | |
Mul | left | |
right | ||
Name | name | |
Not | expr | |
Or | nodes | |
Pass | ||
Power | left | |
right | ||
nodes | ||
dest | ||
Printnl | nodes | |
dest | ||
Raise | expr1 | |
expr2 | ||
expr3 | ||
Return | value | |
RightShift | left | |
right | ||
Slice | expr | |
flags | ||
lower | ||
upper | ||
Sliceobj | nodes | lista di istruzioni |
Stmt | nodes | |
Sub | left | |
right | ||
Subscript | expr | |
flags | ||
subs | ||
TryExcept | body | |
handlers | ||
else_ | ||
TryFinally | body | |
final | ||
Tuple | nodes | |
UnaryAdd | expr | |
UnarySub | expr | |
While | test | |
body | ||
else_ | ||
Yield | value |
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.