Creato da pastuweb.com
Share My Page
My Social Accounts
Account FaceBook Account LinkedIn Account Twitter Account Google Plus Account Git Hub

Ad ogni simbolo viene associato un insieme di attributi:

  • sintetizzati: calcolati in base al valore degli attributi dei figli di un nodo nell'albero di derivazione;
  • ereditati: calcolati in base al valore degli attributi dei nodi fratelli e del nodo padre nell'albero di derivazione; 

Lo scanner passa i valori semantici dei simboli terminali al parser il quale, mentre riconosce la grammatica, aggiorna i nodi dell'albero di derivazione.

 

Attributi sintetizzati

Per utilizzare o comunque fare riferimento ai valori semantici dei simboli (terminali e non terminali) bisogna usare le etichette.

Esempio:

E ::= E:n1 PIU T:n2
            |  E:n1 MENO T:n2 ;

E ::= E:n1 PIU T:n2 {:System.out.print(n1 + " + " + n2 + " ="); :}
   | E:n1 MENO T:n2 {:System.out.print(n1 + " - " + n2 + " ="); :} ;

Ad ogni regola come si può vedere dagli esempi può essere associata un'azione {:/*codice Java*/:}

CUP definisce per ogni regola un oggetto di tipo Object chiamato RESULT.

RESULT rappresenta il risultato delle regole semantiche contenute nell'azione ed è perciò associato al simbolo non terminale che compare nella parte sinistra di una regola.

Esempio:

non terminal Integer E;
E ::= E:n1 PIU T:n2 {:
RESULT = new Integer(n1.intValue() + n2.intValue()); :}
| E:n1 MENO T:n2 {:
RESULT = new Integer(n1.intValue() - n2.intValue()); :}

A RESULT deve essere assegnato un oggetto di tipo Integer: new Integer().

Si possono propagare anche più valori verso la testa di una regola(non terminale a sinistra). Basta utilizzare le classi, esempio si può definire il non terminale di tipo Object[] oppure di un tipo custom la cui classe è definita esternamente e importata in CUP. Poi si ridefinisce il RESULT:

RESULT = new Object[2];
RESULT[0] = new String(a);
RESULT[1] = new Integer(b);

Alternativa:

action code {:
            class MyFunc {
                    MyFunc(String id, int args) {
                        this.id = new String(id);
                        this.args = args;
                    }
                    public String id;
                    public int args;
            }
:}

non terminal MyFunc Func;

Func ::= identifier:a TO Args:b TC {:
RESULT = new MyFunc( a, b.intValue() );
:} ;

Average (1 Vote)
The average rating is 5.0 stars out of 5.