Моя первая чашка 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 онлайн- документации

Другие вопросы по тегам