使用解析器组合器解析Haskell本身
给定Parsec、Attoparsec等库或各种其他函数实现所定义的解析器组合器,是否可以解析C或Haskell等语言 以下是我想到的一个例子:使用解析器组合器解析Haskell本身,haskell,parsec,parser-combinators,Haskell,Parsec,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 variab
-- 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
...
typeParser::解析器类型
typeParser=do
字符串“数据”
空间
名称TL;DR Yes,您可以使用一元解析器组合器库(如Parsec)解析Haskell。
一些编程语言,如Haskell,并非完全与上下文无关。这意味着需要一些上下文信息来解析它们。Haskell不是完全上下文无关的,因为它是缩进敏感的
一些一元解析器组合器库(如Parsec和Megaparsec)允许更轻松地解析上下文敏感语言。Parsec的ParsecT
和Parsec
类型可以跟踪上下文信息,该库称之为“用户状态”,它允许解析语言的上下文敏感部分,如缩进级别。“用户状态”可通过getState
、putState
和modifyState
功能访问。棘手的部分是混合具有不同类型的“用户状态”的解析器(尽管我目前正在开发一个Parsec分支,使之更容易实现)
可以使用一元解析器组合器以外的方法,但是它们通常更有限和/或更不直接,并且需要更多的变通方法才能使它们工作。例如,像Flex/Bison这样的解析器生成器库可以用来解析Haskell的上下文无关部分,但是需要一种变通方法来解析上下文敏感部分,因为解析器生成器库只能解析上下文无关语言。是的,这是可能的。您可能对解析C感兴趣。language-C
和haskell src
都使用解析器生成器进行实际解析。当您的语法变得很大时,解析器组合器有助于解释歧义。是一个(简化的)Haskell编译器,它使用Parsec进行编译。