我不知道ragel如何从文件中读取源代码。我见过的所有例子都是从stdin读取的。
请你能告诉我一个C语言与Ragel连接的例子吗?程序没有从标准中读取?
答案 0 :(得分:3)
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,必须是整数。在 在这种情况下,它应该在每次运行机器时初始化为零。
•pe - 数据结束指针。这应该初始化为p加上每次运行时的数据长度 机器。在Go,Java和Ruby代码中,这应该初始化为数据长度。
•eof - 文件结束指针。当正在处理的buer块是时,应将其设置为pe 最后一个,否则应该设置为null。在Go中,必须使用Java和Ruby代码-1 而不是null。如果只有在nal buer块之后才能知道EOF事件 处理后,可以设置p = pe = eof并运行执行块。
•data - 仅在Go,Java和Ruby代码中需要此变量。它必须是一个数组 包含要处理的数据。
•stack - 这必须是整数数组。它用于存储表示的整数值 状态。如果堆栈必须动态调整大小,则Pre-push和Post-Pop语句可以 过去这样做(第5.6和5.7节)。
•top - 这必须是一个整数值,并将用作堆叠的oset,给出下一个 堆栈顶部的可用位置。
•act - 必须是整数值。它是扫描仪代码有时使用的变量 跟踪最近成功的模式匹配。
•ts - 这必须是指向字符数据的指针。在Go,Java和Ruby代码中,这必须是一个 整数。有关更多信息,请参见第6.3节。