Интеграция Flex / Bison с внешней программой - PullRequest
2 голосов
/ 16 марта 2011

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

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

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

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

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

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

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

Время сценария: ДЕНЬ 1 00: 00: 00
[DATA FUSION EVENT] Новый трек сформирован
Краткое описание
Фактическая цель: RF HQ
Fusion Center Местоположение: CVN Enterprise_0
Название Fusion Center: DEFAULT FUSION
Воспринимаемая цель Воспринимаемая идентификация: Неизвестно
Воспринимаемая классификация: неизвестно
Рабочая среда: Земля

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

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

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

1 Ответ

0 голосов
/ 16 марта 2011

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

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

...