J'utilise Lemon comme générateur de parseur, sa gestion des erreurs est la même que celle de yacc et de bison si vous ne connaissez pas Lemon.Récupérer des jetons d'erreur dans l'analyse (Lemon)
Lemon a une option pour définir le jeton d'erreur dans un ensemble de règles afin d'intercepter les erreurs d'analyse. Le comportement par défaut de l'analyseur généré est de détruire le jeton provoquant l'erreur; est-il possible de contourner ce comportement afin que je puisse garder le jeton?
Voici un exemple pour montrer ce qui se passe: au fond, je suis annexant les jetons pour chaque règle ensemble pour réformer la chaîne d'entrée, voici une grammaire exemple:
input ::= string(A) { printf("%s", A); } // Print the result
string(A) ::= string(B) part(C). { A = append(B, C); }
string(A) ::= part(B). { A = B; }
part(A) ::= NUMBER(B) NAME(C). { A = append(C, B); } // Rearrange the number and name
part(A) ::= error(B). { A = B; } // On error keep the token anyways
En entrée:
"Username 1234Joseph"
Je reçois la sortie:
"Joseph1234"
Parce que le texte « Nom d'utilisateur » est mis au rebut par la analyseur dans la partie (A) :: = règle d'erreur (B), mais je veux vraiment:
"Username Joseph1234"
comme sortie.
Si vous ne pouvez résoudre ce problème dans le bison ou un autre générateur d'analyseur j'accepter que comme une réponse :)
Au cas où quelqu'un serait intéressé, j'ai fini par passer à RE2C [[link] (http://re2c.org/)]. Il était beaucoup plus facile d'obtenir le comportement avec les macros RE2C. J'ai écrit les macros de sorte que toutes les sous-chaînes non appariées soient simplement sorties alors que les sous-chaînes correspondantes sont modifiées par RE2C. –