Я пытаюсь прочитать известное число (во время выполнения) символов в Flex lexer. Я знаю, что он начинается с CRLF, поэтому я сопоставляю это, а затем читаю символы literal_length, используя yyinput.Как я могу запретить Flex отбрасывать 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);
}
Но yyinput не добавляет новые символы, вместо этого он содержит:
*yy_c_buf_p = '\0'; /* preserve yytext */
yy_hold_char = *++yy_c_buf_p;
, что означает, что yytext не получает дополнительных символов literal_length. Я бы предпочел не создавать новый буфер для их хранения, если я могу его избежать, потому что я знаю, что последовательность символов уже находится в памяти.
Помимо полного переопределения yyinput(), есть ли способ сохранить дополнительные символы в yytext?
Спасибо за информацию Simon. Но я не могу создать соответствие для точного количества символов, которые неизвестны до выполнения. Я знаю, что символы читаются, потому что вызов yyinput() заставляет их читать. Мы можем определить, произойдет ли EOF до ожидаемого количества символов, и YYINPUT можно заставить ждать, если они еще не готовы. Так что известно, что персонажи есть. Я мог бы переписать yyinput(), чтобы НЕ уничтожить входящие символы, но поскольку это исключено вопросом, я приму ваш ответ как «нет». – Roderick
@ Roderick, вот что делает звездочка. '[0-9]' соответствует любой цифре ASCII, звездочка повторяет это совпадение. 'yyleng' затем сообщает вам, сколько символов совпало. –
Звездочка получает все символы, которые она может. Вопрос состоял в том, чтобы получить символы «literal_length», и только многие. – Roderick