2010-11-26 5 views
1

Laissez-moi vous donner un exemple. Supposons que le contenu d'un fichier texte sont les suivantes:Comment programmer Lex et Yacc pour analyser un fichier partiel

fonction fun1 {
    int a, b, c;
    fonction fun2 {
        int d, e;
        char f g;
        fonction fun3 {
            int h, i;
       }
   }

Dans le fichier texte ci-dessus, le nombre d'accolades d'ouverture ne sont pas correspondant au nombre de accolades de fermeture. Le fichier dans son ensemble ne suit pas la syntaxe. Cependant les fonctions partielles fun2 et fun3 suivent la syntaxe. Généralement, le fichier texte est très volumineux.

Si l'utilisateur veut analyser la totalité du fichier, c'est-à-dire la fonction fun1, alors le programme devrait afficher une erreur car les accolades ne correspondent pas. Cependant, si l'utilisateur veut seulement analyser le fichier partiel ie la fonction fun2/fun3, alors le programme ne devrait pas jeter une erreur car les accolades correspondent.

J'ai une question maintenant 1. Y at-il un moyen de laisser le Lex et Yacc charger seulement un fichier partiel ? Si oui, comment cela doit-il être fait.

Répondre

2

Utilisez-vous bison/flex ou plaine vieux yacc/lex? Ca fait longtemps que je joue avec yacc.

La réponse technique est différente pour les deux paires d'outils.

Avec Flex, vous devrez faire face à the buffer mechanism. Le code final sera plus propre.

Avec lex, vous devrez tout faire à la main. Au moins, vous devez redéfinir la macro d'entrée et de sortie. Vous pouvez également essayer de jouer avec yyin et fseek.

Du côté de l'analyseur, vous devrez faire face à la gestion des erreurs (yyerrok macro) et error jeton

http://dinosaur.compilertools.net/bison/bison_9.html#SEC81

Questions connexes