3

私は、オフサイドの解析を使用する文法を使用しています (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

4

4 に答える 4

1

コードなしで言うのは難しいですが、私の直感は次の <<EOF>>ルールを示しています。

(indent_stack.top() > 0)

You are unput-ing in a ininfinite cycle:EOFは常に true のままであり、BEGIN(wrap) (wrap は no のない包括的な開始条件です<<EOF>>) は、そのコンテキストでは何もしていないように見えます。

<<EOF>>yyterminate、yyaccept、return などの句を持たない分岐がある場合、ルールに無限の循環を持たせるのは非常に簡単です。

于 2015-02-21T00:03:54.343 に答える
-2

Lex ファイルにトークンの再帰定義があるかどうかを確認してください。このエラーは、lex 組み込みバッファーがトークン式を保持できないことを示しています。パーサーのコンパイル中にエラーが発生しましたか?

于 2015-02-19T21:05:54.567 に答える