Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3505 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°301178
nraynaud
lol
Posté le 04-02-2003 à 16:56:04  profilanswer
 

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 ?

mood
Publicité
Posté le 04-02-2003 à 16:56:04  profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

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

 

Sujets relatifs
[Win32] Forcer l'ecriture sur un fichier utilisé par un autre processRegles de nommage (variables, fichiers, etc.)
Pb d'écriture avec Sockets[C,C++] ecriture tableau dans un fichier
Ecriture hexadécimale d'un nombreconseil ecriture commande mysql
coup de main pour parser du XML avec XML::DOM??prb pour l'ecriture d'une methode en sql3 :(
XML parser c++Tomcat 4 - Paramétrage pour une utilisation en production
Plus de sujets relatifs à : [parser LALR] associativité et écriture des règles de production


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR