Я в настоящее время борется с особенно неприятным строковым форматом, который я должен разобрать. Строки могут содержать подстроки, которые обозначают свойство переменной, которое должно быть разрешено. Представьте что-то вроде "ThisExampleStringContainsA[VARIABLE_PROPERTY]"
. Кроме того, эти свойства могут быть произвольно вложенными, а также они могут иметь разные значения, зависящие от контекста. Если [VARIABLE_PROPERTY]
фактически не является допустимым именем переменной (что, конечно же, должно решаться во время выполнения), оно просто становится нормальной частью всей строки и остается неизменным и дословным. Вследствие этого нет никаких недопустимых строк, так как число квадратных квадратных скобок не должно совпадать с числом закрывающих скобок! This]Is[A[Valid]]][ExampleToo!
. Есть больше правил, но это даст вам представление.Мне нужно разобрать сложный строковый формат. Использует ли автомат разумный подход?
Итак, на данный момент я не уверен, как подойти к этому. Мои первые попытки закончились невероятным беспорядком ifs и elses, и я все больше и больше заметил, что решение должно предусматривать некоторую концепцию состояния. Теперь я все больше и больше думаю об использовании автомата для этого. Тем не менее, я столкнулся с автоматами только как чистые теоретические конструкции. Я никогда не сталкивался с реальной реализацией. Кроме того, автоматы традиционно используются для проверки слова, то есть определения, принадлежит ли оно формально определенному языку. Излишне говорить, что мне трудно придумать формальное определение этого языка.
Как вы подходите к этому? Как вы думаете, на самом деле внедрение автомата - это разумный подход? Как вы смоделируете это с точки зрения дизайна OO? Проект находится на C#, если это имеет значение. Не могли бы вы предложить что-то совсем другое?
/Edit: Мое описание может быть немного вводит в заблуждение, вот еще некоторые детали: проблема для меня, чтобы найти свойства в правильном порядке (от самого внутреннего к самой внешней). После того как вы определили следующее свойство для разрешения, фактическая подстановка с конечным значением относительно проста.
Давайте рассмотрим пример сверху, и я дам вам шаг за шагом пример того, что должно произойти. Полная строка ввода: This]Is[A[Valid]]][ExampleToo!
Первый замыкающий кронштейн и последний открывающий кронштейн являются нормальными символами, так как они ничего не придают. То же самое относится ко всем символам, которые не находятся между соответствующей парой кронштейнов. Это оставляет нам часть [A[Valid]]]
. Сначала необходимо разрешить самое внутреннее свойство, которое будет [Valid]
. Скобки просто заключают строку идентификации свойства, поэтому Valid
- это имя свойства, которое мы собираемся решить. Скажем, эта строка действительно идентифицирует свойство и заменяется его фактическим значением, скажем Foo
. Идентификационная строка, включающая скобки, заменяется, поэтому [Valid]
становится Foo
. Теперь мы должны посмотреть на [AFoo]]
. Давайте сделаем вид, что AFoo
НЕ идентифицирует свойство, которое оставляет подстроку неизменной (включая скобки). Наконец, вторая закрывающая скобка после AFoo
не имеет подходящего открывающего кронштейна и поэтому также является символом. После завершения обработки вся строка будет читать: This]Is[AFoo]][ExampleToo!
Надеюсь, этот пример упростит ситуацию. Имейте в виду, что я упростил строковый формат здесь! Это только для того, чтобы дать вам представление о том, с какими трудностями сталкиваюсь. Я не ожидаю рабочего кода, я ищу ответы, которые дают мне идеи о том, как подойти к проблеме. Поскольку этот синтаксический анализ должен выполняться для многих тысяч строк, решение должно иметь несколько разумную производительность.
Итак, чтобы подвести итог, стоит искать «[идентификатор]» и подставить значение для идентификатора, если оно есть »? Затем повторное сканирование строки? Можете ли вы дать нам несколько примеров желаемого ввода и вывода? –
Я добавил пример на мой вопрос. – Hatch