6
votes

START STATS DANS LEX / FLEX

J'utilise Flex et Bison pour un générateur d'analyseurs, mais j'ai des problèmes avec les états de départ de mon scanner.

J'utilise des règles exclusives pour faire face à des commentaires, mais cette grammatie ne semble pas correspondre citée jetons: p> xxx pré>

dans cet exemple simple la ligne: p> xxx pré>

ne correspond pas entièrement comme un commentaire, sauf si je Inclure cette règle: P>

<COMMENT>"=="             ;


0 commentaires

3 Réponses :


9
votes

Correspondant aux commentaires de style C correspondant à Lex / Flex ou tout ce qui est bien documenté:

Dans la documentation , ainsi que diverses variations autour d'Internet. P>

Voici une variation de celle trouvée dans la documentation Flex: P >

   <INITIAL>{
     "//"              BEGIN(IN_COMMENT);
     }
     <IN_COMMENT>{
     \n      BEGIN(INITIAL);
     [^\n]+    // eat comment
     "/"       // eat the lone /
     }


4 commentaires

Je préférerais ne pas avoir à utiliser des États inclusifs si cela peut être évité, car j'ai beaucoup de règles. Le problème est que cette règle «Manger commentaire» ne semble pas correspondre à des jetons avec plus d'un caractère (tel que ==).


Ensuite, je pense que vous pourriez faire quelque chose de mal. Vous devez créer un «sous-analyseur» pour les commentaires, ce qui ne correspond pas à vos jetons normaux.


Dis, vous voulez stocker la ligne de chaque entrée, alors cela vous donnera-t-il des numéros de ligne incorrects?


@DonCode IIRC yylineno donne la bonne ligne quel que soit le début "blocs" que vous pouvez passer à Bison ou quoi que ce soit



2
votes

Essayez d'ajouter un "+" après la règle [^ n]. Je ne sais pas pourquoi l'état exclusif choisit toujours "==" même dans un état exclusif, mais apparemment c'est. Flex correspondra normalement à la règle correspondant au plus de texte et ajoute le "+" au moins rendre la longueur des deux règles. Mettre la règle de commentaire d'abord fera l'utiliser en cas d'égalité.


0 commentaires

0
votes

L'indice est:

Le problème est-ce "Manger commentaire" la règle ne semble pas correspondre aux jetons avec plus d'un caractère p> BlockQuote>

Ajoutez un * pour correspondre à zéro ou à plusieurs lignes non neuves. Vous voulez zéro sinon un commentaire vide ne correspond pas. P>

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]*        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;


2 commentaires

Un commentaire vide ne déclenchera pas une correspondance pour cette règle non plus non plus.


Vrai, vrai, la ligne ci-dessous qui l'attrape. Donc, vous êtes en sécurité pour changer le * à A +