2017-09-01 6 views
0

すでに完全に機能しているパーサーをクライアント提供のテキストバッファから読み込むように変更しています。 yyscan_bytes()を使用してバッファをロードします。残念ながら、これは、この(ロング既存)のFlexルールに既存の文法を使用して致命的なエラーにつながる:yyscan_bytes()でテキストを読み込むときにflex/bisonスキャナがunput()で失敗する

.|"\n"     { BEGIN INIT; unput(yytext[0]); } 

私は任意の入力を解析し、unput()は常に失敗したときにこのルールは最初の一撃であります「フレックススキャナプッシュバックオーバーフロー」エラーが発生します。私はこの万能ルールが何をしているのかよく分かっていませんが、それを取り除くと、すべてが他の方法で失敗する原因になります。どんなアイデアや啓蒙も感謝します。

答えて

1

このアクションは、無条件に開始条件をINITに設定します。 (実際には無条件ではありませんが、入力には少なくとも1バイトが必要ですが、それ以外の場合はEOFアクションが実行されます)。

unput(yytext[0]);しかし、unput(yytext[0]);は本当に良いアイデアです。それは動作しません少し驚いた。 yyless(0);の方がはるかに優れていますが、この場合はまったく同じことを行います(異なる開始条件でスキャンされたキャラクタが再スキャンされるように手配します)。特に、入力バッファを変更する必要はないので、unputと同じ方法で失敗することはありません。

unputの問題は、現在のバッファが正確に入力を保持するのに必要なサイズであるため、現在のバッファで消費されていない入力を再配置できないようです。しかし、それがなぜ入力を再配置する必要があると感じるのかはわかりません。

関連する問題