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