Я пытаюсь выучить 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 )
′
Любые предложения приветствуются.
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.
Других решений пока нет …