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.