[parser LALR] associativité et écriture des règles de production

associativité et écriture des règles de production [parser LALR] - Divers - Programmation

Marsh Posté le 04-02-2003 à 16:56:04    

voici un petit bout de parser pour l'outil java cup (partie expressions) :
 

Code :
  1. terminal   TOK_MINUS;
  2. terminal   TOK_PLUS;
  3. terminal   TOK_DIV;
  4. terminal   TOK_TIMES;
  5. non terminal Expression    expression;
  6. precedence left TOK_MINUS;
  7. precedence left TOK_PLUS;
  8. precedence left TOK_DIV;
  9. precedence left TOK_TIMES;
  10. expression ::= TOK_PO expression:e TOK_PC {: RESULT = e; :}
  11.    | expression:e1 TOK_PLUS expression:e2 {: RESULT = new BinaryPlus(e1, e2); :}
  12.    | expression:e1 TOK_MINUS expression:e2 {: RESULT = new BinaryMinus(e1, e2); :}
  13.    | expression:e1 TOK_TIMES expression:e2 {: RESULT = new BinaryTimes(e1, e2); :}
  14.    | expression:e1 TOK_DIV expression:e2 {: RESULT = new BinaryDiv(e1, e2); :}
  15.    | literal:lit {: RESULT = lit; :}
  16.    | identifier:i {: RESULT = i; :}
  17.    | func_call:fc {: RESULT = fc; :};


 
Ce code fonctionne et les opérateurs + * / - sont biens associatifs à gauche (avec les priorités dans le bon sens).
 
Le code suivant :

Code :
  1. terminal   TOK_MINUS;
  2. terminal   TOK_PLUS;
  3. terminal   TOK_DIV;
  4. terminal   TOK_TIMES;
  5. non terminal Expression  expression;
  6. non terminal BinaryOperatorFactory  bin_op;
  7. precedence left TOK_MINUS;
  8. precedence left TOK_PLUS;
  9. precedence left TOK_DIV;
  10. precedence left TOK_TIMES;
  11. precedence left bin_op;
  12. expression ::= TOK_PO expression:e TOK_PC {: RESULT = e; :}
  13.    | expression:e1 bin_op:fact expression:e2 {: RESULT = fact.createOperator(e1, e2) :}
  14.    | literal:lit {: RESULT = lit; :}
  15.    | identifier:i {: RESULT = i; :}
  16.    | func_call:fc {: RESULT = fc; :};
  17. bin_op := TOK_MINUS {: RESULT = BinaryMinus.factory(); :}
  18.   | TOK_PLUS {: RESULT = BinaryPlus.factory(); :}
  19.   | TOK_DIV {: RESULT = BinaryDiv.factory(); :}
  20.   | TOK_TIMES {: RESULT = BinaryTimes.factory(); :};


 
Dans ce code, tout le monde est associatif avec tout le monde à droite (gros énervé du décalage quoi).
 
Quelqu'un pourrrait m'expliquer finement le fonctionnement de la chose et la raison profonde de cette différence ?

Reply

Marsh Posté le 04-02-2003 à 16:56:04   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed