{-# LANGUAGE FlexibleContexts #-}
module Language.JS.Operators where

import qualified Text.Parsec.Expr as P
import qualified Text.Parsec as P
import Language.JS.Types
import Language.JS.Common

opNotFollowedBy :: String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
op ParsecT s u m a
p = String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
op  ParsecT s u m String -> ParsecT s u m () -> ParsecT s u m String
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT s u m a -> ParsecT s u m ()
forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
P.notFollowedBy ParsecT s u m a
p

table :: P.Stream s m Char => Bool -> P.ParsecT s u m Expression -> [[P.Operator s u m Expression]]
table :: Bool -> ParsecT s u m Expression -> [[Operator s u m Expression]]
table Bool
withComma ParsecT s u m Expression
exp' = [[ ParsecT s u m (Expression -> Expression)
-> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a) -> Operator s u m a
P.Postfix (String -> Bool -> Expression -> Expression
UnaryUpdate    (String -> Bool -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Bool -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"++" ParsecT s u m (Bool -> Expression -> Expression)
-> ParsecT s u m Bool -> ParsecT s u m (Expression -> Expression)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Bool -> ParsecT s u m Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False                 )             -- 17
              , ParsecT s u m (Expression -> Expression)
-> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a) -> Operator s u m a
P.Postfix (String -> Bool -> Expression -> Expression
UnaryUpdate    (String -> Bool -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Bool -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"--" ParsecT s u m (Bool -> Expression -> Expression)
-> ParsecT s u m Bool -> ParsecT s u m (Expression -> Expression)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Bool -> ParsecT s u m Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False                 )]
             ,[ ParsecT s u m (Expression -> Expression)
-> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a) -> Operator s u m a
P.Prefix  (String -> Expression -> Expression
Unary          (String -> Expression -> Expression)
-> ParsecT s u m String -> ParsecT s u m (Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"!" (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'='))     )             -- 16
              , ParsecT s u m (Expression -> Expression)
-> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a) -> Operator s u m a
P.Prefix  (String -> Expression -> Expression
Unary          (String -> Expression -> Expression)
-> ParsecT s u m String -> ParsecT s u m (Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"~"                                 )
              , ParsecT s u m (Expression -> Expression)
-> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a) -> Operator s u m a
P.Prefix  (String -> Expression -> Expression
Unary          (String -> Expression -> Expression)
-> ParsecT s u m String -> ParsecT s u m (Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"+" (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
"+="))   )
              , ParsecT s u m (Expression -> Expression)
-> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a) -> Operator s u m a
P.Prefix  (String -> Expression -> Expression
Unary          (String -> Expression -> Expression)
-> ParsecT s u m String -> ParsecT s u m (Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"-" (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
"-="))   )
              , ParsecT s u m (Expression -> Expression)
-> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a) -> Operator s u m a
P.Prefix  (String -> Bool -> Expression -> Expression
UnaryUpdate    (String -> Bool -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Bool -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"++" ParsecT s u m (Bool -> Expression -> Expression)
-> ParsecT s u m Bool -> ParsecT s u m (Expression -> Expression)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Bool -> ParsecT s u m Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True                  )
              , ParsecT s u m (Expression -> Expression)
-> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a) -> Operator s u m a
P.Prefix  (String -> Bool -> Expression -> Expression
UnaryUpdate    (String -> Bool -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Bool -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"--" ParsecT s u m (Bool -> Expression -> Expression)
-> ParsecT s u m Bool -> ParsecT s u m (Expression -> Expression)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Bool -> ParsecT s u m Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True                  )
              , ParsecT s u m (Expression -> Expression)
-> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a) -> Operator s u m a
P.Prefix  (String -> Expression -> Expression
Unary          (String -> Expression -> Expression)
-> ParsecT s u m String -> ParsecT s u m (Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"typeof"                            )
              , ParsecT s u m (Expression -> Expression)
-> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a) -> Operator s u m a
P.Prefix  (String -> Expression -> Expression
Unary          (String -> Expression -> Expression)
-> ParsecT s u m String -> ParsecT s u m (Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"void"                              )
              , ParsecT s u m (Expression -> Expression)
-> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a) -> Operator s u m a
P.Prefix  (String -> Expression -> Expression
Unary          (String -> Expression -> Expression)
-> ParsecT s u m String -> ParsecT s u m (Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"delete"                            )
              , ParsecT s u m (Expression -> Expression)
-> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a) -> Operator s u m a
P.Prefix  (String -> Expression -> Expression
Unary          (String -> Expression -> Expression)
-> ParsecT s u m String -> ParsecT s u m (Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"await"                             )]
             ,[ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"**" (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'='))    ) Assoc
