Я тестирую функциональность для действий в режиме и из состояния в Ragel. У меня есть следующие программы Ragel:Почему Ragel выполняет действия State и From-State дважды?
ragelScaffolding.rl:
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
char *p, *pe;
int cs;
void runRagelMachine(char instructions[], int instructionLen){
p = instructions;
pe = p + instructionLen;
%%{
machine test;
action testToAction1{
puts("1");
}
action testFromAction1{
puts("f1");
}
action testToAction2{
puts("2");
}
test = (
start: (
any -> s1
),
s1: (
any -> s2
)$to(testToAction1) $from(testFromAction1),
s2: (
any -> final
)$to(testToAction2)
);
main := test;
write data;
write init;
write exec;
}%%
}
int main(){
char buf[1024];
runRagelMachine(buf, 1024);
}
Я бы ожидать, что это выход следующее:
1
f1
2
Но вместо этого он выводит:
1
f1
1
2
f1
2
Который говорит мне, что он выполняет эти действия дважды. Я думал о том, почему это может быть так и для чтения документации, но я не могу понять, почему это происходит. Это происходит при компиляции с Ragel 6.9 и 7 (и компиляция C с gcc). Документация говорит следующее:
To-состояния действия выполняются всякий раз, когда конечный автомат переходит в определенное состояние, либо естественным движением над переходом или с помощью передачи действия на основе управления, таких как fgoto. Они выполняются после действий в переходном состоянии, но до того, как текущий символ продвинут и протестирован в конце входного блока.
Но ничего не происходит в выполнении действий дважды. Я был бы очень признателен за любую помощь или разъяснение по этому вопросу.
Заранее спасибо.
Это должно быть право? –
Спасибо за указание опечатки, исправлено. – gentleBandit