19.3.1 Nodi AST

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.

class Node( )

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:

getChildren( )
Restituisce una lista appiattita dei nodi figli nell'ordine in cui appaiono. Specificatamente, l'ordine dei nodi è quello nel quale compaiono nella grammatica di Python. Non tutti i figli sono istanze di Node. I nomi delle funzioni e classi, per esempio, sono semplici stringhe.

getChildNodes( )
Restituisce una lista appiattita di nodi figli nell'ordine in cui si presentano. Il metodo è simile a getChildren(), ad eccezione del fatto che restituisce solo quei figli che sono istanze di Node.

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  
Print 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.