S → E E → int |
E → E + E
E → E - E
E → E * E
E → E / E |
| Oscar | Amélie | Samir | Pamela |
| 1 + 2 * 3 | 3 - 2 - 1 | 1 + 2 + 3 | 2 + - 1 |
| 1 + 2 * 3 | 3 - 2 - 1 | 1 + 2 + 3 | |
| Oscar | 9 | 0 | 6 |
| Samir | 7 | 2 | 6 |
E [i] → int [i]
E [i1 + i2] → E [i1]+ E [i2] |
Parser dans le style du
lecteur des graphes de la PC précédente.
|
class Parser { private Lexer lexer ; Parser (Lexer lexer) { this.lexer = lexer ; step() ; } private Token tok ; private void step() { tok = lexer.read() ; } // Échoue en affichant « msg attendu, tok trouvé ». private void error (String msg, Token tok) { … } void ok() { … } } |
while).
while du programme par des
appels recursifs. Puis associer le programme transformé à l'une des
grammaires de la question précédente.
| Oscar | Samir | Instituteur |
| ( ( ( 1 * 2 ) + 3 ) * 4 ) | ( 1 * ( 2 + ( 3 * 4 ) ) ) | ( ( 1 * 2 ) + ( 3 * 4 ) ) |
Parser pour écrire
cette fois une classe Translate, munie de trois méthodes
samir, oscar et instit.
|
// Lire un entier, échoue si la tête du flux n'est pas un entier String readInt() { …} // Renvoie l'expression parenthésée « ( i1 tok i2 ) » String echo(String i1, Token tok, String i2) |
String samir() qui
parenthèse selon Samir. La technique est ici très simple, car on peut
s'inspirer directement des règles de la grammaire.String oscar().
La technique précédente ne fonctionne pas, mais on peut s'en tirer en
lisant le flux comme Samir.String instit().Ce document a été traduit de LATEX par HEVEA et HACHA.