{-# 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 )
, 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
'=')) )
, 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]
,[ 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]
,[ 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
, 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
, 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
, 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]
,[ 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
<$> 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 ((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]
,[ 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
, 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" )]
,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 []
]
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]"