我的作业是在Haskell中制作一个表达式解析器。我在SO上找不到有关Haskell解析的先前问题的帮助。
表达式定义如下:
我的作业中给出的解析器定义如下:
现在我需要开发一个名为
为了完成我的作业,我已经找到了以下定义的函数:
我理解我需要开发三个函数:
函数
函数
我不是很理解单子模式如何工作,我在做我的作业时遇到了问题。有关如何编写这些函数的任何帮助?
这是我在作业中找到的图片。
表达式定义如下:
data Expr =
| Const Int
| Var String
| Add Expr Expr | Sub Expr Expr | Mul Expr Expr | Pow Expr Int
deriving Show
类型Parser
的定义如下:
type Parser a = String -> Maybe (a, String)
我的作业中给出的解析器定义如下:
--Primitive parsers
success :: a -> Parser a
success v = \inp -> Just (v, inp)
failure :: Parser a
failure = \_ -> Nothing
item :: Parser Char
item = \inp -> case inp of
"" -> Nothing
(c : cs) -> Just (c, cs)
--Sequential parsers
(>>>) :: Parser a -> (a -> Parser b) -> Parser b
p >>> f = \inp -> case p inp of
Nothing -> Nothing
Just (x, cs) -> f x cs
(&&&) :: Parser a -> Parser b -> Parser b
p &&& q = p >>> \_ -> q
-- Conditional Parsers
sat :: (Char -> Bool) -> Parser Char
sat f = item >>> \c -> if f c then success c else failure
digit :: Parser Char
digit = sat isDigit
space :: Parser Char
space = sat isSpace
char :: Char -> Parser Char
char c = sat (== c)
-- Alternative parsers
(+++) :: Parser a -> Parser a -> Parser a
p +++ q = \inp -> case p inp of
Nothing -> q inp
Just res -> Just res
-- Iterative Parsers
many :: Parser a -> Parser [a]
many p = many1 p +++ success []
many1 :: Parser a -> Parser [a]
many1 p = p >>> \v -> many p >>> \vs -> success (v : vs)
--Token
nat :: Parser Int
nat = many1 digit >>> \cs -> success (read cs)
spaces :: Parser ()
spaces = many space &&& success ()
token :: Parser a -> Parser a
token p = spaces &&& p
natural :: Parser Int
natural = token nat
symbol :: Char -> Parser Char
symbol c = token (char c)
现在我需要开发一个名为
expr
的函数,它接受一个String
并将其转换为Expr
。为了完成我的作业,我已经找到了以下定义的函数:
expr :: Parser Expr
expr = term >>> \t -> (symbol '+' &&& expr >>> \e -> success $ Add t e) +++ (symbol '-' &&& expr >>> \e -> success $ Sub t e) +++ success t
我理解我需要开发三个函数:
term
、power
和factor
。函数
factor
应该解析常量或变量。函数
term
应该解析单个factor
(例如2
)或两个factor
之间的乘法(例如2*x
)。我不是很理解单子模式如何工作,我在做我的作业时遇到了问题。有关如何编写这些函数的任何帮助?
这是我在作业中找到的图片。