Синтаксический анализ файлов на C#
-
13-09-2019 - |
Вопрос
Я создаю игру в Visual Studio 2008, и для создания уровней у меня будет два типа файлов (на самом деле их больше, но эти два - единственные, важные для моего вопроса), которые мне нужно проанализировать.Один из них будет диктовать содержимое уровня и будет выглядеть примерно так:
LevelName = "Уровень выборки"
Object1Type = "Пользовательский объект"
Объект1Файл = "WideFloor_DF"
Объект1позиция = 600,600
Object2Type = "Круг"
Объект2позиции = 550, 500
Масса объекта2 = 5
и т.д.
Другой будет диктовать свойства для пользовательских объектов и выглядеть примерно так:
Имя = "Широкий пол"
Масса = 1
Геометрическая карта = "WideFloor_GM"
IsStatic = истина
и т.д.
Я не очень хорошо знаком с регулярными выражениями (читать:мне они не нравятся, потому что слишком похожи на линейный шум, чтобы их было легко понять) и мне было интересно, есть ли более простой метод, чем использование тонны регулярных выражений?
Редактировать:я знал, что что-то забыл!я действительно ненавижу xml-файлы, поэтому я бы действительно предпочел не использовать их (waaaaaaaay слишком многословно для меня).правка 2:мне нравится формат, который я придумал, и я бы предпочел не меняться.
Решение
Как насчет использования XML-файлов?Вы можете легко читать и записывать их, используя объекты XmlReader и XmlWriter, и вам вообще не придется иметь дело с регулярными выражениями.
<Level name="Sample Level">
<Object type="CustomObject" file="WideFloor_DF" positionX="600" positionY="600" />
<Object type="Circle" file="WideFloor_DF" positionX="500" positionY="500" mass="5" />
</Level>
Другие советы
Если вы все равно собираетесь иметь свои файлы в удобочитаемом формате, почему бы не использовать XML?
Если у вас есть контроль над форматом файла, вы можете попробовать что-нибудь с существующим анализатором, например XML или INI-файлы, оба из которых имеют анализаторы в .NET.
Если вы продаете в вышеуказанном формате, вы можете использовать такой инструмент, как Лекс чтобы сгенерировать ваш синтаксический анализатор для вас.
Одним из альтернативных подходов может быть определение класса, который имеет свойства / коллекции для хранения всех этих конфигурационных данных, и сделать его [Сериализуемым].Затем вы можете заполнить пример конфигурации, сериализовать его в файл, и тогда у вас получится полный XML-конфигурационный файл, который вы сможете редактировать вручную.Когда вы будете готовы использовать конфигурацию, просто десериализуйте XML-файл обратно в объект config в вашем приложении.
Если вы абсолютно настаиваете на использовании этого формата файла, вы можете создать объект, который читает файл построчно, извлекая данные из левой части '=' и помещая их в Словарь в качестве ключа, а все, что находится справа от '=', - в качестве значения.
Однако я должен повторить приведенные выше ответы, в которых говорится об использовании XML-документа вместе с объектом XmlDocument .Вы изучали LINQ для XML?
что ж, если я понял ваш вопрос, вам нужен способ структурировать содержимое файлов, чтобы синтаксический анализ был для вас намного проще, XML - хороший выбор для этого, а XSD также для описания содержимого ваших xml-файлов, LINQ to XML позволит очень удобно читать его с C #.
Если вы используете XML, вы можете десериализовать файлы непосредственно в объект, так что вам вообще не нужно его разбирать.
Почему бы не двоично сериализовать ваши объекты.