Всегда ли это необходимо? На что это похоже?Как лексер возвращает семантическое значение, которое использует парсер?
ответ
Lexer не заботится о семантике, единственная миссия в жизни для лексеров состоит в том, чтобы преобразовать исходный код (поток символов) в токены, каждый из которых имеет эту форму. <Token_type, Information_related_to_token>
информация может быть, значение токена (строки), имя оператора (=) ...
Токены затем отправляются в парсер, который имеет дело с синтаксическим анализом. в качестве побочного задания лексер может создать таблицу символов.
В yacc
ваш лексер получает глобальную переменную с именем yylval
, которая является C-соединением. Еще в Yacc, это становится значением для $1
, $2
и т.д.
лексических не иметь дело с семантикой, они занимаются только с поворотом потока символов в токены (последовательности символов, которые имеют смысл для компилятора). Семантика определяется во время синтаксического анализа. См. Этот answer на предыдущий вопрос для получения дополнительной информации о этапах компиляции.