@@ -29,7 +29,7 @@ import Tablebot.Plugins.Roll.Dice.DiceFunctions
2929import Tablebot.Utility.Parser
3030import Tablebot.Utility.SmartParser (CanParse (.. ), (<??>) )
3131import Tablebot.Utility.Types (Parser )
32- import Text.Megaparsec (MonadParsec (try ), choice , failure , optional , some , (<?>) , (<|>) )
32+ import Text.Megaparsec (MonadParsec (try ), choice , failure , many , optional , some , (<?>) , (<|>) )
3333import Text.Megaparsec.Char (char , string )
3434import Text.Megaparsec.Error (ErrorItem (Tokens ))
3535
@@ -127,18 +127,29 @@ instance (CanParse b) => CanParse (If b) where
127127instance (CanParse a ) => CanParse (MiscData a ) where
128128 pars = (MiscVar <$> pars) <|> (MiscIf <$> pars)
129129
130+ instance (CanParse sub , CanParse typ , Operation typ ) => CanParse (BinOp sub typ ) where
131+ pars = do
132+ a <- pars
133+ tas <- many parseTas
134+ return $ BinOp a tas
135+ where
136+ parseTas = try $ do
137+ t <- skipSpace *> pars
138+ a' <- skipSpace *> pars
139+ return (t, a')
140+
141+ instance CanParse ExprType where
142+ pars = try (char ' +' $> Add ) <|> try (char ' -' $> Sub )
143+
130144instance CanParse Expr where
131145 pars =
132- (ExprMisc <$> pars)
133- <|> ( do
134- t <- pars
135- binOpParseHelp ' +' (Add t) <|> binOpParseHelp ' -' (Sub t) <|> (return . NoExpr ) t
136- )
146+ (ExprMisc <$> pars) <|> (Expr <$> pars)
147+
148+ instance CanParse TermType where
149+ pars = try (char ' *' $> Multi ) <|> try (char ' /' $> Div )
137150
138151instance CanParse Term where
139- pars = do
140- t <- pars
141- binOpParseHelp ' *' (Multi t) <|> binOpParseHelp ' /' (Div t) <|> (return . NoTerm ) t
152+ pars = Term <$> pars
142153
143154instance CanParse Func where
144155 pars = functionParser integerFunctions Func <|> NoFunc <$> pars
@@ -176,7 +187,7 @@ instance CanParse NumBase where
176187 <|> Value
177188 <$> integer <??> " could not parse integer"
178189 where
179- unnest (Paren (NoExpr ( NoTerm ( NoNeg (NoExpo (NoFunc (NBase (NBParen e)))))))) = e
190+ unnest (Paren (Expr ( SingBinOp ( Term ( SingBinOp ( NoNeg (NoExpo (NoFunc (NBase (NBParen e)) )))))))) = e
180191 unnest e = e
181192
182193instance (CanParse a ) => CanParse (Paren a ) where
@@ -282,7 +293,7 @@ instance ParseShow ArgValue where
282293instance ParseShow ListValues where
283294 parseShow (LVBase e) = parseShow e
284295 parseShow (MultipleValues nb b) = parseShow nb <> " #" <> parseShow b
285- parseShow (LVFunc s n) = funcInfoName s <> " (" <> T. intercalate " ," (parseShow <$> n) <> " )"
296+ parseShow (LVFunc s n) = funcInfoName s <> " (" <> T. intercalate " , " (parseShow <$> n) <> " )"
286297 parseShow (LVVar t) = t
287298 parseShow (ListValuesMisc l) = parseShow l
288299
@@ -294,19 +305,26 @@ instance (ParseShow a) => ParseShow (MiscData a) where
294305 parseShow (MiscVar l) = parseShow l
295306 parseShow (MiscIf l) = parseShow l
296307
308+ instance (ParseShow sub , ParseShow typ ) => ParseShow (BinOp sub typ ) where
309+ parseShow (BinOp a tas) = parseShow a <> T. concat (fmap (\ (t, a') -> " " <> parseShow t <> " " <> parseShow a') tas)
310+
311+ instance ParseShow ExprType where
312+ parseShow Add = " +"
313+ parseShow Sub = " -"
314+
315+ instance ParseShow TermType where
316+ parseShow Multi = " *"
317+ parseShow Div = " /"
318+
297319instance ParseShow Expr where
298- parseShow (Add t e) = parseShow t <> " + " <> parseShow e
299- parseShow (Sub t e) = parseShow t <> " - " <> parseShow e
300- parseShow (NoExpr t) = parseShow t
320+ parseShow (Expr e) = parseShow e
301321 parseShow (ExprMisc e) = parseShow e
302322
303323instance ParseShow Term where
304- parseShow (Multi f t) = parseShow f <> " * " <> parseShow t
305- parseShow (Div f t) = parseShow f <> " / " <> parseShow t
306- parseShow (NoTerm f) = parseShow f
324+ parseShow (Term f) = parseShow f
307325
308326instance ParseShow Func where
309- parseShow (Func s n) = funcInfoName s <> " (" <> T. intercalate " ," (parseShow <$> n) <> " )"
327+ parseShow (Func s n) = funcInfoName s <> " (" <> T. intercalate " , " (parseShow <$> n) <> " )"
310328 parseShow (NoFunc b) = parseShow b
311329
312330instance ParseShow Negation where
0 commit comments