From 1f1cc1f33d2cd8a54b3fb29d8a8137e8e044b816 Mon Sep 17 00:00:00 2001 From: Abhinav Sarkar Date: Fri, 26 Oct 2012 21:21:18 +0530 Subject: [PATCH] Added support for multiple consecutive unary operators --- DiceRoller.hs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/DiceRoller.hs b/DiceRoller.hs index b153589..462f6a6 100644 --- a/DiceRoller.hs +++ b/DiceRoller.hs @@ -75,18 +75,20 @@ spaced = (<* spaces) -- A parser to parse the integer literals literal = (Lit . read) <$> spaced (many1 digit) --- A parse to parse a factor, where a factor is either a literal or an expression --- enclosed in brackets +-- A parser to parse a unary operator followed by a factor +unaryOpFactor = spaced (char 'd') *> (Rol <$> factor) + +-- A parse to parse a factor, where a factor is either a literal or +-- a factor preceded by an unary operator or an expression enclosed in brackets factor = spaced (char '(') *> spaced expr <* spaced (char ')') + <|> unaryOpFactor <|> literal -- Operators table in descending order of precedence -table = [[uop 'd' Rol], -- single roll - [bop 'd' MRol AssocLeft], -- multiple rolls +table = [[bop 'd' MRol AssocLeft], -- multiple rolls [bop '*' Mul AssocLeft, bop '/' Div AssocLeft], -- multiplication and division [bop '+' Add AssocLeft, bop '-' Sub AssocLeft]] -- addition and subtraction where bop c f = Infix (spaced (char c) *> return f) -- binary operators - uop c f = Prefix (spaced (char c) *> return f) -- unary operators -- A parser to parse the full expression expr = buildExpressionParser table factor