Интеграция Flex / Bison с внешней программой

Я работаю над моделью интеллектуального агента, которая требует в качестве входных данных список событий. События поступают из выходных данных другой модели и находятся в (большом) текстовом файле. Текстовый файл представляет собой список всех событий (включая ненужные события, которые меня не волнуют), поэтому я написал сканер с использованием flex, который может найти полезные биты. Структура модели интеллектуального агента уже написана на C ++.

Каждое событие имеет отметку времени и содержит большой объем информации о событии. Формат входного файла постоянный, поэтому мне действительно не нужно проверять синтаксис. Я не знаю, действительно ли Bison предлагает мне какие-либо преимущества, потому что грамматика на самом деле довольно проста. Настоящих вариаций нет.

Мне просто нужен способ поместить каждое событие (и всю информацию из этого события) в стек. Интеллектуальный агент действует на каждое событие в хронологическом порядке, поэтому мне нужно, чтобы программа сканировала весь входной файл, а затем помещала каждое событие в стек в обратном порядке (первое событие во входном файле должно быть последним событием, помещенным в стек). Это позволит интеллектуальному агенту извлекать события из стека и обрабатывать их по одному.

Я думаю, что bison мне не очень поможет, потому что грамматика просто состоит в последовательном перечислении всех токенов. В основном это выглядело бы так:

eventlist: /* nothing */
| eventlist event EOL
;

event: token1 token2 token3 ... tokenN-1 tokenN

Вот небольшой фрагмент входного файла, чтобы вы могли понять, что я имею в виду:

Время события сценария: ДЕНЬ 1 00:00:00
[СОБЫТИЕ СЛИЯНИЯ ДАННЫХ] Создан новый трек
Сводка
Фактическая цель: штаб-квартира РФ
Fusion Center Расположение: CVN Enterprise_0
Имя центра Fusion: ФУЗИЯ ПО УМОЛЧАНИЮ
Воспринимаемая цель Воспринимаемая идентификация: Неизвестно
Воспринимаемая классификация: Неизвестно
Рабочая среда: Земля

У меня есть несколько вопросов:

1) Как мне интегрировать сканер, созданный с помощью flex, с более крупной программой, которая уже существует?
2) Будет ли bison предлагать какие-либо преимущества, или мне лучше просто написать свою собственную программу, чтобы поместить все токены в структуру данных и поместить их в стеке? 2a) Если bison лучше, то это решает вопрос 1, но тогда как мне вызвать bison из моей программы, а затем заставить bison вернуть указатель на стек, чтобы программа могла его использовать?

// Отредактировано: я понял, как вызвать flex из внешней программы на C ++. Мне пока не удалось создать программу bison, которая будет делать то, что я хочу (а именно, возвращать указатель на стек событий).


person Andrew    schedule 16.03.2011    source источник
comment
Обновление: я использую Windows, и проект в настоящее время запрограммирован в Visual Studio 2008. До этого момента сканер создавался через командную строку и является отдельной программой.   -  person Andrew    schedule 16.03.2011
comment
Вы также можете посмотреть на Boost Spirit. Я никогда не использовал зубров, но преобразовать грамматику зубров в дух было несложной задачей. Так что, может быть, это вам поможет.   -  person mkaes    schedule 16.03.2011


Ответы (1)


Если ваша грамматика настолько проста, то использование парсера кажется излишним. Просто обработайте каждую строку и сканируйте токены в коллекцию.

Как вы думаете, зачем вам парсер?

person jon-hanson    schedule 16.03.2011
comment
Потому что я не смог найти никакой документации по непосредственному взаимодействию с flex без Yacc / Bison. Все документы, которые мне удалось найти, предполагают, что вы используете Yacc / Bison, поэтому инструкции ориентированы в этом направлении. - person Andrew; 16.03.2011
comment
В порядке. Так нельзя ли просто вызвать yylex () для вызова сканера? - person jon-hanson; 17.03.2011
comment
Да, но я не могу понять, как заставить его вернуть что-то полезное. Есть ли способ заставить yylex () вернуть что-нибудь полезное? Я могу вызвать yylex () извне, но мне нужно, чтобы он возвращал либо указатель на стек, либо какую-либо другую полезную структуру данных, чтобы интеллектуальный агент действительно мог что-то делать с токенами. - person Andrew; 17.03.2011
comment
Что ж, прошло некоторое время с тех пор, как я его использовал, но я подумал, что идея заключалась в том, что при распознавании каждого токена он вызывает действие, определенное вами. Здесь было бы разумно протолкнуть токен в вектор, а когда вы нажмете токен конца строки, поместите вектор в стек. Таким образом, yylex () ничего не вернет - все это делается из-за побочных эффектов. - person jon-hanson; 17.03.2011
comment
Спасибо. Я попробую. - person Andrew; 21.03.2011