Как мне указать входной буфер для lex и yacc? - PullRequest
0 голосов
/ 29 апреля 2019

Мне нужно создать ассемблер с lex и yacc, но я должен передать входные данные lex из файла c, где у меня есть основная функция. Но как мне сделать такую ​​вещь?

У меня просто есть буфер.

char *buffer;

Но я хочу знать, как я могу передать этот буфер в lex.

Я просто ожидаю дать буфер lex из файла "C". Я хочу пример, показывающий, как это сделать. Спасибо.

1 Ответ

1 голос
/ 29 апреля 2019

Сканирование из буфера довольно просто, но почти наверняка не , что вы хотите сделать.

Если вы хотите сканировать из файла, вы просто открываете файл для чтения, сохраняя значение из вызова fopen в yyin. Убедитесь, что вы проверили, что fopen успешно выполнено, потому что, если yyin окажется НЕДЕЙСТВИТЕЛЬНЫМ (что произойдет, если fopen не удастся), тогда сканер будет читать с stdin.

Вам нужно будет объявить yyin, если только часть вашей программы, которая настраивается во входном файле, не содержится в той же единице перевода, что и определение вашего сканера. Декларация:

extern FILE* yyin;

Если вы действительно хотите прочитать из одной строки в памяти, просто позвоните

yy_scan_string(buffer);

перед началом сканирования. (Существует также функция, которая принимает и адрес буфера, и длину, которую вы можете использовать для входов, которые не заканчиваются NUL и, возможно, содержат байты NUL:

yy_scan_bytes(buffer, buflen);

Но буфер, который вы предоставляете, должен быть весь ввод; Вы не используете этот интерфейс для чтения файла строкой за раз. (Есть способы сделать это, но я действительно не думаю, что это то, что вы ищете. Это описано в разделе нескольких входных буферов руководства Flex , если вам интересно.)

...