Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ragel如何从文件中读取源代码?_C_Ragel - Fatal编程技术网

C ragel如何从文件中读取源代码?

C ragel如何从文件中读取源代码?,c,ragel,C,Ragel,我不知道ragel是如何从文件中读取源代码的。我看到的所有例子都是从stdin读来的 请给我举一个C语言与Ragel接口的例子,其中程序不从标准中读取?Ragel希望一些变量在范围内,并指向它正在扫描的缓冲区的各个重要部分。您可以了解它希望它们被调用什么,以及如何在中更改它们。第5节,宿主程序的接口,是你们的朋友 在第一个参数上运行扫描仪的手册示例: #include <stdio.h> #include <string.h> %%{ machine foo;

我不知道ragel是如何从文件中读取源代码的。我看到的所有例子都是从stdin读来的


请给我举一个C语言与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;
}
#包括
#包括
%%{
美孚;
写入数据;
}%%
int main(int argc,字符**argv)
{
int cs;
如果(argc>1){
char*p=argv[1];
char*pe=p+strlen(p);
%%{
main:=[0-9]+('.[0-9]+)?;
写初始化;
写exec;
}%%
}
printf(“结果=%i\n”,cs>=foo\u first\u final);
返回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。如果EOF事件只能在nal buer块被删除后才能知道 已处理,则可以设置p=pe=eof并运行执行块

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

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

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

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

•ts-这必须是指向字符数据的指针。在Go、Java和Ruby代码中,这必须是 整数。详见第6.3节