regex — ошибки компиляции с помощью Ragel и Stack Overflow

Я пытаюсь выучить Ragel за последние 2 дня и столкнулся с некоторыми проблемами, связанными с синтаксисом Ragel. Моя цель — написать синтаксический анализатор, который распознает команды Regex с C ++ в качестве основного языка. Сейчас я пытаюсь распознать следующую команду с парсером — :LoadSdf [0-9]+

Ниже приведен следующий код, который я пытаюсь:

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

%%{
action done {
printf("done\n");
}

machine ldf;
main := (':'.'LoadSdf'.[0-9])@done;

}%%

%%write data;
int main(int argc, char** argv)
{
int cs;
if(argc > 1) {
char *p = argv[1];
char *pe = p+strlen(p) + 1;
%%write init;
%%write exec;
}
return 0;
}

Когда я пытаюсь скомпилировать с помощью команды ragel ldf.cpp — Я получаю следующую ошибку:

ldf.cpp:10:1: this specification has no name, nor does any previous specification
ldf.cpp:16:31: action lookup of "done" failed

Однако, если я напишу непосредственно код как

 main := (':'.'LoadSdf'.[0-9])@{printf("done\n");} //this compiles.

Вторая проблема у меня возникает, когда я пытаюсь написать следующее для моего конечного автомата —

main := (':'.'LoadSdf'.[0-9])@{printf("done\n");} $err{printf("error : %c",fc);};

Я хочу напечатать ошибку, когда команды не соответствуют ожидаемым.
Приведенный выше код компилируется с помощью команды ragel.
Однако, когда я пытаюсь скомпилировать с g++ ldf.c -o ldf — это дает следующую ошибку компилятора:

ldf.c: In function ‘int main(int, char**)’:
ldf.c:171:12: error: ‘eof’ was not declared in this scope
if ( p == eof )
′

Любые предложения приветствуются.

0

Решение

machine должен появиться в первой строке. В этом и заключается ошибка «эта спецификация не имеет имени».

%%{

machine ldf;    // put it here.

action done {
printf("done\n");
}

main := (':'.'LoadSdf'.[0-9])@done;

}%%

Для вашей второй ошибки вы должны определить eof переменная.

char *p = argv[1];
char *pe = p+strlen(p) + 1;
char *eof = pe;               // <-- add this.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]