Ich versuche, eine bekannte Anzahl (zur Laufzeit) von Zeichen in einem Flex-Lexer zu lesen. Ich weiß, dass es mit einer CRLF beginnt, also passe ich das an, dann lese literal_length Zeichen mit yyinput.Wie kann ich verhindern, dass Flex yyinput-Zeichen verwirft?
<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);
}
Aber yyinput nicht die neuen Charaktere hinzufügen, sondern es enthält:
*yy_c_buf_p = '\0'; /* preserve yytext */
yy_hold_char = *++yy_c_buf_p;
was bedeutet, dass yytext nicht die zusätzlichen literal_length Zeichen nicht erhalten. Ich würde lieber keinen neuen Puffer erstellen, um sie zu speichern, wenn ich es vermeiden kann, weil ich weiß, dass die Zeichenfolge bereits im Speicher ist.
Abgesehen davon, dass yyinput() völlig neu definiert wird, gibt es eine Möglichkeit, die zusätzlichen Zeichen in yytext zu behalten?
Danke für die Informationen Simon. Aber ich kann keine Übereinstimmung für eine genaue Anzahl von Zeichen erstellen, die bis zur Laufzeit nicht bekannt ist. Ich weiß, dass die Zeichen gelesen werden, weil der Aufruf von yyinput() bewirkt, dass sie gelesen werden. Wir können feststellen, ob EOF vor der erwarteten Anzahl von Zeichen auftritt, und YYINPUT kann warten, wenn sie noch nicht bereit sind. So ist bekannt, dass die Charaktere da sind. Ich könnte yyinput() umschreiben, um die eingehenden Zeichen NICHT zu zerstören, aber da dies durch die Frage ausgeschlossen ist, akzeptiere ich deine Antwort als "nein". – Roderick
@Roderick, das ist, was der Stern tut. Die '[0-9]' entspricht einer beliebigen ASCII-Ziffer, der Stern wiederholt diese Übereinstimmung. 'yyleng' sagt Ihnen dann, wie viele Zeichen übereinstimmen. –
Ein Sternchen erhält alle Zeichen, die es kann. Die Frage war, "literal_length" -Zeichen zu bekommen, und nur so viele. – Roderick