如何让Ragel EOF动作起作用

Mar*_*ark 6 c finite-automata state-machine ragel

我正在与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;
}
Run Code Online (Sandbox Code Playgroud)

我的这个例子的目标是当输入为'foo'或'bar'时res为1,而无论输入如何,finish为1.我不能让它工作 - 当res为1时,完成似乎为1,当res为0时,则为0.

任何帮助都是极好的.

小智 1

尝试这个:

main := ( 
    'foo' 0 @2 @{ res = 1; } | 
    'bar' 0 @2 @{ res = 1; } |
    any*
    ) @{ finished = 1; };
Run Code Online (Sandbox Code Playgroud)