Как действовать для каждого бизона правила

Я пытаюсь сделать небольшой компилятор, используя 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) после ввода, это должно работать.

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