我正在使用一种使用反面解析的语法(iow:制表符作为块分隔符)。该语法使用缩进堆栈来跟踪嵌套块,并在遇到 EOF 时尝试使用适当的关闭标记来包装块。
std::stack<int> indent_stack;
int indent_size;
%x indent
%s normal
%s wrap
%%
<wrap>[ ] {
if(indent_stack.top() > 0)
{
indent_stack.pop();
if(indent_stack.top() > 0) unput(' ');
return DEDENT;
}
else
yyterminate();
}
<<EOF>> {
if(indent_stack.top() > 0)
{
BEGIN(wrap);
unput(' ');
}
else
yyterminate();
}
<indent>[\t] {indent_size++;}
<indent>[\n] {indent_size = 0;}
<indent>. {
unput(*yytext);
if(indent_size > indent_stack.top())
{
indent_stack.push(indent_size);
yytext[0] = '\0';
return INDENT;
}
else if(indent_size < indent_stack.top())
{
indent_stack.pop();
yytext[0] = '\0';
return DEDENT;
}
else
{
BEGIN(normal);
}
}
/* And so begin <normal> rules. */
乍一看,这种语法似乎在对输入文件进行词法分析时起作用:yyin = fopen(...)
.
但是,当我尝试对输入字符串进行 lex 时state = yy_scan_string(...)
,第一次调用会因yylex
错误而崩溃flex scanner push-back overflow
。