Моя первая чашка 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;
}
2 ответа
Вам нужно не только установить p
указывать на начало вашего буфера, но вы также должны указать pe
а также eof
до конца этого. Этот код должен охватывать его сразу после определения длины:
p = string;
pe = string + length - 1;
eof = pe;
Замечания: act
, ts
, а также te
в этом случае не требуется, поскольку эти переменные используются только для сканеров.
Вы не настроили буфер char *p с содержимым, которое вы пытаетесь проанализировать. Вот почему ваши тесты не имеют выхода.
Рагель должен знать, где находятся данные для разбора. char *p должен указывать на данные для анализа, как указано в первом примере на странице 6 онлайн- документации