2

このようなマシンでは:

メイン := (任意の +);

1 バイトを超えるデータのチャンクをフィードすると、%%write exec ブロックから (通常は) 出る前に 1 バイトしか消費しないようです。貪欲で、提供されたすべての入力を消費することを期待しています。

私はいつでも p < pe をチェックして %%write exec の前に移動できますが、それはハックのようです。

どうすればそれを「貪欲」にできますか?

4

1 に答える 1

3

あなたの質問にはいくつかの重要なデータが欠けているかもしれませんが、デフォルトの動作は可能な限りすべてを消費するpeことです。Ragel 6.9 とこの単純なプログラムがあれば、明らかにあなたのマシンで可能です。

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>

%%{
        machine main;
        alphtype char;

        main := (any+);
}%%

int main()
{
        static char data[] = "Some string!";
        int cs;
        char *p, *pe, *eof;

        %% write data;

        %% write init;
        p = data;
        pe = data + sizeof(data);
        eof = pe;

        printf("p: 0x%"PRIxPTR", pe: 0x%"PRIxPTR", eof: 0x%"PRIxPTR"\n",
               (uintptr_t) p, (uintptr_t) pe, (uintptr_t) eof);

        %% write exec;

        printf("p: 0x%"PRIxPTR", pe: 0x%"PRIxPTR", eof: 0x%"PRIxPTR"\n",
               (uintptr_t) p, (uintptr_t) pe, (uintptr_t) eof);
        return 0;
}

次のような出力が得られるはずです。

p: 0x601038, pe: 0x601045, eof: 0x601045
p: 0x601045, pe: 0x601045, eof: 0x601045
于 2016-11-18T20:38:20.310 に答える