Проверьте это, это коммерческий, но выглядит как забавная игрушка:
http://dpg.zenithlab.com/
Но на самом деле: для нексуса вам не нужен сложный парсер.
Немного кода проверки позиции, немного разделения строк и скобок, и вы получили его.
Я бы проанализировал его, используя простой анализатор токенов за раз:
- загрузка файла в TStringList.
- для каждой строки, захватите один токен за раз, чтобы определить тип линии.
иметь перечислимый тип для этого типа строки.
- первая действительная непустая строка должна быть определена как действительный тег #nexus.
- рядом с областью заголовка (пропущено в основном похоже)
- begin - это первое и ключевое слово в строке.
- следующие строки внутри блока begin выглядят почти как команда DOS и ее параметры командной строки, разделены пробелами и заканчиваются точкой с запятой. очень похоже на паскаль, но в скобках.
Для вышеперечисленного я бы написал для себя небольшой набор помощников, и в конечном итоге мне, возможно, понадобится написать небольшую функцию разделения токенов:
функция GetToken (var inputString: String; outputToken: String; Разделители const: TStrings; Ключевые слова: TStrings; ParenFlag: Boolean): Boolean;
GetToken вернет true, когда сможет найти и вернуть строку токена из inputString, пропустит любой начальный пробел и завершится, когда найдет разделитель. Разделителями являются такие элементы, как пробел или запятая.
ParenFlag: True будет означать, что следующим полученным токеном должен быть весь список элементов в скобках. Как только я получу весь список в скобках (((a, b), (c, d), (e, f))), я вызову другую функцию, которая распакует содержимое этого списка в некоторую структуру данных для списков / массивы.
Я не рекомендую большой движок парсера, и грамматика BNF поможет вам написать код, если вы сначала напишите грамматику BNF перед тем, как написать парсер. Но здесь нет ничего настолько грубого, что вы не сможете разобрать его.
От вас ожидают выполнения запросов / преобразований по этому вопросу? Как вы думаете, вам нужно преобразовать его в json или xml, чтобы работать с ним дальше?