У меня есть библиотека C, с которой я бы хотел взаимодействовать из кода C ++ без изменения библиотеки. Он имеет сгенерированный yacc интерфейс, который читает из yyin
, который является FILE *
, Я хотел бы установить yyin
в какой-то эмуляция из FILE *
который читает по памяти. Есть ли надежда сделать это в переносимой (Linux, Mac, Windows) манере — или есть другая хитрость для того, чтобы заставить такой парсер читать из памяти, а не FILE *
?
Ты можешь использовать fmemopen()
в линуксе К сожалению, не только нет портативного способа сделать это, но опять же, fopen()
даже не очень портативный (он долго ломался в Windows).
Однако, если ваш токенизатор Flex, вы можете использовать yy_scan_buffer()
, Увидеть Строковый ввод для сгибания лексера.
Сканер yacc обычно получает токены через лексер, вызывая функцию с именем yylex
,
Лексер — это то, что обычно читает символы из входного файла (или буфера, в вашем случае). Предполагая, что вы используете Flex для генерации лексера, обычный «крючок» для изменения способа считывания ввода заключается в переопределении YY_INPUT
макро.
Однако, как отметил @dietrich Epp, существуют также yy_scan_string, yy_scan_buffer и yy_scan_bytes. Вопрос о том, являются ли они более подходящими для ваших целей, чем определение собственного YY_INPUT, может быть под вопросом. Хотя я не могу вспомнить ни одной детали, я вспоминаю, что время от времени избегал их из-за (по крайней мере, предполагаемой) недостаточной эффективности (или, может быть, мне просто казалось, что определение YY_INPUT проще — может » не помню точно).