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

问题描述 投票:1回答:1

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

haskell parsec parser-combinators
1个回答
1
投票

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

某些编程语言(例如Haskell)并非完全没有上下文。这意味着需要一些上下文信息来解析它们。 Haskell并非完全不依赖上下文,因为它对缩进敏感。

诸如Parsec和Megaparsec之类的一些monadic解析器组合器库允许更轻松地解析上下文相关的语言。 Parsec的ParsecTParsec类型可以跟踪上下文信息,该库称为“用户状态”,它允许解析语言的上下文相关部分,例如缩进级别。可以通过getStateputStatemodifyState功能访问“用户状态”。棘手的部分是混合具有不同类型的“用户状态”的解析器(尽管我目前正在开发Parsec的派生类,使其在其他方面更容易执行此操作)。

可以使用Monadic解析器组合器以外的方法,但是它们通常更局限和/或更不直接,并且可能需要更多变通办法才能使它们工作。例如,可以使用诸如Flex / Bison之类的解析器生成器库来解析Haskell的上下文无关部分,但是由于解析器生成器库只能解析上下文无关的语言,因此需要一种变通方法来解析上下文相关的部分。 >

© www.soinside.com 2019 - 2024. All rights reserved.