2013-05-22 3 views
2

Я работаю с грамматикой, использующей сторонний синтаксический анализ (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.

+2

Я предполагаю, что вы спрашиваете: «Как я могу делать то, что хочу, без этого?», О котором я не знаю ответа. Но если вы спрашиваете, что означает ошибка, то это в руководстве Flex. «« перетаскивание с помощью гибкого сканера »: вы использовали unput(), чтобы отбросить столько текста, что буфер сканера не смог удерживать как текст с отточенным назад, так и текущий токен в yytext. В идеале сканер должен динамически изменять размер буфера в этот случай, но в настоящее время он этого не делает ». –

ответ

0

(Answered in the comments)

@Malcolm Роу писал:

I assume what you're asking is "how do I do what I want without it failing?", which I don't know the answer to. But if you're asking what the error means, it's in the Flex manual. "‘flex scanner push-back overflow’: you used unput() to push back so much text that the scanner's buffer could not hold both the pushed-back text and the current token in yytext. Ideally the scanner should dynamically resize the buffer in this case, but at present it does not."

Как вы работаете в системных ограничений, я подозреваю, что это так хорошо, ответ, как можно сделать в данный момент.

-1

Проверьте, нет ли у вас рекурсивного определения любого токена в файле Lex. Ошибка просто предполагает, что встроенный буфер lex не может удерживать выражения токенов. Вы получаете ошибку при компиляции своего парсера?

+0

Нет, нет. См. Комментарий @ MalcolmRowe. – EJP

+0

Да, я дал вам одну из возможностей. Комментарий, который вы говорите, абсолютно прав, но это просто объяснение не решение. Это то, что я использовал для решения своей проблемы. Я понимаю, что может быть множество причин для не выделение буфера автоматически. –

0

Трудно сказать, без кода, но моя интуиция указывает на <<EOF>> правило: когда

(indent_stack.top() > 0) 

Вы unput -ную в бесконечном цикле: EOF всегда остается правдой, и НАЧАТЬ (wrap) (wrap является включенным начальным условием без <<EOF>>), кажется, ничего не делает в этом контексте.

Есть очень легко иметь бесконечные циклы в правилах <<EOF>>, когда у нас есть ветви без предложений yyterminate, yyaccept, return or like.

Смежные вопросы