У меня есть грамматик, которая позволяет неявное умножение, (1+2)(3+4)
такое же, как (1+2)*(3+4)
или (1+2)7
такое же, как (1+2)*7
Как реализовать это в Haskell? Вот то, что я до сих пор:Как разобрать выражение с неявным умножением Parsec в Haskell
import Control.Monad
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Expr
import Text.ParserCombinators.Parsec.Language
import qualified Text.ParserCombinators.Parsec.Token as Token
languageDef =
emptyDef { Token.identStart = letter
, Token.identLetter = alphaNum
, Token.reservedOpNames = ["+", "*"]
}
lexer = Token.makeTokenParser languageDef
reservedOp = Token.reservedOp lexer
parens = Token.parens lexer
integer = Token.integer lexer
data Expr = Const Int
| Binary BinOp Expr Expr
deriving (Show)
data BinOp = Add | Multiply
deriving (Show)
expression = buildExpressionParser operators term
operators = [ [Infix (reservedOp "*" >> return (Binary Multiply)) AssocLeft]
, [Infix (reservedOp "+" >> return (Binary Add )) AssocLeft]
]
term = liftM (Const . fromIntegral) integer
<|> parens expression
<|> (do e1 <- expression
e2 <- term
return $ Binary Multiply e1 e2)
parseString str =
case parse expression "" str of
Left e -> error $ show e
Right r -> r
, но он не работает, у меня есть ошибка при разборе, когда я пытаюсь разобрать ((1 + 5) 8)
меня unexpected "8" expecting operator or ")"
Не могли бы вы убедитесь, что у вас есть все импорта в вашем примере? Это немного облом, если нам нужно выяснить все, что вы импортируете ... – Alec
@Alec Я добавил все недостающие части, чтобы код компилировался и работает. – Artem
Вы пытались изменить определение оператора с 'reservedOp '*" 'на' reservedOp "*" <|> space'? –