Разбор файла с использованием конечного автомата - PullRequest
1 голос
/ 27 ноября 2011

Я реализую свой собственный fsm для разбора файла.Я новичок в шаблоне fsm, поэтому пытаюсь узнать об этом.

Мой класс fsm принимает поток файла, который анализируется вместе с текущим состоянием, и коллекцию всех принимающих состояний.

Теперь я запутался в нескольких вещах.

  1. Как ФСМ перемещается через состояния и отслеживает то, что было проанализировано до сих пор?

  2. Какую информацию должен хранить объект состояния?Прямо сейчас у них есть шаблон, который они соответствуют на линии и посмотреть, может ли fsm перейти в это состояние или нет.

Пример:

Файл для анализа:

Person:  bob smith
        Age: 33
        Location: new York
End person
Person:  Jane smith
        Age: 66
        Location: Chicago
End person

Итак, у меня есть состояние для начала, возраста, местоположения и конечного человека.У каждого объекта состояния есть свой шаблон.(регулярное выражение), чтобы проверить, принята ли данная строка ими или нет.

Но я застрял на том, как мне построить объект Person при разборе этого файла с помощью fsm ​​??

Ответы [ 3 ]

2 голосов
/ 27 ноября 2011

Есть список лиц (изначально пусто).Иметь переменную currentPerson.

  • Если установлено состояние «начало пользователя», инициализируйте переменную currentPerson новым Person.
  • Когда состояние «возраст», установите возраст на currentPerson.
  • То же самое для состояния "местоположение".
  • Когда состояние «конец лица», добавьте currentPerson в список лиц.

Когда вы дойдете до конца файла, список людей содержит всех ваших людей.

1 голос
/ 27 ноября 2011

Стандартный способ построения состояния в FSM - это создание дерева, как вы читаете в токенах.Состояние FSM определяется типом узла, в котором вы находитесь.Например, вы начнете с анализа слова «Персона» и узнаете, как построить новый узел «Персона» в дереве.Затем все, что вы прочитали после этого, пока не дойдете до жетонов «Конечного человека», создаст узлы под этим «Человеком».

В качестве академического упражнения это звучит хорошо для ФСМ.Но для практических целей это выглядит как JSON, поэтому я бы определенно искал существующие способы его синтаксического анализа.

Кроме того, yacc (или bison) является окончательным способом построения парсеров FSM.Он выплевывает C-код с формально определенной грамматикой.Я никогда не смотрел на это, но, вероятно, есть что-то подобное для Java.

1 голос
/ 27 ноября 2011

Не думаю, что я согласен с тем, что это лучшее использование FSM.

Для меня это выглядит очень похоже на JSON.Несколько изменений, и вы там.Это тоже может быть XML;вам не придется писать анализатор.

Но, если вы настаиваете, ваш FSM начнет чтение строки.

Если строка содержит «Person», вы сохранитеимя значение.(Рекомендация: добавьте строку «Имя» после «Персона».)

Если строка содержит «Возраст», вы сохраните значение возраста.

Если строка содержит «Местоположение», вы сохраните значение местоположения.

Если строка содержит «Конец», вы создадите экземпляр нового Person, добавите его в структуру данных и прочитаете следующую строку.

Если строка пуста, вы достигли конца;перейдите в конечное состояние и закройте файл.

Вы не говорите, разрешаете ли вы какие-либо атрибуты не по порядку.

...