我正在尝试读取Flex词法分析器中字符的已知数字(在运行时)。我知道它以CRLF开头,所以我匹配,然后使用yyinput读取literal_length字符。如何防止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中的额外字符?
感谢信息西蒙。但是我无法创建一个匹配,直到运行时才知道确切数量的字符。 我知道这些字符被读取,因为调用yyinput()会导致它们被读取。我们可以在预期字符数之前检测EOF是否发生,如果YYINPUT尚未准备好,可以等待YYINPUT等待。所以人们知道这些角色在那里。 我可以重写yyinput()以不销毁传入的字符,但由于这个问题被排除在外,我会接受你的答案为“否”。 – Roderick
@Roderick,这就是星号所做的。 '[0-9]'匹配任何ASCII数字,星号重复匹配。 'yyleng'然后告诉你有多少个字符匹配。 –
星号获取所有可能的字符。问题是获得“literal_length”字符,并且只有那么多。 – Roderick