flex lexer への文字列入力

次のルーチンは、ファイルの代わりにメモリ内文字列をスキャンするための入力バッファを設定するために使用できます (yy_create_buffer が行うように):

  • YY_BUFFER_STATE yy_scan_string(const char *str) :NUL で終わる文字列をスキャンします`
  • YY_BUFFER_STATE yy_scan_bytes(const char *bytes, int len) :location バイトから始まる len バイト (場合によっては NUL を含む) をスキャンします

これらの関数は両方とも対応する YY_BUFFER_STATE ハンドルを作成して返すことに注意してください (処理が終わったら yy_delete_buffer() で削除する必要があります)。そのため、yylex() は文字列またはバイトのコピーをスキャンします。 yylex() はスキャンしているバッファーの内容を変更するため、この動作は望ましい場合があります)。

コピー (および yy_delete_buffer) を回避したい場合:

  • YY_BUFFER_STATE yy_scan_buffer(char *base, yy_size_t size)

サンプルメイン:

int main() {
    yy_scan_buffer("a test string");
    yylex();
}

文字列などのメモリ内バッファをスキャンする方法については、Flex のマニュアルのこのセクションを参照してください。


フレックス char * を解析できます 次の 3 つの関数のいずれかを使用:yy_scan_string() ,yy_scan_buffer() 、および yy_scan_bytes() (ドキュメントを参照してください)。これが最初の例です:

typedef struct yy_buffer_state * YY_BUFFER_STATE;
extern int yyparse();
extern YY_BUFFER_STATE yy_scan_string(char * str);
extern void yy_delete_buffer(YY_BUFFER_STATE buffer);

int main(){
    char string[] = "String to be parsed.";
    YY_BUFFER_STATE buffer = yy_scan_string(string);
    yyparse();
    yy_delete_buffer(buffer);
    return 0;
}

yy_scan_buffer() の同等のステートメント (二重にヌルで終わる文字列が必要です):

char string[] = "String to be parsed.\0";
YY_BUFFER_STATE buffer = yy_scan_buffer(string, sizeof(string));

私の回答は、@dfa と @jlholland から提供された情報の一部を繰り返していますが、どちらの回答のコードも機能していないようです。