使用解析器组合符解析Haskell本身

wfveoks0  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(185)

给定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语言,但它不依赖于任何解析器组合子库。

yh2wf1be

yh2wf1be1#

TL;DR是的,您可以使用Parsec这样的一元解析器组合子库来解析Haskell。

有些编程语言如Haskell并不是完全上下文无关的。这意味着需要一些上下文信息来解析它们。Haskell并不是完全上下文无关的,因为它是缩进敏感的。
一些一元解析器组合子库,如Parsec和Megaparsec,允许更容易地解析上下文相关语言。Parsec的ParsecTParsec类型可以跟踪上下文信息,库将其称为“用户状态”,它允许解析语言的上下文相关部分,如缩进级别。“用户状态”可以通过getState访问。putStatemodifyState函数。棘手的部分是混合具有不同类型“用户状态”的解析器。
也可以使用一元解析器组合子以外的方法,但是它们通常更受限制和/或不那么直接,并且需要更多的工作方法才能使它们工作。例如,可以使用像Flex/野牛这样的解析器生成器库来解析Haskell的上下文无关部分。然而,由于解析器生成器库只能解析上下文无关语言,因此需要解决方案来解析上下文相关部分。

相关问题