В настоящее время я пишу программу Haskell, где в какой-то момент мне нужно манипулировать кодом Haskell, который кто-то еще ввел в систему, добавив его с моей собственной информацией и функциями. Например, я, возможно, пожелает, чтобы найти все места, пользователь написал что-то вроде:Haskell Parenthesis Matching for Find and Replace
а = Shape (Rectangle 3 5)
И изменить эти записи с дополнительными данными (например, номер строки, они появились на или информацию о пользователе, который написал им:
а = TrackedShape (74 «Джон» (Прямоугольник 3 5))
для того, чтобы сделать это найти и заменить, я пробовал только с помощью регулярных выражений, но что во многих случаях они недостаточно выразительны, чтобы фиксировать все варианты использования. В частности, для примера выше мне понадобится t o захватить все, что содержится в конструкторе формы, и поэтому нужно знать, что представляют собой скобки.
Я также попытался выяснить, будет ли полезен синтаксический анализатор, такой как haskell-src-exts, но я не уверен. Похоже, что, хотя эти библиотеки могут быть полезны для разбора кода Haskell изначально, им не хватает возможности анализировать код, изменять дерево разбора, а затем изменять разобранный код назад в его первоначальную форму, сохраняя при этом структуру Оригинальный текст.
Есть ли библиотеки, которые были бы полезны для такого рода задач? Или, если это не так, есть ли какая-то функция, которую я мог бы написать, которая обеспечивала бы надежный поиск и замену для этого?
Да, уточнить. Когда я говорю «сохраняющая структура», я имею в виду сохранение отступов, разрывов строк и т. Д. Замены, которые я делаю на экране, будут отображаться пользователю немедленно, поэтому я не хочу, чтобы он внезапно уничтожил все их отступы. Я хочу, чтобы это выглядело как * их * код, который, как оказалось, был дополнен –
Возможно, вы пишете чрезвычайно простой парсер (используя parsec или attoparsec), который просто разбирает круглые скобки и текст. Затем вы можете применять выражения reqular к тому, что содержится в parens. – mhwombat