我正在写我的第一个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;
}发布于 2015-12-26 00:18:02
您没有使用要解析的内容设置char *p缓冲区。这就是你的测试没有输出的原因。
Ragel需要知道要解析的数据位于何处。char *p必须指向要分析的数据,如online documentation的第一个示例第6页所述
发布于 2016-01-05 11:05:11
您不仅需要将p设置为指向缓冲区的开头,还应该将pe和eof指向缓冲区的末尾。此代码应在分配长度后立即涵盖它:
p = string;
pe = string + length - 1;
eof = pe;注意:在这种情况下不需要act、ts和te,因为这些变量只用于扫描仪。
https://stackoverflow.com/questions/34405613
复制相似问题