Я пытаюсь создать компилятор для пользовательского языка на основе C, который поддерживает определение областей переменных с использованием C++ и flex + bison. Я сделал лексер и синтаксический анализатор, но у меня возникли проблемы с решением проблемы с определением области. Я реализовал семантические действия в файле парсера бизонов, например.Компилятор для определения языка с использованием bison
while_stmt : WHILE LEFT_PAREN expr RIGHT_PAREN LEFT_CBRACE stmts RIGHT_CBRACE { $$ = new WhileStatement($3, *$6); }
;
У меня возникла проблема с поиском момента, когда положить новую таблицу символов в стек таблицы контекстных символов. Поскольку это анализатор снизу вверх, я не знаю, когда начинается новый блок, когда он заканчивается, после того, как выполняется сокращение, и мне уже слишком поздно. Код, который я поставил за правилом, прерван после сокращения.
Как это можно решить с помощью бизона? Сейчас я занимаюсь мозговым штурмом без решения. Благодарю.
Несколько минут назад я узнал о http://www.gnu.org/software/bison/manual/html_node/Using-Mid_002dRule-Actions.html#Using-Mid_002dRule-Actions, что, кажется, решает то, что я пытаюсь достигать. Я реализовал табличные таблицы символов, и если я могу применить действие к среднему правилу, тогда я могу поместить новую таблицу символов всякий раз, когда появляется LEFT_CBRACE и выталкивать ее из стека, когда RIGHT_CBRACE завершает работу блока. В настоящее время я его внедряю и даю вам знать, как это получилось. –