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> dans cet exemple simple la ligne: p> ne correspond pas entièrement comme un commentaire, sauf si je Inclure cette règle: P> <COMMENT>"==" ;
3 Réponses :
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 / }
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
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é. P>
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; } . ;
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 +