J'ai un fichier lex/flex relativement simple et je l'ai exécuté avec l'indicateur de débogage de flex pour m'assurer qu'il est correctement segmenté. Malheureusement, je suis toujours confronté à l'un des deux problèmes suivants: soit le programme généré par flex arrête tout simplement après deux jetons, soit la règle que j'utilise pour reconnaître les caractères et les chaînes n'est pas appelée et la règle par défaut est appelé à la place.lex (flex) le programme généré n'analyse pas l'entrée entière
Quelqu'un peut-il me diriger dans la bonne direction? J'ai attaché mon dossier flexible et échantillon d'entrée/sortie. Edit: J'ai trouvé que le lexer généré s'arrête après une règle spécifique: "cdr". C'est plus détaillé, mais aussi beaucoup plus déroutant. J'ai posté un fichier lex modifié en court-circuit.
/* lex file*/
%option noyywrap
%option nodefault
%{
enum tokens{
CDR,
CHARACTER,
SET
};
%}
%%
"cdr" { return CDR; }
"set" { return SET; }
[ \t\r\n] /*Nothing*/
[a-zA-Z0-9\\[email protected]#$%^&*()\-_+=~`:;"'?<>,\.] { return CHARACTER; }
%%
entrée de l'échantillon:
set c cdra + cdr b +() ;
sortie complète de l'exécution de l'entrée par l'analyseur généré:
--(end of buffer or a NUL)
--accepting rule at line 16 ("set")
--accepting rule at line 18 (" ")
--accepting rule at line 19 ("c")
--accepting rule at line 18 (" ")
--accepting rule at line 15 ("cdr")
Toute pensée? Le programme généré abandonne après la moitié de l'entrée! (pour référence, je fais une entrée en redirigeant le contenu d'un fichier vers le programme généré).
fixe les crochets ne correspondent pas, mais pas de chance. Cependant, j'ai réussi à dupliquer le problème avec un ensemble de règles plus court. – Zxaos
Pour répondre à la façon dont lex réagirait, il échouerait simplement la règle et s'arrêterait. Étant donné que les crochets ne correspondent jamais, une règle valide n'est jamais indiquée. (le 9 * agira juste sur le 9, et ne blesse pas trop le programme) – Stegosaurus