gpt4 book ai didi

haskell - 如何在 Text.Parsec.Expr 中制作后缀 (--)

转载 作者:行者123 更新时间:2023-12-04 05:42:35 26 4
gpt4 key购买 nike

我从 Text.Parsec.Expr 的文档中得到了一个示例.

expr    = buildExpressionParser table term
<?> "expression"
term = parens expr
<|> natural
<?> "simple expression"
table = [ [prefix "-" negate, prefix "+" id ]
, [postfix "++" (+1)]
, [binary "*" (*) AssocLeft, binary "/" (div) AssocLeft ]
, [binary "+" (+) AssocLeft, binary "-" (-) AssocLeft ]
]

我试图添加后缀 --操作并将表的第二行更改为
          , [postfix "++" (+1), postfix "--" (subtract 1)]  

现在
runParser expr () "expr" "1--" 

给我 Right 1在ghci。

为什么我得到它以及如何提供 postfix ( -- )?

最佳答案

"--1"被解析为 [prefix "-", prefix "-", number 1]并评估为 negate (negate 1)这产生 1。

获取后缀 (--) , 做 runParser expr () "expr" "1--"不给你后缀-- ?

解析似乎没有消耗整个输入。但我不知道为什么,

module ExParse where

import Text.Parsec
import Text.Parsec.Expr

parens p = do
char '('
e <- p
char ')'
return e

reservedOp s = do
string s
notFollowedBy letter

natural = fmap read $ many1 digit

expr = buildExpressionParser table term
<?> "expression"
term = parens expr
<|> natural
<?> "simple expression"
table = [ [prefix "-" negate, prefix "+" id ]
, [postfix "++" (+1), postfix "--" (subtract 1)]
, [binary "*" (*) AssocLeft, binary "/" (div) AssocLeft ]
, [binary "+" (+) AssocLeft, binary "-" (-) AssocLeft ]
]

binary name fun assoc = Infix (do{ reservedOp name; return fun }) assoc
prefix name fun = Prefix (do{ reservedOp name; return fun })
postfix name fun = Postfix (do{ reservedOp name; return fun })

res = runParser expr () "expr" "1--"

产量
*ExParse> res
Right 0

根据需要在这里。
natural = P.natural lexer 的问题是它被定义为
natural = lexeme nat


lexeme p = do
x <- p
whiteSpace
return x

其中评论算作空格。现在,Haskell 中的行注释以 -- 开头,因此与 natural = P.natural lexer , natural消耗整个字符串 "1--" .使 --可用作后缀运算符,您必须选择不是注释启动器的语言定义。例如,您可以修改 haskellDef
lexer = P.makeTokenParser (haskellDef{P.commentLine = "//"})

或重新定义 whiteSpace解析器。

关于haskell - 如何在 Text.Parsec.Expr 中制作后缀 (--),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11097153/

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