2

我不知道 ragel 如何从文件中读取源代码。我看到的所有示例都是从标准输入读取的。

请您给我看一个与 Ragel 接口的 C 语言示例,其中程序不从标准中读取?

4

1 回答 1

3

Ragel 期望一些变量在范围内并指向它正在扫描的缓冲区的各个重要部分。您可以在Ragel 用户指南中找到它期望它们被调用的内容以及如何更改它们。第 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保存机器的状态,ppe分别指向缓冲区的开始和结束。

手册中的定义:

• cs - 当前状态。这必须是一个整数,并且当数据被分成独立处理的块时,它应该在机器的调用中保持不变。此变量可以从执行循环外部修改,但不能从内部修改。

• p - 数据指针。在 C/D 代码中,这个变量应该是一个指向要处理的字符数据的指针。它应该在机器的每次运行时初始化为数据块的开头。在 Go、Java 和 Ruby 中,它用作数据的 oset,并且必须是整数。在这种情况下,它应该在机器的每次运行时初始化为零。

• pe - 数据结束指针。这应该初始化为 p 加上机器每次运行的数据长度。在 Go、Java 和 Ruby 代码中,这应该初始化为数据长度。

• eof - 文件结束指针。当正在处理的 buer 块是最后一个时,应设置为 pe,否则应设置为 null。在 Go 中,必须使用 Java 和 Ruby 代码 -1 而不是 null。如果只有在处理完最终的缓冲区块后才能知道 EOF 事件,则可以设置 p = pe = eof 并运行执行块。

• 数据——该变量仅在 Go、Java 和 Ruby 代码中是必需的。它必须是一个包含要处理的数据的数组。

• stack - 这必须是一个整数数组。它用于存储表示状态的整数值。如果堆栈必须动态调整大小,可以使用 Pre-push 和 Post-Pop 语句来执行此操作(第 5.6 和 5.7 节)。

• top - 这必须是一个整数值,并将用作堆栈的 oset,给出堆栈顶部的下一个可用位置。

• act - 这必须是一个整数值。它是扫描仪代码有时用来跟踪最近成功的模式匹配的变量。

• ts - 这必须是指向字符数据的指针。在 Go、Java 和 Ruby 代码中,这必须是整数。有关详细信息,请参阅第 6.3 节。

于 2013-05-06T12:37:16.093 回答