Я использую lex & yacc для написания синтаксического анализатора VHDL. VHDL имеет некоторые языковые функции, которые делают его контекстно-зависимым, подобно C. Например, конструкции, подобные typedef, которые влияют на то, должен ли синтаксический анализатор размечать что-либо как IDENTIFIER или TYPEDEF_NAME.
Сложность возникает, когда вам нужно построить таблицу символов на основе другого файла, на который ссылаются операторы «использования» (аналогично «импорту» в Java или Python).
library ieee;
use ieee.std_logic_1164.all;
-- code which uses something defined in ieee.std_logic_1164 package
В C это довольно просто, потому что препроцессор уже объединил все заголовочные файлы в единую единицу перевода, которую можно сканировать сверху вниз. Но операторы «use» в VHDL не являются командами препроцессора.
Итак, каким-то образом, когда я анализирую файл, я должен распознать, когда я вижу оператор использования, а затем перейти и проанализировать соответствующий файл, а затем продолжить анализ исходного файла с этой таблицей символов.
Есть ли элегантный способ сделать это с помощью lex/yacc? Я знаю, что есть yyrestart, но я не уверен, что он идет по правильному пути.