2015-07-12 2 views
1

Я пытаюсь создать компилятор для пользовательского языка на основе C, который поддерживает определение областей переменных с использованием C++ и flex + bison. Я сделал лексер и синтаксический анализатор, но у меня возникли проблемы с решением проблемы с определением области. Я реализовал семантические действия в файле парсера бизонов, например.Компилятор для определения языка с использованием bison

while_stmt : WHILE LEFT_PAREN expr RIGHT_PAREN LEFT_CBRACE stmts RIGHT_CBRACE { $$ = new WhileStatement($3, *$6); } 
      ; 

У меня возникла проблема с поиском момента, когда положить новую таблицу символов в стек таблицы контекстных символов. Поскольку это анализатор снизу вверх, я не знаю, когда начинается новый блок, когда он заканчивается, после того, как выполняется сокращение, и мне уже слишком поздно. Код, который я поставил за правилом, прерван после сокращения.

Как это можно решить с помощью бизона? Сейчас я занимаюсь мозговым штурмом без решения. Благодарю.

ответ

1

В области видимости компилятора это семантическое действие и обычно не обрабатывается на уровне анализа, а на более поздней стадии во время семантического перехода по дереву.

Если вы попытаетесь сделать это во время разбора, вы попадаете в проблемы, которые вы объяснили. Разбор предназначен только для проверки соответствия последовательности токенов грамматике. Все остальное должно выполняться из дерева разбора, созданного во время разбора.

Это не конкретный вопрос о бизоне. Он применяется к любому компилятору и парсеру (который использует контекстные бесплатные грамматики).

+0

Несколько минут назад я узнал о http://www.gnu.org/software/bison/manual/html_node/Using-Mid_002dRule-Actions.html#Using-Mid_002dRule-Actions, что, кажется, решает то, что я пытаюсь достигать. Я реализовал табличные таблицы символов, и если я могу применить действие к среднему правилу, тогда я могу поместить новую таблицу символов всякий раз, когда появляется LEFT_CBRACE и выталкивать ее из стека, когда RIGHT_CBRACE завершает работу блока. В настоящее время я его внедряю и даю вам знать, как это получилось. –

Смежные вопросы