Возможно ли разобрать сжатые файлы в flex?синтаксический анализ сжатых файлов с помощью flex & bison?
yyin
является указателем FILE*
. Поэтому я хотел бы сделать что-то вроде этого: создать канал сжатого файла и установить yyin на него?
Возможно ли разобрать сжатые файлы в flex?синтаксический анализ сжатых файлов с помощью flex & bison?
yyin
является указателем FILE*
. Поэтому я хотел бы сделать что-то вроде этого: создать канал сжатого файла и установить yyin на него?
С помощью flex
вы можете определить макрос YY_INPUT(buf,result,maxlen)
, чтобы изменить способ ввода flex
. Макрос должен прочитать не болееmaxlen
байтов в buf
и вернуть фактическое количество байтов, хранящихся в result
, или установить result
на YY_NULL
, чтобы указать EOF.
Например, с помощью интерфейса удобства zlib
, вы можете вставить что-то вроде следующего в ваш файл гибком:
%{
#include <zlib.h>
gzFile gz_yyin;
#define YY_INPUT(buf,result,maxlen) do { \
int n = gzread(gz_yyin, buf, maxlen); \
if (n < 0) { /* handle the error */ } \
result = n > 0 ? n : YY_NULL; \
} while (0)
%}
// lots of stuff skipped
int main(int argc, char** argv) {
gz_yyin = gzopen(argv[1], "rb");
if (gz_yyin == NULL) { /* handle the error */ }
/* Start parsing */
// ...
(Вы можете использовать gzdopen
создать gzfile
, используя дескриптор открытого файла, таких как труба.)
Нет, это невозможно, по крайней мере, не напрямую. Сначала вам нужно распаковать его. –
Это поможет? http://stackoverflow.com/questions/1907847/how-to-use-yy-scan-string-in-lex –
Какова была бы ваша цель при анализе сжатого файла? Это может быть сделано, но поскольку любой сжатый файл будет казаться в основном случайными байтами (за исключением кратких областей, где хранятся метаданные), он не будет следовать предсказуемым правилам, которые ожидал бы парсер ... – twalberg