Я должен разобрать сложный формат строки. Является ли реализация автомата разумным подходом? - PullRequest
0 голосов
/ 07 октября 2010

В настоящее время я борюсь с особенно неприятным форматом строк, который мне нужно проанализировать. Строки могут содержать подстроки, которые обозначают свойство переменной, которое должно быть разрешено. Представь что-то вроде "ThisExampleStringContainsA[VARIABLE_PROPERTY]". Кроме того, эти свойства могут быть произвольно вложенными, а также они могут иметь различные значения в зависимости от контекста. Если [VARIABLE_PROPERTY] на самом деле не является допустимым именем переменной (что, конечно, должно быть решено во время выполнения), оно просто становится нормальной частью всей строки и остается неизменным и дословно. Следовательно, нет недопустимых строк, так как количество открывающих квадратных скобок не должно совпадать с количеством закрывающих скобок! This]Is[A[Valid]]][ExampleToo!. Есть еще правила, но это даст вам представление.

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

Как бы вы подошли к этому? Как вы думаете, на самом деле реализация автомата является нормальным подходом? Как бы вы смоделировали это с точки зрения дизайна ОО? Проект находится на C #, если это что-то меняет. Вы бы предложили что-то совершенно другое?

/ Edit: Мое описание, возможно, немного вводило в заблуждение, вот некоторые подробности: Проблема для меня состоит в том, чтобы найти свойства в правильном порядке (от самого внутреннего до самого внешнего). Как только вы определили следующее свойство для разрешения, фактическое замещение его окончательным значением будет относительно простым.

Давайте возьмем пример сверху, и я дам вам пошаговый пример того, что должно произойти. Полная строка ввода: This]Is[A[Valid]]][ExampleToo! Первая закрывающая скобка и последняя открывающая скобка являются обычными символами, поскольку они ничего не заключают в себе. То же самое касается всех символов, которые не находятся между соответствующей парой скобок. Это оставляет нас с частью [A[Valid]]]. Самое внутреннее свойство должно быть разрешено в первую очередь, это будет [Valid]. Скобки просто заключают в себе строку, идентифицирующую свойство, поэтому Valid - это имя свойства, которое мы собираемся разрешить. Допустим, эта строка фактически идентифицирует свойство и заменяется его фактическим значением, скажем Foo. Идентифицирующая строка, включая скобки, заменяется, поэтому [Valid] становится Foo. Теперь мы должны взглянуть на [AFoo]]. Давайте представим, что AFoo НЕ идентифицирует свойство, которое оставляет подстроку неизменной (включая скобки). Наконец, вторая закрывающая скобка после AFoo не имеет соответствующей открывающей скобки и поэтому также является символом. После завершения обработки вся строка будет выглядеть так: This]Is[AFoo]][ExampleToo!

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

1 Ответ

0 голосов
/ 07 октября 2010

Как насчет простой старой рекурсии? Похоже, здесь хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...