2011-04-03 4 views
4

J'essaie de faire une phase sémantique pour le compilateur c en utilisant lex et yacc. En ce moment, le problème est que si j'ai plusieurs erreurs dans le programme c, il s'arrête après le 1er. Que puis-je faire?Phase sémantique du compilateur

+5

Dans votre fichier yacc, supprimez le 'exit (0);' qui est juste après 'printf' avec le message"% s est défini "? – pmg

Répondre

2

Je vous recommande fortement d'effectuer l'analyse sémantique en tant que phase séparée et non en tant que partie de la phase d'analyse. Utilisez YACC seulement pour construire un abstract syntax tree, puis traversez cet arbre dans une fonction séparée. Cette fonction aura une liberté illimitée quand il s'agit de se déplacer dans l'arbre, au lieu d'avoir à "suivre l'analyse". En ce qui concerne le problème spécifique que vous avez mentionné, le commentaire de @ pmg semble avoir mis le doigt sur le problème.

1

Il n'y a pas de réponse absolue à cette question. Une façon typique de le gérer est de créer un motif spécial pour lire les symboles jusqu'à ce qu'il arrive à (par exemple) un point-virgule à la fin d'une ligne, donnant un signal raisonnable que tout ce qui est après est une nouvelle déclaration, définition, déclaration , etc., puis redémarrez l'analyse à partir de ce point (en conservant suffisamment de contexte pour savoir, par exemple, que vous êtes en train d'analyser un corps de fonction, donc vous acceptez/rejetez l'entrée sur cette base).