Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用解析器组合器解析Haskell本身_Haskell_Parsec_Parser Combinators - Fatal编程技术网

使用解析器组合器解析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

给定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
  ...
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进行编译。