Сам парс Haskell с помощью комбинаторов парсеров - PullRequest
1 голос
/ 03 апреля 2020

Для заданных комбинаторов синтаксического анализа, определенных библиотеками, такими как Parse c, Attoparse c или различными другими функциональными реализациями, возможно ли анализировать такие языки, как C или Haskell сами по себе?

Вот пример того, что я имею в виду:

-- constructor defined by its name, and a list of arguments           
data Constructor = Constructor String [Type]

-- type definition contains a type name, list of type variables, and a list of constructors
data Type = Type String [Char] [Constructor] 

В этом очень упрощенном примере разбор типа может быть:

typeParser :: Parser Type
typeParser = do
  string "data"
  spaces
  name <- takeWhile letters
  spaces
  typeVars <- many1 letter
  ...

Я заметил, что пакет http://hackage.haskell.org/package/haskell-src-1.0.3.1 анализирует язык Haskell 98, но он не зависит ни от какой библиотеки комбинатора синтаксического анализа.

1 Ответ

1 голос
/ 10 апреля 2020

TL; DR Да, вы можете анализировать Haskell, используя библиотеку monadi c синтаксического анализатора, такую ​​как Parse c.

Некоторые языки программирования, такие как Haskell, не являются полностью без контекста. Это означает, что некоторая контекстная информация необходима для их анализа. Haskell не является полностью контекстно-свободным, потому что он чувствителен к отступам.

Некоторые библиотеки комбинаторов синтаксического анализа monadi c, такие как Parse c и Megaparse c, позволяют более легко анализировать контекстно-зависимые языки. Типы Parse c ParsecT и Parsec могут отслеживать контекстную информацию, которую библиотека называет «пользовательским состоянием», что позволяет анализировать контекстно-зависимые части языков, такие как уровень отступов. Доступ к «пользовательскому состоянию» осуществляется с помощью функций getState, putState и modifyState. Сложнее всего смешивать парсеры, которые имеют «пользовательские состояния» разных типов (хотя в настоящее время я разрабатываю разветвление Parse c, которое облегчает эту задачу среди прочего).

Возможно используйте подходы, отличные от комбинаторов синтаксического анализа monadi c, однако они часто более ограничены и / или менее просты и могут потребовать больше обходных путей, чтобы заставить их работать. Например, библиотека генератора синтаксического анализатора, такая как Flex / Bison, может использоваться для анализа контекстно-свободных частей Haskell, однако для анализа контекстно-зависимых частей потребуется обходной путь, поскольку библиотеки генератора синтаксического анализатора могут анализировать только контекстно-свободные языки. .

...