Я застрял в точке, в преобразовании выражение, введенное пользователем в мой собственный тип данныхпреобразования типов данных без использования buildExpressionParser
Я сделал это с помощью biuldExpressionParser
, но используя простой парсер и рекурсию я следующим
openBrace = char '('
closeBrace :: GenParser Char st Char
closeBrace = char ')'
bracketExpr = do
spaces >> openBrace
expr <- expressionParser
spaces >> closeBrace
return expr
bracketExpr
возвращает введенное выражение в моем собственном типе данных
, чтобы преобразовать его в мой тип данных я сделал для отрицания, если выражение является числом или переменной следующим образом:
expressionParser = negate1
<|> number
<|> variable
--<|> addition
<?> "simple expression"
negate1 :: Parser Expr
negate1 = do{ char '-'
;ds <- number
;return (ExprNeg (ds))
}
<?> "negate"
variable :: Parser Expr
variable = do{ ds<- many1 (letter <|> digit)
; return (ExprVar ds)}
<?> "variable"
number :: Parser Expr
number = do{ ds<- many1 digit
; return (ExprNum (read ds))}
<?> "number"
Чтобы сделать то же самое для addtion я попытался с помощью разделяющего выражения с помощью sepBy
но я встретив несколько вопросов.
Если extered expreesion является 1+2
Тогда я должен получить ExprAdd (ExprNum 1) (ExprNum 2)
Я не могу дальше продолжить здесь .help было бы здорово.
спасибо.
'sepBy' слишком наивен. Попробуйте искать факторинг слева. Также см. Http://stackoverflow.com/questions/26588019/how-to-build-parser-in-haskell/26588465#26588465, может быть, кто-то из вашего класса? – alternative