Използвам 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 това е доста лесно, тъй като препроцесорът вече е комбинирал всички заглавни файлове в една единица за превод, която може да бъде сканирана отгоре надолу. Но изразите „използване“ във VHDL не са команди на предпроцесора.
И така, някак си, докато анализирам файла, трябва да разпозная, когато видя израз за употреба и след това да изляза и да анализирам съответния файл и след това да продължа да анализирам оригиналния файл с тази символна таблица.
Има ли елегантен начин да направите това с lex/yacc? Знам, че има yyrestart, но не съм сигурен дали това върви по правилния път.