使用 Ragel 解析器捕获字段

标签 c parsing lexical-analysis ragel

我正在考虑使用 Ragel 为嵌入式系统中的 NMEA GPS 数据生成词法分析器。我将有一个任意大小的缓冲区,我可以从 UART 读取数据 block ,并且对于每次读取,我都会将该数据传递到词法分析器中。

我希望能够提取特定字段,但问题是我无法保证整个字段都存在于数据 block 中。任何字段都可能被拆分为两次读取,因此将指针设置为字段的开头和结尾可能会将起始指针保留在前一个(现已覆盖)缓冲区的末尾,并将结束指针保留在其之前。

我想到的一个解决方案是在每个字段上使用“$”操作将字符逐个插入另一位内存(可能是结构体字段)。这是最好的方法吗?

最佳答案

无论如何,我最终得到了这个:

%%{
    machine nmea;

    action store { *wptr = fc; }
    action append { *wptr++ = fc; }
    action term { *wptr++ = 0; }

    integer = digit+;
    float = digit+ '.' digit+;

    rmc = '$GPRMC,'
        float ','
        [AV] >{ wptr = &loc.valid; } $store ','
        float? >{ wptr = loc.lat; } $append %term ','
        [NS]? >{ wptr = &loc.ns; } $store ','
        float? >{ wptr = loc.lng; } $append %term ','
        [EW]? >{ wptr = &loc.ew; } $store
        print*
        '\n' >{ printf("%c, %s, %c, %s, %c\n", loc.valid, loc.lat, loc.ns, loc.lng, loc.ew); }
    ;

    main := any* rmc;
}%%

关于使用 Ragel 解析器捕获字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20230689/

相关文章:

c - C语言通过串口向gprs写入命令

java - 我使用什么简单的数据库解决方案将解析的变量从 eclipse 提取到数据库

escaping - 词法分析器如何处理注释和转义序列?

c - 您如何解析上下文相关的 C 代码?

与 malloc 混淆。创建具有 4 个槽的字符串数组

更改 C 中的结构/变量内容

parsing - 从生成的解析表中检索语法规则

objective-c - 无法在 NSManagedObject 类 'building' 上调用指定的初始值设定项

java - 验证表达式

c - 将 char 数组分配给传递给函数的引用