Я должен проанализировать текстовый файл, который имеет много уровней и символов. Я пробовал различные способы проанализировать его, но я не смог заставить что-либо работать. Я включал образец текстового файла, с которым я имею дело. Какие-либо предложения о том, как я могу проанализировать этот файл?
Я обозначил части файла, в котором я нуждаюсь с TEXTINEED.
(bean name:
'TEXTINEED
context:
(list '/text
'/content/home/left-nav/text
'/content/home/landing-page)
type:
'/text/types/text
module:
'/modules/TEXTINEED
source:
'|moretext|
((contents
(list (list (bean type:
'/directory/TEXTINEED
((directives
(bean ((chartSize (list 600 400))
(showCorners (list #f))
(showColHeader (list #f))
(showRowHeader (list #f)))))))
(bean type:
'/directory/TEXTINEED
((directives
(bean ((displayName (list "MTD"))
(showCorners (list #f))
(showColHeader (list #f))
(showRowLabels (list #f))
(hideDetailedLink (list #t))
(showRowHeader (list #f))
(chartSize (list 600 400)))))))
(bean type:
'/directory/TEXTINEED
((directives
(bean ((displayName (list "QTD"))
(showCorners (list #f))
(showColHeader (list #f))
(showRowLabels (list #f))
(hideDetailedLink (list #t))
(showRowHeader (list #f))
(chartSize (list 600 400))))))))
Вы можете рассмотреть возможность написания реализации машины состояний, которая меняет состояния в зависимости от различных лексем, встречающихся в файле. Я обнаружил, что парсеры на основе состояний довольно просты в написании и отладке. Самой сложной частью, вероятно, будет определение используемых лексем.
Используйте генератор парсера, например ANTLR. Он принимает EBNF-подобное описание грамматики и создает код парсера на выбранном вами языке.
похоже, вы наткнулись на хороший файл S-Expression, также известный как LISP код. Он выглядит сложным, но на самом деле его довольно легко разобрать. На самом деле, если вы не хотите узнать много нового о Lisp, вы можете прочесть эти записи в блоге, небольшая часть которых посвящена написанию парсера для файлов, подобных этому. Но это, вероятно, слишком сложно для вас. :)
Вместо этого вы должны использовать уже доступный парсер S-Expression, вот проект, который имеет интерпретатор лиспа для .NET, вы должны быть в состоянии использовать либо их код, либо их проект для разбора файла.
Самое простое, что можно сделать, это просто прочитать файл как лисповую программу, так что вместо того, чтобы "разбирать" его, вы просто выполните его. Другой вариант - написать небольшую lisp-программу для преобразования файла во что-то другое, более естественное для C# (может быть, XML?).
для справки вот еще один пост, в котором говорится о lisp в C#
EDIT
вот интерпретатор схемы, написанный на c (всего около 1000 мест), вас интересует read
и связанные процедуры. здесь используется очень простой прямой разбор выражения в дерево структур c, вы должны быть в состоянии адаптировать это в C# без проблем.