2015-12-21 44 views
0

我正在写我的第一个Ragel程序。我的目标是编写一个四功能计算器。请不要将您的代码发送给我。这是为了我的学习体验。我的第一杯Ragel

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

/* 
* 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; 
} 

回答

0

您还没有设置与您试图解析内容字符* P缓冲区。这就是为什么你的测试没有输出。

Ragel需要知道解析数据的位置。的char * p必须指向的数据来分析在6网上的第一个例子页指出documentation

0

你不仅需要设置p指向你的缓冲区的开始,但你也应该指向peeof到它的结尾。此代码应覆盖它,长度分配之后:

p = string; 
pe = string + length - 1; 
eof = pe; 

注:acttste不应该需要在这种情况下,由于这些变量仅用于扫描仪。