首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让Ragel EOF操作正常工作

如何让Ragel EOF操作正常工作
EN

Stack Overflow用户
提问于 2013-04-29 15:21:31
回答 2查看 1.2K关注 0票数 6

我正在使用Ragel来评估FSA,并且我想嵌入一个用户操作,该操作在我的机器完成输入测试时运行。无论机器是否在接受状态下结束,我都需要这个操作运行。我有一个取自Ragel指南的修改后的例子,它说明了我要做的事情:

代码语言:javascript
复制
#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时,finished似乎是1,而当res为0时,它似乎是0。

任何帮助都是很棒的。

EN

回答 2

Stack Overflow用户

发布于 2013-06-09 19:05:41

eof操作将在p == pe == eof时发生。另一件重要的事情是,当您的状态机不能匹配任何状态时,状态将转到error,匹配将停止,这意味着您永远不能进入末尾。

让我们看看什么时候输入foo1。当解析到o时,一切正常。但是,下一个字符1不能匹配您指定的任何状态,因此出现错误。你永远不会遇到eof行动。所以变量resfinish都是0。

当你输入foo时,一切都是正常的。状态可以走到尽头。所以发生了eof操作。

您可以设置错误操作以查看发生的情况:

代码语言:javascript
复制
%%{
    main := ( 'foo' | 'bar' ) 0 @{ res = 1; } $err{ printf("error : %c", fc);} $/{ finished = 1; };
}%%

您可以尝试以下代码来满足您的需求:

代码语言:javascript
复制
%%{
    main := (( 'foo' | 'bar' ) 0 @{ res = 1; } | any* ) $/{ finished = 1; };
}%%
票数 3
EN

Stack Overflow用户

发布于 2013-06-06 19:15:24

试试这个:

代码语言:javascript
复制
main := ( 
    'foo' 0 @2 @{ res = 1; } | 
    'bar' 0 @2 @{ res = 1; } |
    any*
    ) @{ finished = 1; };
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16273205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档