Я работаю с грамматикой, использующей сторонний синтаксический анализ (iow: Tabs как разделители блоков). В грамматике используется отступы, чтобы отслеживать вложенные блоки и пытается обернуть блоки соответствующими маркерами закрытия, когда встречается EOF.Flex grammar производит ошибку: переполнение переполнения сканера
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(...)
.
Однако, когда я пытаюсь ввести строку ввода: state = yy_scan_string(...)
, первый звонок yylex
вылетает с ошибкой flex scanner push-back overflow
.
Я предполагаю, что вы спрашиваете: «Как я могу делать то, что хочу, без этого?», О котором я не знаю ответа. Но если вы спрашиваете, что означает ошибка, то это в руководстве Flex. «« перетаскивание с помощью гибкого сканера »: вы использовали unput(), чтобы отбросить столько текста, что буфер сканера не смог удерживать как текст с отточенным назад, так и текущий токен в yytext. В идеале сканер должен динамически изменять размер буфера в этот случай, но в настоящее время он этого не делает ». –