Je ne vois pas ou est la difficulté. Mais je n'ai peut-être pas bien saisi le problème.
Le lexer intercepte le retour chariot seulement s'il n'a pas été intercepté avant, c'est-à-dire dans tes propres règles. Il peut l'être explicitement, ou via un ".", par exemple.
Le retour à la ligne peut être spécifié à Lex facilement en utilisant \n. Dès lors, tu mets ce retour et ton caractère régulier (comme ";") de séparation d'instruction dans une même expression, tu retournes un token quand tu la vérifies, et tu laisse le lexer ignorer les blancs de façon silencieuse. Donc :
instruction: phrase SEP { Execute(1ドル); }
| phrase { Execute (1ドル); }
| SEP /* Ne fais rien de particulier si tu trouves un séparateur isolé */
phrase: MOT phrase
| MOT
De cette façon, les blancs ne remontent jamais jusqu'au niveau grammatical.
On remarque que j'aurais pu coller un "+" au bout de la regexp de SEP, mais ce n'est pas forcément souhaitable d'un point de vue sémantique. Un blanc peut être long de plusieurs caractères, mais chaque séparateur doit être reconnu quand même.
# Séparateur ?
Posté par Obsidian . En réponse au message YACC: retour-chariot comme séparateur. Évalué à 4.
Le lexer intercepte le retour chariot seulement s'il n'a pas été intercepté avant, c'est-à-dire dans tes propres règles. Il peut l'être explicitement, ou via un ".", par exemple.
Le retour à la ligne peut être spécifié à Lex facilement en utilisant \n. Dès lors, tu mets ce retour et ton caractère régulier (comme ";") de séparation d'instruction dans une même expression, tu retournes un token quand tu la vérifies, et tu laisse le lexer ignorer les blancs de façon silencieuse. Donc :
Dans Lex :
[A-Za-z0-9]+ return MOT;
[;\n] return SEP;
[ \t]+ /* Ignore les blancs */ ;
. printf ("Erreur. Caractère non reconnu.\n");
Et dans Yacc
instruction: phrase SEP { Execute(1ドル); }
| phrase { Execute (1ドル); }
| SEP /* Ne fais rien de particulier si tu trouves un séparateur isolé */
phrase: MOT phrase
| MOT
De cette façon, les blancs ne remontent jamais jusqu'au niveau grammatical.
On remarque que j'aurais pu coller un "+" au bout de la regexp de SEP, mais ce n'est pas forcément souhaitable d'un point de vue sémantique. Un blanc peut être long de plusieurs caractères, mais chaque séparateur doit être reconnu quand même.