gpt4 book ai didi

c - 如何让 Ragel EOF Action 起作用

转载 作者:太空狗 更新时间:2023-10-29 17:24:23 25 4
gpt4 key购买 nike

我正在与 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 时,finished 似乎为 1,当 res 为 0 时,finished 似乎为 0。

任何帮助都会很棒。

最佳答案

eof Action 将在 p == pe == eof 时发生。另一件重要的事情是,当你的状态机无法匹配任何状态时,状态将出错并且匹配将停止,这意味着你永远无法走到尽头。

让我们看看您何时输入 foo1。解析为o时,一切正常。但是下一个字符 1 无法匹配您指定的任何状态,因此会发生错误。您永远无法满足 eof 操作。所以变量 resfinish 都是 0。

当您输入foo 时,一切正常。状态可以走到最后。所以 eof Action 发生了。

您可以设置错误操作以查看会发生什么:

%%{
main := ( 'foo' | 'bar' ) 0 @{ res = 1; } $err{ printf("error : %c", fc);} $/{ finished = 1; };
}%%

您可以尝试使用此代码来满足您的需求:

%%{
main := (( 'foo' | 'bar' ) 0 @{ res = 1; } | any* ) $/{ finished = 1; };
}%%

关于c - 如何让 Ragel EOF Action 起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16273205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com