Как действовать для каждого бизона правила
Я пытаюсь сделать небольшой компилятор, используя flex и bison, но я не понимаю, как выполнить действие для каждого правила.
моя грамматика похожа на:
%union{
std::string *s;
};
%start program
%type <s> expr
%token <s> KEYWORD
%token <s> VARIABLE
%%
program : KEYWORD {std::cout << "A"; }
| KEYWORD VARIABLE {std::cout << "B"; }
Переменное регулярное выражение [a-zA-Z0-9]
"заглавные буквы" - мое ключевое слово
если я даю ввод как "caps lock" (caps =KEYWORD и lock =VARIABLE), я получаю вывод как "B"
если я передаю ввод заглавными буквами, то он ждет, пока я введу следующее слово, и после ввода любого следующего слова выдает "Asyntax error", если следующий ввод заглавными буквами.
Проблема в том, что он ждет, пока следующий ввод не будет выведен для печати A, и все еще печатает A, если присутствует ошибка с синтаксической ошибкой
Я не понимаю, что с этим не так, может кто-то найдет в этом ошибку.
1 ответ
Бизону требуется токен "конец ввода", чтобы отметить конец ввода и вернуть успешный анализ. Обычно вы даете ему этот токен при чтении EOF (это то, что будет делать lex/flex). Так что если вы вводите EOF (обычно нажимая CtrlD или CtrlZ) после ввода, это должно работать.