1

重複の可能性:
Lex&Yacc(Solaris)でYY_INPUTがstdinではなく文字列を指すようにする方法

ファイルではなく文字列から解析したい。私はvがyy_scan_stringfnを使用してそれを行うことができることを知っていますが、私にとっては正しく機能していないので、plsは私を助けます

4

1 に答える 1

5

私はごく最近、この問題を自分で解決しました。この件に関する flex のドキュメントには、少し物足りないところがあります。

あなたをつまずかせている可能性のある2つのことがすぐにわかります。まず、文字列は二重 NULL で終了する必要があることに注意してください。つまり、NULL で終了する通常の文字列を取得し、その末尾に別の NULL ターミネータを追加する必要があります。その事実はフレックスのドキュメントに埋もれており、見つけるのにも時間がかかりました。

次に、「yy_switch_to_buffer」への呼び出しを中断しました。これは、ドキュメントからも特に明確ではありません。コードを次のように変更すると、動作するはずです。

// add the second NULL terminator
int len = strlen(my_string);
char *temp = new char[ len + 2 ];
strcpy( temp, my_string );
temp[ len + 1 ] = 0; // The first NULL terminator is added by strcpy

YY_BUFFER_STATE my_string_buffer = yy_scan_string(temp); 
yy_switch_to_buffer( my_string_buffer ); // switch flex to the buffer we just created
yyparse(); 
yy_delete_buffer(my_string_buffer );
于 2009-12-15T19:41:39.753 に答える