J'essaie de lire un nombre connu (à l'exécution) de caractères dans une Lex Flex. Je sais que cela commence avec un CRLF, donc je fais correspondre cela, puis lire les caractères literal_length en utilisant yyinput.Comment puis-je empêcher Flex de rejeter les caractères yyinput?
<EXPECT_LITERAL>"\r\n" {
for(int i=0;i<literal_length;i++){
int c= yyinput(yyg);
if(c == EOF) break;
}
*yylval = val_new_s(yytext);
return(LITERAL);
}
Mais yyinput n'ajoute pas les nouveaux personnages, au lieu qu'il contient:
*yy_c_buf_p = '\0'; /* preserve yytext */
yy_hold_char = *++yy_c_buf_p;
ce qui signifie que yytext ne reçoivent pas les caractères literal_length supplémentaires. Je préfère ne pas créer un nouveau tampon pour les stocker si je peux l'éviter, car je sais que la séquence de caractères est déjà en mémoire. En plus de redéfinir complètement yyinput(), y a-t-il un moyen de conserver les caractères supplémentaires dans yytext?
Merci pour l'information Simon. Mais je ne peux pas créer une correspondance pour un nombre exact de caractères qui n'est pas connu avant l'exécution. Je sais que les caractères sont lus car l'appel à yyinput() les fait lire. Nous pouvons détecter si EOF se produit avant le nombre attendu de caractères, et YYINPUT peut être fait pour attendre s'ils ne sont pas encore prêts. Donc, il est connu que les personnages sont là. Je pourrais réécrire yyinput() pour ne pas détruire les caractères entrants, mais comme cela est exclu par la question, j'accepterai votre réponse comme un "non". – Roderick
@Roderick, c'est ce que fait l'astérisque. Le '[0-9]' correspond à n'importe quel chiffre ASCII, l'astérisque répète cette correspondance. 'yyleng' vous indique alors combien de caractères ont correspondu. –
Un astérisque obtient tous les caractères qu'il peut. La question était d'obtenir des caractères "literal_length", et seulement ce nombre. – Roderick