Haskell [解析错误,可能是缩进不正确或括号不匹配)解析器

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

我正在尝试按照本文在Haskell中创建一个解析器。我已经使用了 Pragma

{-# Language NoImplicitPrelude #-}
。这是为了让我能够开发类
Monad
,而不会给编译器带来任何混乱。避免使用 Prelude。我的代码如下:

{-# LANGUAGE NoImplicitPrelude #-}

module MonadicParsingInHaskell where

import Data.Char

type String :: *
type String = [Char]

type Char :: *
data Char = GHC.Types.C# GHC.Prim.Char#

newtype Parser a = Parser (String -> [(a,String)])

item :: Parser Char
item = Parser (\cs -> case cs of
    ""     -> []
    (c:cs) -> [(c,cs)])

class Monad m where
    return :: a -> m a
    (>>=) :: m a -> (a -> m b) -> m b

parse :: Parser a -> String -> [(a, String)]
parse (Parser p) = p

many   :: Parser a -> Parser [a]
many p  = many1 p +++ return []

many'   :: Parser a -> Parser [a]
many' p  = many p +++ return []

instance Monad Parser where
      return :: a -> Parser a
      return a = Parser (\cs -> [(a,cs)])
      (>>=) :: Parser a -> (a -> Parser b) -> Parser b
      p >>= f  = Parser (\cs -> concat [parse (f a) cs' |
                                   (a,cs') <- parse p cs])

p :: Parser (Char,Char)
p  = do {c <- item; item; d <- item; return (c,d)}

class MonadicParsingInHaskell.Monad m => MonadZero m where
      zero :: m a

class MonadZero m => MonadPlus m where
    (++) :: m a -> m a -> m a

instance MonadZero Parser where
      zero :: Parser a
      zero   = Parser (const [])

instance MonadPlus Parser where
      (++) :: Parser a -> Parser a -> Parser a
      p ++ q = Parser (\cs -> parse p cs ++ parse q cs)

(+++)  :: Parser a -> Parser a -> Parser a
p +++ q = Parser (\cs -> case parse (p ++ q) cs of
                               []     -> []
                               (x:xs) -> [x])

sat  :: (Char -> Bool) -> Parser Char
sat p = do {c <- item; if p c then return c else zero}

char :: Char -> Parser Char
char c = sat (c ==)

string       :: String -> Parser String
string ""     = return ""
string (c:cs) = do {char c; string cs; return (c:cs)}

many1  :: Parser a -> Parser [a]
many1 p = do {a <- p; as <- many p; Mreturn (a:as)}

sepby         :: Parser a -> Parser b -> Parser [a]
p `sepby` sep  = (p `sepby1` sep) +++ return []

sepby1 :: Parser a -> Parser b -> Parser [a]
p `sepby1` sep = do a <-p
                    as <- many (do {sep; p})
                    return (a:as)

chainl :: Parser a -> Parser (a -> a -> a) -> a -> Parser a
chainl p op a = (p `chainl1` op) +++ return a

chainl1 :: Parser a -> Parser (a -> a -> a) -> Parser a
p `chainl1` op = do {a <- p; rest a}
                    where
                       rest a = (do f <- op
                                    b <- p
                                    rest (f a b))
                                +++ return a

space :: Parser String
space = many1 (sat isSpace)

token  :: Parser a ->  Parser a
token p = do
    a <- p; space; return a

symb :: String -> Parser String
symb cs = token (string cs)

apply  :: Parser a -> String -> [(a,String)]
apply p = parse (do {space; p})

expr  :: Parser Int
expr = term `chainl1` addop

addop :: Parser (Int -> Int -> Int)
addop = do {symb "+"; return (+)} +++ do {symb "-"; return (-)}

mulop :: Parser (Int -> Int -> Int)
mulop = do {symb "*"; return (*)} +++ do {symb "/"; return (div)}

term :: Parser Int
expr = term `chainl1` addop

term :: Parser Int
term = factor `chainl1` mulop

factor :: Parser Int
factor = digit +++ do {symb "("; n <- expr; symb ")"; MonadicParsingInHaskell.return n}

digit :: Parser Int
digit = do {x <- token (sat isDigit); MonadicParsingInHaskell.return (ord x - ord '0')}

addop = do {symb "+"; return (+)} +++ do {symb "-"; return (-)}
mulop = do {symb "*"; Meturn (*)} +++ do {symb "/"; return (div)}

我的说法有问题

newtype Parser a = Parser (String -> [(a, String)]
。错误如下:

GHCi, version 9.4.8: https://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling MonadicParsingInHaskell ( MonadicParsingInHaskell.hs, interpreted )

MonadicParsingInHaskell.hs:13:1: error:
    parse error (possibly incorrect indentation or mismatched brackets)
   |
13 | newtype Parser a = Parser (String -> [(a,String)])
   | ^
Failed, no modules loaded.

好像不管what语句有,问题还是出现,是不是需要缩进代码或者加括号什么的?我尝试更改语句,但出现了相同的错误,但我不明白为什么会这样。

haskell functional-programming monads interpreter
1个回答
0
投票

您需要顶部的另一种语言扩展,

MagicHash
。添加它应该会让您遇到下一个错误,我怀疑这些错误是不言自明的,您可以自己解决它们。

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