P.AssocRight] -- 15
             ,[ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"*"  (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
"*="))  ) Assoc
P.AssocLeft  -- 14
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"/"  (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
"*="))  ) Assoc
P.AssocLeft
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"%"  (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
"/="))  ) Assoc
P.AssocLeft]
             ,[ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"+"  (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
"+="))  ) Assoc
P.AssocLeft  -- 13
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"-"  (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
"-="))  ) Assoc
P.AssocLeft]
             ,[ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"<<" (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
"="))   ) Assoc
P.AssocLeft  -- 12
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
">>" (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
">="))  ) Assoc
P.AssocLeft
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
">>>" (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'='))   ) Assoc
P.AssocLeft]
             ,[ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"<" (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
"<="))   ) Assoc
P.AssocLeft  -- 11
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"<="                                ) Assoc
P.AssocLeft
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
">" (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
">="))   ) Assoc
P.AssocLeft
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
">="                                ) Assoc
P.AssocLeft
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"in" (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
's'))    ) Assoc
P.AssocLeft
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"instanceof"                        ) Assoc
P.AssocLeft]
             ,[ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"==" (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'='))    ) Assoc
P.AssocLeft  -- 10
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"!=" (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'='))    ) Assoc
P.AssocLeft
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"==="                               ) Assoc
P.AssocLeft
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"!=="                               ) Assoc
P.AssocLeft]
             ,[ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"&" (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
"&="))   ) Assoc
P.AssocLeft]  --  9
             ,[ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"^"                                 ) Assoc
P.AssocLeft]  --  8
             ,[ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"|" (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
"|="))   ) Assoc
P.AssocLeft]  --  7
             ,[ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"&&" (Char -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'='))    ) Assoc
P.AssocLeft]  --  6
             ,[ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Operation      (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"||"                                ) Assoc
P.AssocLeft]  --  5
             ,[ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   ((Expression -> Expression -> Expression -> Expression)
-> Expression -> Expression -> Expression -> Expression
forall a b c. (a -> b -> c) -> b -> a -> c
flip Expression -> Expression -> Expression -> Expression
Condition (Expression -> Expression -> Expression -> Expression)
-> ParsecT s u m Expression
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"?" ParsecT s u m String
-> ParsecT s u m Expression -> ParsecT s u m Expression
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT s u m Expression -> ParsecT s u m Expression
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
lexeme ParsecT s u m Expression
exp' ParsecT s u m Expression
-> ParsecT s u m String -> ParsecT s u m Expression
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
":")) Assoc
P.AssocNone] --  4
             ,[ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Assignment     (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (String -> ParsecT s u m Char -> ParsecT s u m String
forall s (m :: * -> *) a u.
(Stream s m Char, Show a) =>
String -> ParsecT s u m a -> ParsecT s u m String
opNotFollowedBy String
"=" (String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
">="))   ) Assoc
P.AssocRight --  3
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Assignment     (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"+="                                ) Assoc
P.AssocRight
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Assignment     (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"-="                                ) Assoc
P.AssocRight
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Assignment     (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"**="                               ) Assoc
P.AssocRight
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Assignment     (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"*="                                ) Assoc
P.AssocRight
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Assignment     (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"/="                                ) Assoc
P.AssocRight
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Assignment     (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"%="                                ) Assoc
P.AssocRight
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Assignment     (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"<<="                               ) Assoc
P.AssocRight
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Assignment     (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
">>="                               ) Assoc
P.AssocRight
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Assignment     (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
">>>="                              ) Assoc
P.AssocRight
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Assignment     (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"&="                                ) Assoc
P.AssocRight
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Assignment     (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"^="                                ) Assoc
P.AssocRight
              , ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix   (String -> Expression -> Expression -> Expression
Assignment     (String -> Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"|="                                ) Assoc
P.AssocRight]
             ,[ ParsecT s u m (Expression -> Expression)
-> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a) -> Operator s u m a
P.Prefix  (String -> Expression -> Expression
Unary          (String -> Expression -> Expression)
-> ParsecT s u m String -> ParsecT s u m (Expression -> Expression)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
"yield"                             )]              --  2
             ,if Bool
withComma then ([ ParsecT s u m (Expression -> Expression -> Expression)
-> Assoc -> Operator s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m (a -> a -> a) -> Assoc -> Operator s u m a
P.Infix (Expression -> Expression -> Expression
Comma (Expression -> Expression -> Expression)
-> ParsecT s u m String
-> ParsecT s u m (Expression -> Expression -> Expression)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
keywordB String
",") Assoc
P.AssocLeft]) else []  --  1
             ]

-- withComma = isLiteral (used when parsing arrays, objects and parenthesis expression)
operationExpression :: Bool
-> ParsecT s u m Expression
-> ParsecT s u m Expression
-> ParsecT s u m Expression
operationExpression Bool
withComma ParsecT s u m Expression
exp' ParsecT s u m Expression
p = OperatorTable s u m Expression
-> ParsecT s u m Expression -> ParsecT s u m Expression
forall s (m :: * -> *) t u a.
Stream s m t =>
OperatorTable s u m a -> ParsecT s u m a -> ParsecT s u m a
P.buildExpressionParser (Bool -> ParsecT s u m Expression -> OperatorTable s u m Expression
forall s (m :: * -> *) u.
Stream s m Char =>
Bool -> ParsecT s u m Expression -> [[Operator s u m Expression]]
table Bool
withComma ParsecT s u m Expression
exp') (ParsecT s u m Expression -> ParsecT s u m Expression
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
lexeme ParsecT s u m Expression
p) ParsecT s u m Expression -> String -> ParsecT s u m Expression
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
P.<?> String
"[operations]"