2014-04-23 4 views
1

Возможно ли разобрать сжатые файлы в flex?синтаксический анализ сжатых файлов с помощью flex & bison?

yyin является указателем FILE*. Поэтому я хотел бы сделать что-то вроде этого: создать канал сжатого файла и установить yyin на него?

+0

Нет, это невозможно, по крайней мере, не напрямую. Сначала вам нужно распаковать его. –

+1

Это поможет? http://stackoverflow.com/questions/1907847/how-to-use-yy-scan-string-in-lex –

+0

Какова была бы ваша цель при анализе сжатого файла? Это может быть сделано, но поскольку любой сжатый файл будет казаться в основном случайными байтами (за исключением кратких областей, где хранятся метаданные), он не будет следовать предсказуемым правилам, которые ожидал бы парсер ... – twalberg

ответ

2

С помощью 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, используя дескриптор открытого файла, таких как труба.)

Смежные вопросы