使用解析器组合器解析 Haskell 本身
Parse Haskell itself with parser combinators
给定由 Parsec、Attoparsec 或各种其他函数实现等库定义的解析器组合器,是否可以解析 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 语言,但它不依赖于任何解析器组合器库。
TL;DR 是的,您可以使用像 Parsec.
这样的单子解析器组合器库来解析 Haskell
像 Haskell 这样的一些编程语言并不是完全上下文无关的。这意味着需要一些上下文信息才能解析它们。 Haskell 不是完全上下文无关的,因为它对缩进敏感。
一些 monadic 解析器组合器库,如 Parsec 和 Megaparsec 允许更轻松地解析上下文相关的语言。 Parsec 的 ParsecT
和 Parsec
类型可以跟踪上下文信息,库将其称为“用户状态”,它允许解析语言的上下文敏感部分,如缩进级别。可以通过 getState
、putState
和 modifyState
函数访问“用户状态”。棘手的部分是混合具有不同类型“用户状态”的解析器(尽管我目前正在开发 Parsec 的一个分支,它可以更容易地做到这一点)。
可以使用 monadic 解析器组合器以外的方法,但是它们通常更受限制 and/or 不太直接,可能需要更多变通方法才能使它们正常工作。例如,像 Flex/Bison 这样的解析器生成器库可用于解析 Haskell 的上下文无关部分,但是需要一种变通方法来解析上下文敏感的部分,因为解析器生成器库只能解析上下文无关语言。
给定由 Parsec、Attoparsec 或各种其他函数实现等库定义的解析器组合器,是否可以解析 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 语言,但它不依赖于任何解析器组合器库。
TL;DR 是的,您可以使用像 Parsec.
这样的单子解析器组合器库来解析 Haskell像 Haskell 这样的一些编程语言并不是完全上下文无关的。这意味着需要一些上下文信息才能解析它们。 Haskell 不是完全上下文无关的,因为它对缩进敏感。
一些 monadic 解析器组合器库,如 Parsec 和 Megaparsec 允许更轻松地解析上下文相关的语言。 Parsec 的 ParsecT
和 Parsec
类型可以跟踪上下文信息,库将其称为“用户状态”,它允许解析语言的上下文敏感部分,如缩进级别。可以通过 getState
、putState
和 modifyState
函数访问“用户状态”。棘手的部分是混合具有不同类型“用户状态”的解析器(尽管我目前正在开发 Parsec 的一个分支,它可以更容易地做到这一点)。
可以使用 monadic 解析器组合器以外的方法,但是它们通常更受限制 and/or 不太直接,可能需要更多变通方法才能使它们正常工作。例如,像 Flex/Bison 这样的解析器生成器库可用于解析 Haskell 的上下文无关部分,但是需要一种变通方法来解析上下文敏感的部分,因为解析器生成器库只能解析上下文无关语言。