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

Conflitti in CUP

Se la grammatica è ambigua possono verificarsi dei conflitti.
Ciò vuol dire che l'analizzatore deve scegliere tra più azioni alternative.

Il problema viene risolto andando a cambiare la grammatica per renderla non ambigua, quindi si va a toccare la sintassi Cup creata usando simboli NON TERMINALI e TERMINALI.

Un altro modo per risolvere i conflitti e andare a definire le precedenze dei simboli terminali presenti nel costrutto sintattico.

Esempi di grammatiche ambigue:

  • costrutti if innestati
  • operazioni matematiche con + e *
  • operazioni logiche AND, OR ....

E' possibile suggerire a Cup come comportarsi
aggiungendo come risolvere precedenze e associatività
nella sezione delle precedenze.

La parola chiave precedence left introduce un operatore
associativo a sinistra, precedence right introduce un operatore associativo a destra, precedence nonassoc
introduce un operatore non associativo.

L'ordine con cui gli operatori sono dichiarati è inverso alla
loro priorità.

In questo modo, in caso di conflitto shift-reduce, viene favorita l'azione della regola con la precedenza maggiore.

terminal uminus;

precedence left ‘+', ‘-'; /* Bassa priorità */
precedence left ‘*', ‘/';
precedence left uminus; /* Alta priorità */

 

start with E;
E ::= E ‘+' E
        | E ‘-' E
        | E ‘*' E
        | E ‘/' E
        | ‘-' E %prec uminus
        | ‘(' E ‘)'
        | NUM
;

Se la regola è seguita dalla parola chiave %prec, la
precedenza e l'associatività sono quelle dell'operatore specificato.

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