首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的第一杯Ragel

我的第一杯Ragel
EN

Stack Overflow用户
提问于 2015-12-22 06:44:34
回答 2查看 264关注 0票数 0

我正在写我的第一个Ragel程序。我的目标是写一个四函数计算器。请不要把你的代码发给我。对我来说,这是一次学习的经历。

我想要做的是匹配一个正则表达式和一个浮点数,并打印值。Ragel程序和C/CPP代码会进行编译,但我的返回值始终为零,并且不会执行print语句。下面是我的代码。我做错了什么?

代码语言:javascript
复制
/*
 * This is a four function calculator.
 */

#include <string.h>
#include <stdio.h>
#include <stdlib.h>


%%{
    machine calculator; 
    write data;
}%%

float calculator(char* string)
{
    int cs;
    char* p;
    char* pe;
    char* eof;
    int act;
    char* ts;
    char* te; 

    float value;
    int length;

    length = strlen(string);
    string[length -1] = 0;


    %%{ 
        action get_value {
            value =  atof(string);
        }

        action cmd_err {
            printf("Error\n");
            fhold;
        }

        main := ([0-9])@get_value;

        # Initialize and execute.
        write init;
        write exec;
    }%%

    return value;
};

#define BUFSIZE 1024

int main()
{
    char buf[BUFSIZE];
    float val;
    val = 0.0;

    while ( fgets( buf, sizeof(buf), stdin ) != 0 ) {
        val = calculator( buf );
        printf( "%f\n", val );
    }
    return 0;
}
EN

回答 2

Stack Overflow用户

发布于 2015-12-26 00:18:02

您没有使用要解析的内容设置char *p缓冲区。这就是你的测试没有输出的原因。

Ragel需要知道要解析的数据位于何处。char *p必须指向要分析的数据,如online documentation的第一个示例第6页所述

票数 0
EN

Stack Overflow用户

发布于 2016-01-05 11:05:11

您不仅需要将p设置为指向缓冲区的开头,还应该将peeof指向缓冲区的末尾。此代码应在分配长度后立即涵盖它:

代码语言:javascript
复制
p = string;
pe = string + length - 1;
eof = pe;

注意:在这种情况下不需要acttste,因为这些变量只用于扫描仪。

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

https://stackoverflow.com/questions/34405613

复制
相关文章

相似问题

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