我不知道ragel是如何从文件中读取源代码的。我看到的所有示例都是从stdin中读取的。
你能用C语言给我看一个与Ragel接口的例子吗?在这个例子中,程序不能从标准中读取。
发布于 2013-05-06 20:37:16
Ragel希望一些变量在作用域内,并指向它正在扫描的缓冲区的各个重要部分。您可以了解它期望它们被调用什么,以及如何在Ragel User Guide中更改它们。第5节,主机程序的接口,是你的好朋友。
手册中的一个示例在第一个参数上运行扫描程序:
#include <stdio.h>
#include <string.h>
%%{
machine foo;
write data;
}%%
int main( int argc, char **argv )
{
int cs;
if ( argc > 1 ) {
char *p = argv[1];
char *pe = p + strlen( p );
%%{
main := [0-9]+ ( '.' [0-9]+ )?;
write init;
write exec;
}%%
}
printf("result = %i\n", cs >= foo_first_final );
return 0;
}基本上,cs保存机器的状态,p和pe分别指向缓冲区的开始和结束。
手册中的定义如下:
·cs -当前状态。这必须是一个整数,并且当数据被分解成独立处理的块时,它应该在机器的调用中保持不变。此变量可以从执行循环外部修改,但不能从内部修改。
·p-数据指针。在C/D代码中,这个变量应该是指向要处理的字符数据的指针。每次运行机器时,应将其初始化为数据块的开头。在Go,Java和Ruby中,它被用作oset to data,并且必须是一个整数。在这种情况下,应该在机器每次运行时将其初始化为零。
·pe数据结束指针。每次运行机器时,应将其初始化为p加上数据长度。在Go,Java和Ruby代码中,这应该被初始化为数据长度。
·eof -文件指针的结尾。当正在处理的buer块是最后一个时,应将其设置为pe,否则应将其设置为null。在Go中,必须使用Java和Ruby代码-1而不是null。如果仅在处理nal缓冲器块之后才知道EOF事件,则可以设置p= pe = eof并运行execute块。
·data -只有在Go,Java和Ruby代码中才需要这个变量。它必须是包含要处理的数据的数组。
·stack -这必须是一个整数数组。它用于存储表示状态的整数值。如果堆栈必须动态调整大小,可以使用Pre-push和Post-Pop语句来实现( 5.6和5.7节)。
·top -这必须是一个整数值,并将用作堆栈的oset,提供堆栈顶部的下一个可用点。
·act -必须是整数值。它是扫描器代码有时用来跟踪最近成功的模式匹配的变量。
·ts -这必须是指向字符数据的指针。在Go、Java和Ruby代码中,这必须是一个整数。有关更多信息,请参阅第6.3节。
https://stackoverflow.com/questions/16398828
复制相似问题