Парсинг сложного текстового файла с C#

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

Я обозначил части файла, в котором я нуждаюсь с 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))))))))
1
задан PeeHaa 5 September 2012 в 14:00
поделиться

3 ответа

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

0
ответ дан 3 September 2019 в 00:17
поделиться

Используйте генератор парсера, например ANTLR. Он принимает EBNF-подобное описание грамматики и создает код парсера на выбранном вами языке.

0
ответ дан 3 September 2019 в 00:17
поделиться

похоже, вы наткнулись на хороший файл S-Expression, также известный как LISP код. Он выглядит сложным, но на самом деле его довольно легко разобрать. На самом деле, если вы не хотите узнать много нового о Lisp, вы можете прочесть эти записи в блоге, небольшая часть которых посвящена написанию парсера для файлов, подобных этому. Но это, вероятно, слишком сложно для вас. :)

Вместо этого вы должны использовать уже доступный парсер S-Expression, вот проект, который имеет интерпретатор лиспа для .NET, вы должны быть в состоянии использовать либо их код, либо их проект для разбора файла.

Самое простое, что можно сделать, это просто прочитать файл как лисповую программу, так что вместо того, чтобы "разбирать" его, вы просто выполните его. Другой вариант - написать небольшую lisp-программу для преобразования файла во что-то другое, более естественное для C# (может быть, XML?).

для справки вот еще один пост, в котором говорится о lisp в C#

EDIT

вот интерпретатор схемы, написанный на c (всего около 1000 мест), вас интересует read и связанные процедуры. здесь используется очень простой прямой разбор выражения в дерево структур c, вы должны быть в состоянии адаптировать это в C# без проблем.

2
ответ дан 3 September 2019 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: