Структура данных для представления DFA

Мне было интересно, какая структура данных будет лучшей для представления DFA?

Я рассматриваю преобразование регулярного выражения в DFA и делаю эту конкретную функциональность библиотекой на Java.

Главное, что каждый объект в регулярном выражении содержит набор значений, а не одно строковое значение, такое как «car». В моем случае каждая сущность будет иметь множество свойств, таких как {car, Honda, 4x4, седан, ...} (хотя я не ищу автомобили, это просто пример).

Какие-либо предложения?


person bsoundra    schedule 12.10.2010    source источник
comment
Разве это не то, что уже делает библиотека регулярных выражений?   -  person JoshD    schedule 12.10.2010
comment
JFlap делает это. Проверьте их работу. cs.duke.edu/csed/jflap   -  person Mike    schedule 12.10.2010
comment
@Josh: я думаю, что регулярное выражение может обрабатывать только ввод строки с одним свойством. Но ввод для перехода может принимать несколько значений   -  person bsoundra    schedule 12.10.2010
comment
@Mike: я просмотрел jflap, но это не решает мою проблему. Моя проблема в том, что ввод для перехода не является однозначным. Оно многозначно. Надежда, я ясно излагаю свою проблему.   -  person bsoundra    schedule 12.10.2010


Ответы (3)


Если я правильно понимаю ваш вопрос, вы хотите иметь библиотеку сопоставления/фильтрации для произвольного регулярного языка по алфавиту с динамическими типами? Возвращаясь к примеру с вашим автомобилем, я полагаю, вы захотите создать выражение для сопоставления со списком, в котором все автомобили (имеют красный цвет, имеют от 2 до 6 пассажиров, и каждый пассажир находится между 8 и 88 лет) или (иметь 1 пассажира).

По совпадению, я сам искал что-то подобное (для проверки документов), и самое близкое, что я мог найти, было Цзин; Библиотека Java RELAX-NG. К сожалению, алфавит в Jing состоит из узлов XML, поэтому мою проблему это не решило. На данный момент я сам пытаюсь написать библиотеку, которая делает именно это (сопоставление с обычными языками по произвольному типу алфавита), на основе сопоставления с образцом в Jing. Если вы хотите помочь с этим, пожалуйста, дайте мне знать;).

person hakvroot    schedule 12.10.2010
comment
Я не уверен, правильно ли я понял ваше объяснение. На самом деле в документе есть только слово автомобиль. Но есть связанные с ним объекты, называемые аннотациями. Таким образом, автомобиль аннотируется как Транспортное средство. Поэтому я обычно ищу транспортное средство типа аннотации, которое имеет значение автомобиль. Эта сущность является первой из многих последующих сущностей, которая создает регулярное выражение с несколькими значениями. Под множественным значением я имею в виду, например, что автомобиль является типом транспортного средства. Так что я мог бы искать что-то вроде «автомобиль, машина» продана. Это говорит об общем количестве автомобилей, проданных в документе. Это то, о чем вы говорили? - person bsoundra; 13.10.2010
comment
@bsoundra: на самом деле я говорил не о тексте, а об объектах. Если вы ищете в тексте, то это действительно что-то другое ;). Возможно, вы могли бы более подробно рассказать о своем сценарии использования? - person hakvroot; 13.10.2010
comment
Мой ввод был бы чем-то вроде Porche продан. Это слово Porche может быть помечено как автомобиль или транспортное средство или ... многие другие теги. Эта информация хранится в каком-то другом объекте, связанном с файлом. Поэтому, если я ищу «Автомобиль, Porche» продан, он должен найти совпадение. Я также могу ввести запрос «транспортное средство» продано, в котором должны быть перечислены все проданные автомобили. - person bsoundra; 14.10.2010
comment
Мне довелось наткнуться на набор инструментов Regular Language/Finite-State Automata Toolkit (для Java) из . Это довольно теоретическое решение, и оно по-прежнему ориентировано на конечные алфавиты, но, по крайней мере, оно абстрагируется от строк, имеет открытый исходный код и очень полно (NFA, DFA, строители и т. д.). Изменение исходного кода для поддержки соответствия между различными метками не является тривиальным упражнением, но и не невозможным ;). Вы можете найти его на laser.cs.umass.edu/opensource . - person hakvroot; 21.12.2010

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

person Stephen C    schedule 12.10.2010

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

DFA и NFA можно хранить как таблицу перехода состояний, затем вы выполняете синтаксический анализ, перемещая таблицу по ссылкам как таковым.

person Joey Ciechanowicz    schedule 03.11.2011