2010-11-19 12 views
1

Dans la section de classe de mon code, si j'écris une erreur, quelques lignes seront signalées comme des erreurs alors qu'elles ne le devraient pas. J'ai mis '| error' dans certains endroits où il est bon/sûr de récupérer des erreurs mais je ne pense pas qu'il l'utilise. Peut-être essaye-t-il de reprendre une expression médiatique quelque part?bison: une erreur provoque une erreur supplémentaire mais incorrecte

Y a-t-il un moyen de forcer Bison à essayer de récupérer dans des endroits désignés? Comment ça marche et que pourrais-je faire de mal?

Je place la ligne d'erreur à côté de la boucle. Voici un exemple:

SomeRuleLoop: 
    | Rule ',' SomeRuleLoop 
Rule: 
     A 
    | B 
    | C 
    | Error 
A: 
     AA AAB AABC 
    | AA AAB AABC Z 
... 

Voici un exemple de mes règles. Je vois "erreur funcBody" dans ma console mais la ligne suivante reçoit une erreur à cause de la première erreur. Même si chaque funcBodyRule est autonome. J'ai essayé d'écrire # == entre la ligne avec la première erreur et la ligne avec la deuxième. J'ai écrit ceci pour vérifier si l'analyseur est toujours dans la boucle de funcbody. Cela ne donne pas une erreur donc c'est . Nevermind j'ai ajouté un printf et la chaîne n'est pas imprimée alors peut-être que ce n'est plus dans la boucle de fonction? Comment puis-je réparer ça?

+0

Il va être presque impossible d'aider beaucoup sans un code pour nous aider. ** Mais ** il doit être proche du code minimal, pas plusieurs centaines de lignes .. –

+0

@Jonathan Leffler: C'est où la boucle est. J'ai modifié ma question –

+0

Vous savez que Yacc (Bison) est sensible à la casse, donc l'alternative avec 'Error' n'est pas la même que 'error' (qui est 'built in' et a une signification spécifique w.r.t error recovery). –

Répondre

0

Obliger « ; » ou newlines à la fin de l'erreur le résout. (| error my_end_of_statenent au lieu de | error)

1

Yacc et Bison utilisent normalement des règles récursives à gauche, et les règles affichées ne sont pas récursives à gauche.

Comme le montre, la première règle est équivalente à:

SomeRuleLoop: 
     /* Nothing */ 
    | Rule ',' SomeRuleLoop 
    ; 

Ceci est une règle droite récursif qui dit qu'un « SomeRuleLoop » est une chaîne vide de jetons ou une « règle » suivi d'un virgule et un peu plus 'SomeRuleLoop'. Notez que cela signifie qu'un 'SomeRuleLoop' se termine par une virgule, ce qui n'est probablement pas ce que vous aviez en tête.

La première règle devrait probablement lire:

SomeRuleLoop: 
     Rule 
    | SomeRuleLoop ',' Rule 
    ; 

Notez qu'autoriser des alternatives vides est important - mais les ajouter tend partout à rendre la ambiguë grammaire (plus de changement/réduire les conflits)


Vous devez également utiliser l'erreur 'token' (en minuscules) plutôt que 'Error' (casse mixte) pour indiquer un point où la récupération d'erreur peut se produire.

Cependant, je ne sais pas ce que le reste de vos problèmes sont ...

+0

Attendez wait wait ... vous plaisantez. Sa gauche est récursive? Pas juste récursif? Yikes, je l'ai fait mal. Cela peut résoudre le problème d'erreur. Je commenterai quand j'ai tout arrangé –

+0

Je suis assez confus. J'ai modifié les règles pour rester récursif. Je vois mon message d'erreur en cours d'impression. Pourtant, j'ai toujours une erreur. J'ai mis à jour la question –

Questions connexes