gpt4 book ai didi

haskell - Parsec:解析包含以 '$' 开头的变量的表达式(无空格)

转载 作者:行者123 更新时间:2023-12-02 10:47:33 24 4
gpt4 key购买 nike

我想解析包含以 $ 开头的变量的表达式(如 $a=$b ),使用 Parsec 的 Token 和 Expr 模块。这是我的代码的简化版本:

module Main where

import Control.Monad.Identity
import Control.Applicative

import Text.Parsec
import Text.Parsec.String

import qualified Text.Parsec.Token as Tok
import qualified Text.Parsec.Language as Tok
import qualified Text.Parsec.Expr as Ex

data Expr
= BinaryOp String Expr Expr
| Var String
deriving (Show)

lexer :: Tok.TokenParser ()
lexer = Tok.makeTokenParser style
where
style = Tok.emptyDef
{ Tok.reservedOpNames = ["="]
, Tok.reservedNames = []
, Tok.identStart = letter
, Tok.identLetter = alphaNum
}

reservedOp = Tok.reservedOp lexer
identifier = Tok.identifier lexer
whiteSpace = Tok.whiteSpace lexer

parseExpr :: String -> Either ParseError Expr
parseExpr = parse (whiteSpace *> expr <* eof) ""

expr :: Parser Expr
expr = Ex.buildExpressionParser opTable terms <?> "expression"
where
opTable =
[ [ Ex.Infix (reservedOp "=" >> return (BinaryOp "=")) Ex.AssocLeft ] ]
terms =
try var

var :: Parser Expr
var = Var <$> (char '$' >> identifier)

--

main :: IO ()
main = case parseExpr "$a=$b" of
Left err -> print err
Right expr -> print expr

这对于运算符周围有空格的表达式(如 $a = $b )来说效果很好,但如果没有空格( $a=$b ),我会收到错误:

(line 1, column 5):
unexpected '$'
expecting operator

另外,如果我修改解析器来解析不以 $ 开头的变量,解析器在有或没有空格的情况下都可以工作。所以$的组合好像有问题以及它们之间没有空格的运算符。

最佳答案

问题在于默认标记解析器中 opStartopLetter 的定义:

emptyDef   :: LanguageDef st
emptyDef = LanguageDef
{ commentStart = ""
...
, opStart = opLetter emptyDef
, opLetter = oneOf ":!#$%&*+./<=>?@\\^|-~"
...
}

token 解析器使用 opStartopLetter 贪婪地匹配运算符名称,因此 $a=$b 解析与 相同$a =$b。由于 =$ 不是运算符,因此会出现语法错误。

如果您从 opLetter 中删除 $ ,事情应该可以正常工作,例如:

lexer :: Tok.TokenParser ()
lexer = Tok.makeTokenParser style
where
style = Tok.emptyDef
{ Tok.reservedOpNames = ["="]
, Tok.reservedNames = []
, Tok.identStart = letter
, Tok.identLetter = alphaNum
, Tok.opLetter = oneOf ":!#%" -- add this line
}

关于haskell - Parsec:解析包含以 '$' 开头的变量的表达式(无空格),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32313542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com