Parsing Haskell,Parsec-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函数,在不能同时使用这两个函数之后(因为它不会解析所有源),尝试将其解析为一个应用程序,

我正在用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`空格