6

私は Ragel と協力して FSA を評価しており、マシンが入力のテストを終了するたびに実行されるユーザー アクションを埋め込みたいと考えています。マシンが受け入れ状態で終了するかどうかに関係なく、このアクションを実行する必要があります。私が何をしようとしているのかを説明する Ragel ガイドから取られたこの変更された例があります。

#include <string.h>
#include <stdio.h>

%%{
    machine foo;
    main := ( 'foo' | 'bar' ) 0 @{ res = 1; } $/{ finished = 1; };
}%%
%% write data;
int main( int argc, char **argv ) {
    int cs, res = 0, finished = 0;
    if ( argc > 1 ) {
        char *p = argv[1];
        char *pe = p + strlen(p) + 1;
        char* eof = pe;
        %% write init;
        %% write exec;
    }

    printf("result = %i\n", res );
    printf("finished = %i\n", finished);

    return 0;
}

この例の私の目標は、入力が 'foo' または 'bar' の場合に res が 1 になるようにすることです。一方、finished は入力に関係なく 1 になります。ただし、これを機能させることはできません-resが1の場合は1、resが0の場合は0のようです。

どんな助けでも素晴らしいでしょう。

4

2 に答える 2

1

これを試して:

main := ( 
    'foo' 0 @2 @{ res = 1; } | 
    'bar' 0 @2 @{ res = 1; } |
    any*
    ) @{ finished = 1; };
于 2013-06-06T11:15:23.993 に答える