Могут ли flex и bison принимать данные из других источников? - PullRequest
3 голосов
/ 09 января 2012

Я собираюсь написать текстовый редактор на Qt, который может обеспечить выделение / завершение кода / анализ синтаксиса для языка программирования (игрушечного языка, для целей обучения).

Сначала я подумал о написании рукоделия на С ++, что было бы более удобным для меня, так как я более знакомый.Однако после поиска я обнаружил, что flex / bison может упростить создание парсера.После нескольких простых примеров, кажется, что рабочие примеры принимают ввод от стандартного ввода в терминале.Итак, я просто хочу знать, может ли flex / bison принимать ввод от виджета текстового редактора в среде GUI (такой как Qt, который я собираюсь изучить в то же время после того, как я закончу некоторые функции в движке парсера),потом вывести результат обратно в текстовый редактор?

Ответы [ 2 ]

6 голосов
/ 10 января 2012

Если вы не хотите использовать указатель FILE *, вы также можете сканировать из буферов в памяти, таких как символьные массивы и строки C-типа с нулевым символом в конце, создавая входные буферы FLEX - yy_scan_string () создает буфер из нулевого значенияЗавершенная строка, yy_scan_bytes создает буфер из массива символов фиксированной длины.См. Множественные входные буферы в документации flex для получения дополнительной информации.

И если это не соответствует вашим потребностям, вы также можете переопределить макрос YY_INPUT для полного контроля - см. Сгенерированный сканер .

5 голосов
/ 10 января 2012

flex читает входные данные из yyin. Если вы указываете на что-то, что не stdin ... См. здесь , например.

Редактировать: кстати, yyin это FILE *. Вы используете C ++, что означает, что вы хотите вместо этого передать поток. Пожалуйста, прочитайте документацию по интерфейсу C ++

.

Edit2: для вывода ... вы программируете действия yacc / bison для правил, а также обработчик ошибок. В этом смысле вам предоставлена ​​некоторая свобода в том, что там делать. Например, вы можете «испустить» выделенный код, а также использовать обработчики ошибок для указания ошибок при анализе кода. Завершение заставит вас реализовать хотя бы часть семантики (таблицы символов и т. Д.), Но это другая история ...

...