Parsing Haskell,Parsec-lambda演算中的解析应用程序
我正在用Haskell为lambda演算编写一个简单的解析器/解释器 我对lambda函数使用语法“/(x.x)”,对名称使用“x”,对应用程序使用“fy”,因此“/(x.x)y”是对y的标识应用,应该返回y 我的策略是为名称、lambda函数和应用程序提供一个解析器。名称和函数解析器可以工作,但应用程序解析器不能工作 当我试图解析“/(x.x)y”时,它失败了。它应该尝试将源解析为一个名称,一个lambda函数,在不能同时使用这两个函数之后(因为它不会解析所有源),尝试将其解析为一个应用程序,然后成功 我的代码是:Parsing Haskell,Parsec-lambda演算中的解析应用程序,parsing,haskell,parsec,Parsing,Haskell,Parsec,我正在用Haskell为lambda演算编写一个简单的解析器/解释器 我对lambda函数使用语法“/(x.x)”,对名称使用“x”,对应用程序使用“fy”,因此“/(x.x)y”是对y的标识应用,应该返回y 我的策略是为名称、lambda函数和应用程序提供一个解析器。名称和函数解析器可以工作,但应用程序解析器不能工作 当我试图解析“/(x.x)y”时,它失败了。它应该尝试将源解析为一个名称,一个lambda函数,在不能同时使用这两个函数之后(因为它不会解析所有源),尝试将其解析为一个应用程序,
module Main where
import Text.ParserCombinators.Parsec
data Expression =
Var String
| Lambda Expression Expression
| Application Expression Expression
deriving Eq
instance Show Expression where
show (Var v) = v
show (Lambda v e) = "/(" ++ show v ++ "." ++ show e ++ ")"
show (Application e1 e2) = "" ++ show e1 ++ " " ++ show e2 ++ ""
-- Parser
parseSource :: String -> Expression
parseSource source =
case parse (parseExpression <* eof) "" source of
Right e -> e
_ -> error "Parsing error"
parseExpression :: Parser Expression
parseExpression =
parseVar <|> parseLambda <|> parseApplication
parseVar :: Parser Expression
parseVar = Var <$> many1 letter
parseLambda :: Parser Expression
parseLambda = do
_ <- char '/'
_ <- char '('
arg <- parseVar
_ <- char '.'
body <- parseExpression
_ <- char ')'
return $ Lambda arg body
parseApplication :: Parser Expression
parseApplication = do
e1 <- parseExpression
_ <- spaces
e2 <- parseExpression
return $ Application e1 e2
modulemain其中
导入Text.ParserCombinators.Parsec
数据表达=
变量字符串
|Lambda表达式
|应用表达式
推导公式
实例显示表达式在哪里
显示(变量v)=v
show(Lambda v e)=“/(“++show v++”“+++show e++”)
show(应用程序e1 e2)=+++show e1+++++++show e2++”
--分析器
parseSource::String->Expression
解析源=
case解析(parse)表达式
_->错误“分析错误”
解析器表达式::解析器表达式
解析表达式=
parseVar parseLambda parseApplication
parseVar::解析器表达式
parseVar=Var-many1个字母
parseLambda::解析器表达式
parseLambda=do
_问题是应用程序将解析为单个表达式
和一些剩余的表达式。您可以改为解析每个表达式
,然后将其合并到(左关联的)应用程序
s:parseExpression=foldl1应用程序(parseLambda parseVar)`sepBy1`空格