首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ragel如何从文件中读取源文件?

ragel如何从文件中读取源文件?
EN

Stack Overflow用户
提问于 2013-05-06 20:31:04
回答 1查看 452关注 0票数 2

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

你能用C语言给我看一个与Ragel接口的例子吗?在这个例子中,程序不能从标准中读取。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-06 20:37:16

Ragel希望一些变量在作用域内,并指向它正在扫描的缓冲区的各个重要部分。您可以了解它期望它们被调用什么,以及如何在Ragel User Guide中更改它们。第5节,主机程序的接口,是你的好朋友。

手册中的一个示例在第一个参数上运行扫描程序:

代码语言:javascript
复制
#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 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节。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16398828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档