Я пытаюсь сделать небольшой компилятор, используя 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»
если я ввожу ввод в виде заглавных букв, он ждет, пока я не введу следующее слово, и после ввода любого следующего слова он печатает «Ошибка синтаксиса», если следующий ввод - заглавные буквы.
Проблема в том, что он ждет, пока не будет дан следующий ввод для печати A, и он все еще печатает A, если присутствует ошибка с синтаксической ошибкой.
Я не понял, что с ним не так, может кто-нибудь найти в нем ошибку.
-
в качестве символа в именах переменных. Вы имели в виду_
междуZ
и0
?) Убедились ли вы, что можете включить диагностическую печать в лексическом анализаторе, чтобы вы могли видеть поток токенов? вернулся к грамматике? В долгосрочной перспективе это облегчило бы жизнь, если бы вы могли. - person Jonathan Leffler   schedule 15.04.2017