{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
module GLua.Parser where
import GLua.AG.AST
import GLua.AG.Token
import qualified GLua.Lexer as Lex
import GLua.TokenTypes
import Text.ParserCombinators.UU
import Text.ParserCombinators.UU.BasicInstances
data MTokenPos = MTokenPos MToken Region
data RegionProgression = RegionProgression {RegionProgression -> Region
lastRegion :: Region, RegionProgression -> Region
nextRegion :: Region}
deriving (Int -> RegionProgression -> ShowS
[RegionProgression] -> ShowS
RegionProgression -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RegionProgression] -> ShowS
$cshowList :: [RegionProgression] -> ShowS
show :: RegionProgression -> String
$cshow :: RegionProgression -> String
showsPrec :: Int -> RegionProgression -> ShowS
$cshowsPrec :: Int -> RegionProgression -> ShowS
Show)
emptyRgPrgs :: RegionProgression
emptyRgPrgs :: RegionProgression
emptyRgPrgs = Region -> Region -> RegionProgression
RegionProgression Region
emptyRg Region
emptyRg
instance Show MTokenPos where
show :: MTokenPos -> String
show (MTokenPos MToken
tok Region
_) = forall a. Show a => a -> String
show MToken
tok
type AParser a = P (Str MTokenPos [MTokenPos] RegionProgression) a
instance IsLocationUpdatedBy RegionProgression MTokenPos where
advance :: RegionProgression -> MTokenPos -> RegionProgression
advance RegionProgression
_ (MTokenPos MToken
mt Region
p) = Region -> Region -> RegionProgression
RegionProgression (MToken -> Region
mpos MToken
mt) Region
p
resultsToRegion :: (a, [Error RegionProgression]) -> (a, [Error Region])
resultsToRegion :: forall a. (a, [Error RegionProgression]) -> (a, [Error Region])
resultsToRegion (a
a, [Error RegionProgression]
errs) = (a
a, forall a b. (a -> b) -> [a] -> [b]
map Error RegionProgression -> Error Region
errorToRegion [Error RegionProgression]
errs)
parseGLua :: [MToken] -> (AST, [Error Region])
parseGLua :: [MToken] -> (AST, [Error Region])
parseGLua [MToken]
mts =
let
([MToken]
cms, [MToken]
ts) = [MToken] -> ([MToken], [MToken])
splitComments forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. MToken -> Bool
isWhitespace) forall a b. (a -> b) -> a -> b
$ [MToken]
mts
in
forall a. (a, [Error RegionProgression]) -> (a, [Error Region])
resultsToRegion forall a b. (a -> b) -> a -> b
$ forall a. AParser a -> [MToken] -> (a, [Error RegionProgression])
execAParser ([MToken] -> AParser AST
parseChunk [MToken]
cms) [MToken]
ts
parseGLuaFromString :: String -> (AST, [Error Region])
parseGLuaFromString :: String -> (AST, [Error Region])
parseGLuaFromString = [MToken] -> (AST, [Error Region])
parseGLua forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. MToken -> Bool
isWhitespace) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ([MToken], [Error LineColPos])
Lex.execParseTokens
parseFromString :: AParser a -> String -> (a, [Error Region])
parseFromString :: forall a. AParser a -> String -> (a, [Error Region])
parseFromString AParser a
p = forall a. (a, [Error RegionProgression]) -> (a, [Error Region])
resultsToRegion forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. AParser a -> [MToken] -> (a, [Error RegionProgression])
execAParser AParser a
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. MToken -> Bool
isWhitespace) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ([MToken], [Error LineColPos])
Lex.execParseTokens
createString :: [MToken] -> Str MTokenPos [MTokenPos] RegionProgression
createString :: [MToken] -> Str MTokenPos [MTokenPos] RegionProgression
createString [] = forall s a loc. ListLike s a => loc -> s -> Str a s loc
createStr RegionProgression
emptyRgPrgs []
createString mts :: [MToken]
mts@(MToken Region
p Token
_ : [MToken]
xs) = forall s a loc. ListLike s a => loc -> s -> Str a s loc
createStr (Region -> Region -> RegionProgression
RegionProgression Region
p ([MToken] -> Region
nextRg [MToken]
mts')) [MTokenPos]
mtpos
where
mts' :: [MToken]
mts' = [MToken]
xs forall a. [a] -> [a] -> [a]
++ [forall a. [a] -> a
last [MToken]
mts]
mkMtPos :: MToken -> MToken -> MTokenPos
mkMtPos MToken
mt (MToken Region
p' Token
_) = MToken -> Region -> MTokenPos
MTokenPos MToken
mt Region
p'
mtpos :: [MTokenPos]
mtpos = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith MToken -> MToken -> MTokenPos
mkMtPos [MToken]
mts [MToken]
mts'
nextRg :: [MToken] -> Region
nextRg (MToken Region
p' Token
_ : [MToken]
_) = Region
p'
nextRg [] = forall a. HasCallStack => a
undefined
errorToRegion :: Error RegionProgression -> Error Region
errorToRegion :: Error RegionProgression -> Error Region
errorToRegion (Inserted String
a RegionProgression
p Strings
b) = forall pos. String -> pos -> Strings -> Error pos
Inserted String
a (RegionProgression -> Region
nextRegion RegionProgression
p) Strings
b
errorToRegion (Deleted String
a RegionProgression
p Strings
b) = forall pos. String -> pos -> Strings -> Error pos
Deleted String
a (RegionProgression -> Region
nextRegion RegionProgression
p) Strings
b
errorToRegion (Replaced String
a String
b RegionProgression
p Strings
c) = forall pos. String -> String -> pos -> Strings -> Error pos
Replaced String
a String
b (RegionProgression -> Region
nextRegion RegionProgression
p) Strings
c
errorToRegion (DeletedAtEnd String
s) = forall pos. String -> Error pos
DeletedAtEnd String
s
pPos' :: AParser Region
pPos' :: AParser Region
pPos' = RegionProgression -> Region
nextRegion forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall st pos. HasPosition st pos => P st pos
pPos
execAParser :: AParser a -> [MToken] -> (a, [Error RegionProgression])
execAParser :: forall a. AParser a -> [MToken] -> (a, [Error RegionProgression])
execAParser AParser a
p mts :: [MToken]
mts@[] = forall t a. Eof t => P t a -> t -> a
parse_h ((,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser a
p forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall st error. (StoresErrors st error, Eof st) => P st [error]
pEnd) forall b c a. (b -> c) -> (a -> b) -> a -> c
. [MToken] -> Str MTokenPos [MTokenPos] RegionProgression
createString forall a b. (a -> b) -> a -> b
$ [MToken]
mts
execAParser AParser a
p mts :: [MToken]
mts@(MToken
_ : [MToken]
_) = forall t a. Eof t => P t a -> t -> a
parse_h ((,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser a
p forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall st error. (StoresErrors st error, Eof st) => P st [error]
pEnd) forall b c a. (b -> c) -> (a -> b) -> a -> c
. [MToken] -> Str MTokenPos [MTokenPos] RegionProgression
createString forall a b. (a -> b) -> a -> b
$ [MToken]
mts
pMSatisfy :: (MToken -> Bool) -> Token -> String -> AParser MToken
pMSatisfy :: (MToken -> Bool) -> Token -> String -> AParser MToken
pMSatisfy MToken -> Bool
f Token
t String
ins = MTokenPos -> MToken
getToken forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall loc state a.
(Show a, IsLocationUpdatedBy loc a, ListLike state a) =>
(a -> Bool) -> Insertion a -> P (Str a state loc) a
pSatisfy MTokenPos -> Bool
f' (forall a. String -> a -> Int -> Insertion a
Insertion String
ins (MToken -> Region -> MTokenPos
MTokenPos (Region -> Token -> MToken
MToken Region
ep Token
t) Region
ep) Int
5)
where
f' :: MTokenPos -> Bool
f' :: MTokenPos -> Bool
f' (MTokenPos MToken
tok Region
_) = MToken -> Bool
f MToken
tok
getToken :: MTokenPos -> MToken
getToken :: MTokenPos -> MToken
getToken (MTokenPos MToken
t' Region
_) = MToken
t'
ep :: Region
ep = LineColPos -> LineColPos -> Region
Region (Int -> Int -> Int -> LineColPos
LineColPos Int
0 Int
0 Int
0) (Int -> Int -> Int -> LineColPos
LineColPos Int
0 Int
0 Int
0)
pMTok :: Token -> AParser MToken
pMTok :: Token -> AParser MToken
pMTok Token
t = (MToken -> Bool) -> Token -> String -> AParser MToken
pMSatisfy MToken -> Bool
isToken Token
t forall a b. (a -> b) -> a -> b
$ String
"'" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Token
t forall a. [a] -> [a] -> [a]
++ String
"'"
where
isToken :: MToken -> Bool
isToken :: MToken -> Bool
isToken (MToken Region
_ Token
tok) = Token
t forall a. Eq a => a -> a -> Bool
== Token
tok
parseNameList :: AParser [MToken]
parseNameList :: AParser [MToken]
parseNameList = (:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser MToken
pName forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (p :: * -> *) a. IsParser p => p a -> p [a]
pMany (Token -> AParser MToken
pMTok Token
Comma forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> AParser MToken
pName)
parseParList :: AParser [MToken]
parseParList :: AParser [MToken]
parseParList =
(Token -> AParser MToken
pMTok Token
VarArg forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> AParser MToken
pName)
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> ( Token -> AParser MToken
pMTok Token
Comma
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> ( (\MToken
a MToken
_ MToken
c -> [MToken
c, MToken
a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
VarArg
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> (\[MToken]
a MToken
_ MToken
c -> MToken
c forall a. a -> [a] -> [a]
: [MToken]
a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser [MToken]
parseParList
)
forall (p :: * -> *) a. ExtAlternative p => p a -> a -> p a
`opt` (forall a. a -> [a] -> [a]
: [])
)
forall (p :: * -> *) a. ExtAlternative p => p a -> a -> p a
`opt` []
parseChunk :: [MToken] -> AParser AST
parseChunk :: [MToken] -> AParser AST
parseChunk [MToken]
cms = [MToken] -> Block -> AST
AST [MToken]
cms forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser Block
parseBlock
parseBlock :: AParser Block
parseBlock :: AParser Block
parseBlock = MStatList -> AReturn -> Block
Block forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a b. AParser a -> AParser b -> AParser [b]
pInterleaved (Token -> AParser MToken
pMTok Token
Semicolon) AParser MStat
parseMStat forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (P (Str MTokenPos [MTokenPos] RegionProgression) AReturn
parseReturn forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall (p :: * -> *) a. Applicative p => a -> p a
pReturn AReturn
NoReturn)
annotated :: (Region -> a -> b) -> AParser a -> AParser b
annotated :: forall a b. (Region -> a -> b) -> AParser a -> AParser b
annotated Region -> a -> b
f AParser a
p = (\Region
s a
t Str MTokenPos [MTokenPos] RegionProgression
e -> Region -> a -> b
f (LineColPos -> LineColPos -> Region
Region (Region -> LineColPos
rgStart Region
s) (Region -> LineColPos
rgEnd forall a b. (a -> b) -> a -> b
$ RegionProgression -> Region
lastRegion forall a b. (a -> b) -> a -> b
$ forall a s loc. Str a s loc -> loc
pos forall a b. (a -> b) -> a -> b
$ Str MTokenPos [MTokenPos] RegionProgression
e)) a
t) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser Region
pPos' forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser a
p forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall st. P st st
pState
parseMStat :: AParser MStat
parseMStat :: AParser MStat
parseMStat = forall a b. (Region -> a -> b) -> AParser a -> AParser b
annotated Region -> Stat -> MStat
MStat AParser Stat
parseStat
pInterleaved :: AParser a -> AParser b -> AParser [b]
pInterleaved :: forall a b. AParser a -> AParser b -> AParser [b]
pInterleaved AParser a
sep AParser b
q = forall (p :: * -> *) a. IsParser p => p a -> p [a]
pMany AParser a
sep forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall (p :: * -> *) a. IsParser p => p a -> p [a]
pMany (AParser b
q forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall (p :: * -> *) a. IsParser p => p a -> p [a]
pMany AParser a
sep)
parseCallDef :: AParser Stat
parseCallDef :: AParser Stat
parseCallDef =
AParser Stat
parseGoto
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> ( MToken -> ExprSuffixList -> PrefixExp
PFVar
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser MToken
pName
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> MExpr -> ExprSuffixList -> PrefixExp
ExprVar
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
LRound
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MExpr
parseExpression
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
RRound
)
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> (
P (Str MTokenPos [MTokenPos] RegionProgression)
((ExprSuffixList -> PrefixExp) -> Stat)
contSearch
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall b. ([PrefixExp] -> [MExpr] -> b) -> AParser b
varDecl [PrefixExp] -> [MExpr] -> (ExprSuffixList -> PrefixExp) -> Stat
namedVarDecl
)
where
parseGoto :: AParser Stat
parseGoto :: AParser Stat
parseGoto =
(MToken -> ExprSuffixList -> PrefixExp
PFVar forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok (String -> Token
Identifier String
"goto"))
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> ( (\MToken
n ExprSuffixList -> PrefixExp
_ -> MToken -> Stat
AGoto MToken
n)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser MToken
pName
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> P (Str MTokenPos [MTokenPos] RegionProgression)
((ExprSuffixList -> PrefixExp) -> Stat)
contSearch
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall b. ([PrefixExp] -> [MExpr] -> b) -> AParser b
varDecl [PrefixExp] -> [MExpr] -> (ExprSuffixList -> PrefixExp) -> Stat
namedVarDecl
)
namedVarDecl :: [PrefixExp] -> [MExpr] -> (ExprSuffixList -> PrefixExp) -> Stat
namedVarDecl :: [PrefixExp] -> [MExpr] -> (ExprSuffixList -> PrefixExp) -> Stat
namedVarDecl [PrefixExp]
vars [MExpr]
exprs ExprSuffixList -> PrefixExp
pfe = let pfes :: [PrefixExp]
pfes = (ExprSuffixList -> PrefixExp
pfe []) forall a. a -> [a] -> [a]
: [PrefixExp]
vars in VarsList -> Stat
Def (forall a b. [a] -> [b] -> [(a, b)]
zip [PrefixExp]
pfes forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a. a -> Maybe a
Just [MExpr]
exprs forall a. [a] -> [a] -> [a]
++ forall a. a -> [a]
repeat forall a. Maybe a
Nothing)
varDecl :: ([PrefixExp] -> [MExpr] -> b) -> AParser b
varDecl :: forall b. ([PrefixExp] -> [MExpr] -> b) -> AParser b
varDecl [PrefixExp] -> [MExpr] -> b
f =
[PrefixExp] -> [MExpr] -> b
f
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (p :: * -> *) a. ExtAlternative p => p a -> a -> p a
opt (Token -> AParser MToken
pMTok Token
Comma forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> P (Str MTokenPos [MTokenPos] RegionProgression) [PrefixExp]
parseVarList) []
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
Equals
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser [MExpr]
parseExpressionList
contSearch :: AParser ((ExprSuffixList -> PrefixExp) -> Stat)
contSearch :: P (Str MTokenPos [MTokenPos] RegionProgression)
((ExprSuffixList -> PrefixExp) -> Stat)
contSearch = (\(ExprSuffixList
ss, PrefixExp -> Stat
mkStat) ExprSuffixList -> PrefixExp
pfe -> PrefixExp -> Stat
mkStat forall a b. (a -> b) -> a -> b
$ ExprSuffixList -> PrefixExp
pfe ExprSuffixList
ss) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser (ExprSuffixList, PrefixExp -> Stat)
searchDeeper
searchDeeper :: AParser ([PFExprSuffix], PrefixExp -> Stat)
searchDeeper :: AParser (ExprSuffixList, PrefixExp -> Stat)
searchDeeper =
(AParser PFExprSuffix
pPFExprCallSuffix forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> ((ExprSuffixList, PrefixExp -> Stat)
-> PFExprSuffix -> (ExprSuffixList, PrefixExp -> Stat)
mergeDeeperSearch forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser (ExprSuffixList, PrefixExp -> Stat)
searchDeeper forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall (p :: * -> *) a. Applicative p => a -> p a
pReturn (\PFExprSuffix
s -> ([PFExprSuffix
s], PrefixExp -> Stat
AFuncCall))))
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> (AParser PFExprSuffix
pPFExprIndexSuffix forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> ((ExprSuffixList, PrefixExp -> Stat)
-> PFExprSuffix -> (ExprSuffixList, PrefixExp -> Stat)
mergeDeeperSearch forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser (ExprSuffixList, PrefixExp -> Stat)
searchDeeper forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall b. ([PrefixExp] -> [MExpr] -> b) -> AParser b
varDecl [PrefixExp]
-> [MExpr] -> PFExprSuffix -> (ExprSuffixList, PrefixExp -> Stat)
complexDecl))
mergeDeeperSearch :: ([PFExprSuffix], PrefixExp -> Stat) -> PFExprSuffix -> ([PFExprSuffix], PrefixExp -> Stat)
mergeDeeperSearch :: (ExprSuffixList, PrefixExp -> Stat)
-> PFExprSuffix -> (ExprSuffixList, PrefixExp -> Stat)
mergeDeeperSearch (ExprSuffixList
ss, PrefixExp -> Stat
f) PFExprSuffix
s = (PFExprSuffix
s forall a. a -> [a] -> [a]
: ExprSuffixList
ss, PrefixExp -> Stat
f)
complexDecl :: [PrefixExp] -> [MExpr] -> PFExprSuffix -> ([PFExprSuffix], PrefixExp -> Stat)
complexDecl :: [PrefixExp]
-> [MExpr] -> PFExprSuffix -> (ExprSuffixList, PrefixExp -> Stat)
complexDecl [PrefixExp]
vars [MExpr]
exprs PFExprSuffix
s = ([PFExprSuffix
s], \PrefixExp
pf -> VarsList -> Stat
Def (forall a b. [a] -> [b] -> [(a, b)]
zip (PrefixExp
pf forall a. a -> [a] -> [a]
: [PrefixExp]
vars) forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a. a -> Maybe a
Just [MExpr]
exprs forall a. [a] -> [a] -> [a]
++ forall a. a -> [a]
repeat forall a. Maybe a
Nothing))
parseStat :: AParser Stat
parseStat :: AParser Stat
parseStat =
AParser Stat
parseCallDef
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> MToken -> Stat
ALabel
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser MToken
parseLabel
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> Stat
ABreak
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Break
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> Stat
AContinue
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Continue
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|>
Block -> Stat
ADo
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Do
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser Block
parseBlock
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
End
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> MExpr -> Block -> Stat
AWhile
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
While
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MExpr
parseExpression
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
Do
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser Block
parseBlock
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
End
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> Block -> MExpr -> Stat
ARepeat
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Repeat
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser Block
parseBlock
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
Until
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MExpr
parseExpression
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> AParser Stat
parseIf
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> AParser Stat
parseFor
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> FuncName -> [MToken] -> Block -> Stat
AFunc
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Function
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser FuncName
parseFuncName
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (p :: * -> *) b1 b2 a.
IsParser p =>
p b1 -> p b2 -> p a -> p a
pPacked (Token -> AParser MToken
pMTok Token
LRound) (Token -> AParser MToken
pMTok Token
RRound) AParser [MToken]
parseParList
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser Block
parseBlock
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
End
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|>
Token -> AParser MToken
pMTok Token
Local
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> (
(\FuncName
n [MToken]
p Block
b MToken
_l -> FuncName -> [MToken] -> Block -> Stat
ALocFunc FuncName
n [MToken]
p Block
b)
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Function
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser FuncName
parseLocFuncName
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (p :: * -> *) b1 b2 a.
IsParser p =>
p b1 -> p b2 -> p a -> p a
pPacked (Token -> AParser MToken
pMTok Token
LRound) (Token -> AParser MToken
pMTok Token
RRound) AParser [MToken]
parseParList
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser Block
parseBlock
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
End
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|>
(\[PrefixExp]
v (Region
_p, [MExpr]
e) MToken
_l -> VarsList -> Stat
LocDef (forall a b. [a] -> [b] -> [(a, b)]
zip [PrefixExp]
v forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a. a -> Maybe a
Just [MExpr]
e forall a. [a] -> [a] -> [a]
++ forall a. a -> [a]
repeat forall a. Maybe a
Nothing))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> P (Str MTokenPos [MTokenPos] RegionProgression) [PrefixExp]
parseLocalVarList
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((,) forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Equals forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser Region
pPos' forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser [MExpr]
parseExpressionList forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> (,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser Region
pPos' forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (p :: * -> *) a. Applicative p => a -> p a
pReturn [])
)
parseIf :: AParser Stat
parseIf :: AParser Stat
parseIf =
MExpr -> Block -> ElseIfList -> Else -> Stat
AIf
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
If
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MExpr
parseExpression
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
Then
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser Block
parseBlock
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
forall (p :: * -> *) a. IsParser p => p a -> p [a]
pMany (forall a b. (Region -> a -> b) -> AParser a -> AParser b
annotated Region -> ElseIf -> MElseIf
MElseIf forall a b. (a -> b) -> a -> b
$ (,) forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Elseif forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MExpr
parseExpression forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
Then forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser Block
parseBlock)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (forall a b. (Region -> a -> b) -> AParser a -> AParser b
annotated Region -> Block -> MElse
MElse forall a b. (a -> b) -> a -> b
$ Token -> AParser MToken
pMTok Token
Else forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> AParser Block
parseBlock)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
End
parseFor :: AParser Stat
parseFor :: AParser Stat
parseFor = do
Token -> AParser MToken
pMTok Token
For
MToken
firstName <- AParser MToken
pName
Bool
isNumericLoop <- (forall a b. a -> b -> a
const Bool
True forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
Equals forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const Bool
False forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (p :: * -> *) a. Applicative p => a -> p a
pReturn ())
if Bool
isNumericLoop
then do
MExpr
startExp <- AParser MExpr
parseExpression
Token -> AParser MToken
pMTok Token
Comma
MExpr
toExp <- AParser MExpr
parseExpression
MExpr
step <- Token -> AParser MToken
pMTok Token
Comma forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> AParser MExpr
parseExpression forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> Region -> Expr -> MExpr
MExpr forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser Region
pPos' forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (p :: * -> *) a. Applicative p => a -> p a
pReturn (String -> Expr
ANumber String
"1")
Token -> AParser MToken
pMTok Token
Do
Block
block <- AParser Block
parseBlock
Token -> AParser MToken
pMTok Token
End
forall (p :: * -> *) a. Applicative p => a -> p a
pReturn forall a b. (a -> b) -> a -> b
$ MToken -> MExpr -> MExpr -> MExpr -> Block -> Stat
ANFor MToken
firstName MExpr
startExp MExpr
toExp MExpr
step Block
block
else do
[MToken]
vars <- (:) MToken
firstName forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Comma forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser [MToken]
parseNameList forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall (p :: * -> *) a. Applicative p => a -> p a
pReturn [MToken
firstName]
Token -> AParser MToken
pMTok Token
In
[MExpr]
exprs <- AParser [MExpr]
parseExpressionList
Token -> AParser MToken
pMTok Token
Do
Block
block <- AParser Block
parseBlock
Token -> AParser MToken
pMTok Token
End
forall (p :: * -> *) a. Applicative p => a -> p a
pReturn forall a b. (a -> b) -> a -> b
$ [MToken] -> [MExpr] -> Block -> Stat
AGFor [MToken]
vars [MExpr]
exprs Block
block
parseReturn :: AParser AReturn
parseReturn :: P (Str MTokenPos [MTokenPos] RegionProgression) AReturn
parseReturn = Region -> [MExpr] -> AReturn
AReturn forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser Region
pPos' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
Return forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (p :: * -> *) a. ExtAlternative p => p a -> a -> p a
opt AParser [MExpr]
parseExpressionList [] forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall (p :: * -> *) a. IsParser p => p a -> p [a]
pMany (Token -> AParser MToken
pMTok Token
Semicolon)
parseLabel :: AParser MToken
parseLabel :: AParser MToken
parseLabel = (MToken -> Bool) -> Token -> String -> AParser MToken
pMSatisfy MToken -> Bool
isLabel (String -> String -> String -> Token
Label String
"" String
"someLabel" String
"") String
"Some label"
where
isLabel :: MToken -> Bool
isLabel :: MToken -> Bool
isLabel (MToken Region
_ (Label{})) = Bool
True
isLabel MToken
_ = Bool
False
parseFuncName :: AParser FuncName
parseFuncName :: AParser FuncName
parseFuncName =
(\MToken
a [MToken]
b Maybe MToken
c -> [MToken] -> Maybe MToken -> FuncName
FuncName (MToken
a forall a. a -> [a] -> [a]
: [MToken]
b) Maybe MToken
c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser MToken
pName
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (p :: * -> *) a. IsParser p => p a -> p [a]
pMany (Token -> AParser MToken
pMTok Token
Dot forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> AParser MToken
pName)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (p :: * -> *) a. ExtAlternative p => p a -> a -> p a
opt (forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Colon forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MToken
pName) forall a. Maybe a
Nothing
parseLocFuncName :: AParser FuncName
parseLocFuncName :: AParser FuncName
parseLocFuncName = (\MToken
a -> [MToken] -> Maybe MToken -> FuncName
FuncName [MToken
a] forall a. Maybe a
Nothing) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser MToken
pName
parseNumber :: AParser Expr
parseNumber :: AParser Expr
parseNumber = MToken -> Expr
toAnumber forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (MToken -> Bool) -> Token -> String -> AParser MToken
pMSatisfy MToken -> Bool
isNumber (String -> Token
TNumber String
"0") String
"Number"
where
isNumber :: MToken -> Bool
isNumber :: MToken -> Bool
isNumber (MToken Region
_ (TNumber String
_)) = Bool
True
isNumber MToken
_ = Bool
False
toAnumber :: MToken -> Expr
toAnumber :: MToken -> Expr
toAnumber = \case
(MToken Region
_ (TNumber String
str)) -> String -> Expr
ANumber String
str
MToken
_ -> forall a. HasCallStack => String -> a
error String
"unreachable"
parseString :: AParser MToken
parseString :: AParser MToken
parseString = (MToken -> Bool) -> Token -> String -> AParser MToken
pMSatisfy MToken -> Bool
isString (String -> Token
DQString String
"someString") String
"String"
where
isString :: MToken -> Bool
isString :: MToken -> Bool
isString (MToken Region
_ (DQString String
_)) = Bool
True
isString (MToken Region
_ (SQString String
_)) = Bool
True
isString (MToken Region
_ (MLString String
_)) = Bool
True
isString MToken
_ = Bool
False
pName :: AParser MToken
pName :: AParser MToken
pName = (MToken -> Bool) -> Token -> String -> AParser MToken
pMSatisfy MToken -> Bool
isName (String -> Token
Identifier String
"someVariable") String
"Variable"
where
isName :: MToken -> Bool
isName :: MToken -> Bool
isName (MToken Region
_ (Identifier String
_)) = Bool
True
isName MToken
_ = Bool
False
parseVarList :: AParser [PrefixExp]
parseVarList :: P (Str MTokenPos [MTokenPos] RegionProgression) [PrefixExp]
parseVarList = forall (p :: * -> *) a1 a. IsParser p => p a1 -> p a -> p [a]
pList1Sep (Token -> AParser MToken
pMTok Token
Comma) AParser PrefixExp
parseVar
parseLocalVarList :: AParser [PrefixExp]
parseLocalVarList :: P (Str MTokenPos [MTokenPos] RegionProgression) [PrefixExp]
parseLocalVarList = forall (p :: * -> *) a1 a. IsParser p => p a1 -> p a -> p [a]
pList1Sep (Token -> AParser MToken
pMTok Token
Comma) (MToken -> ExprSuffixList -> PrefixExp
PFVar forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser MToken
pName forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Applicative f => a -> f a
pure [])
parseExpressionList :: AParser [MExpr]
parseExpressionList :: AParser [MExpr]
parseExpressionList = forall (p :: * -> *) a1 a. IsParser p => p a1 -> p a -> p [a]
pList1Sep (Token -> AParser MToken
pMTok Token
Comma) AParser MExpr
parseExpression
parseSubExpression :: AParser Expr
parseSubExpression :: AParser Expr
parseSubExpression =
Expr
ANil
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Nil
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> Expr
AFalse
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
TFalse
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> Expr
ATrue
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
TTrue
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> AParser Expr
parseNumber
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> MToken -> Expr
AString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser MToken
parseString
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> Expr
AVarArg
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
VarArg
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> AParser Expr
parseAnonymFunc
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> PrefixExp -> Expr
APrefixExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser PrefixExp
parsePrefixExp
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> FieldList -> Expr
ATableConstructor
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser FieldList
parseTableConstructor
parseAnonymFunc :: AParser Expr
parseAnonymFunc :: AParser Expr
parseAnonymFunc =
[MToken] -> Block -> Expr
AnonymousFunc
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Function
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (p :: * -> *) b1 b2 a.
IsParser p =>
p b1 -> p b2 -> p a -> p a
pPacked (Token -> AParser MToken
pMTok Token
LRound) (Token -> AParser MToken
pMTok Token
RRound) AParser [MToken]
parseParList
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser Block
parseBlock
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
End
samePrioL :: [(Token, BinOp)] -> AParser MExpr -> AParser MExpr
samePrioL :: [(Token, BinOp)] -> AParser MExpr -> AParser MExpr
samePrioL [(Token, BinOp)]
ops AParser MExpr
pr = forall (p :: * -> *) c. IsParser p => p (c -> c -> c) -> p c -> p c
pChainl (forall {t :: * -> *} {p :: * -> *} {a}.
(Foldable t, ExtAlternative p) =>
t (p a) -> p a
choice (forall a b. (a -> b) -> [a] -> [b]
map (Token, BinOp) -> AParser (MExpr -> MExpr -> MExpr)
f [(Token, BinOp)]
ops)) AParser MExpr
pr
where
choice :: t (p a) -> p a
choice = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
(<<|>) forall (p :: * -> *) a. Alternative p => p a
pFail
f :: (Token, BinOp) -> AParser (MExpr -> MExpr -> MExpr)
f :: (Token, BinOp) -> AParser (MExpr -> MExpr -> MExpr)
f (Token
t, BinOp
at) = (\Region
p MExpr
e1 MExpr
e2 -> Region -> Expr -> MExpr
MExpr Region
p (BinOp -> MExpr -> MExpr -> Expr
BinOpExpr BinOp
at MExpr
e1 MExpr
e2)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser Region
pPos' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
t
samePrioR :: [(Token, BinOp)] -> AParser MExpr -> AParser MExpr
samePrioR :: [(Token, BinOp)] -> AParser MExpr -> AParser MExpr
samePrioR [(Token, BinOp)]
ops AParser MExpr
pr = forall (p :: * -> *) c. IsParser p => p (c -> c -> c) -> p c -> p c
pChainr (forall {t :: * -> *} {p :: * -> *} {a}.
(Foldable t, ExtAlternative p) =>
t (p a) -> p a
choice (forall a b. (a -> b) -> [a] -> [b]
map (Token, BinOp) -> AParser (MExpr -> MExpr -> MExpr)
f [(Token, BinOp)]
ops)) AParser MExpr
pr
where
choice :: t (p a) -> p a
choice = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
(<<|>) forall (p :: * -> *) a. Alternative p => p a
pFail
f :: (Token, BinOp) -> AParser (MExpr -> MExpr -> MExpr)
f :: (Token, BinOp) -> AParser (MExpr -> MExpr -> MExpr)
f (Token
t, BinOp
at) = (\Region
p MExpr
e1 MExpr
e2 -> Region -> Expr -> MExpr
MExpr Region
p (BinOp -> MExpr -> MExpr -> Expr
BinOpExpr BinOp
at MExpr
e1 MExpr
e2)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser Region
pPos' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
t
parseUnOp :: AParser UnOp
parseUnOp :: AParser UnOp
parseUnOp =
UnOp
UnMinus
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Minus
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> UnOp
ANot
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Not
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> UnOp
ANot
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
CNot
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> UnOp
AHash
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Hash
lvl1, lvl2, lvl3, lvl4, lvl5, lvl6, lvl8 :: [(Token, BinOp)]
lvl1 :: [(Token, BinOp)]
lvl1 = [(Token
Or, BinOp
AOr), (Token
COr, BinOp
AOr)]
lvl2 :: [(Token, BinOp)]
lvl2 = [(Token
And, BinOp
AAnd), (Token
CAnd, BinOp
AAnd)]
lvl3 :: [(Token, BinOp)]
lvl3 = [(Token
TLT, BinOp
ALT), (Token
TGT, BinOp
AGT), (Token
TLEQ, BinOp
ALEQ), (Token
TGEQ, BinOp
AGEQ), (Token
TNEq, BinOp
ANEq), (Token
TCNEq, BinOp
ANEq), (Token
TEq, BinOp
AEq)]
lvl4 :: [(Token, BinOp)]
lvl4 = [(Token
Concatenate, BinOp
AConcatenate)]
lvl5 :: [(Token, BinOp)]
lvl5 = [(Token
Plus, BinOp
APlus), (Token
Minus, BinOp
BinMinus)]
lvl6 :: [(Token, BinOp)]
lvl6 = [(Token
Multiply, BinOp
AMultiply), (Token
Divide, BinOp
ADivide), (Token
Modulus, BinOp
AModulus)]
lvl8 :: [(Token, BinOp)]
lvl8 = [(Token
Power, BinOp
APower)]
parseExpression :: AParser MExpr
parseExpression :: AParser MExpr
parseExpression =
[(Token, BinOp)] -> AParser MExpr -> AParser MExpr
samePrioL [(Token, BinOp)]
lvl1 forall a b. (a -> b) -> a -> b
$
[(Token, BinOp)] -> AParser MExpr -> AParser MExpr
samePrioL [(Token, BinOp)]
lvl2 forall a b. (a -> b) -> a -> b
$
[(Token, BinOp)] -> AParser MExpr -> AParser MExpr
samePrioL [(Token, BinOp)]
lvl3 forall a b. (a -> b) -> a -> b
$
[(Token, BinOp)] -> AParser MExpr -> AParser MExpr
samePrioR [(Token, BinOp)]
lvl4 forall a b. (a -> b) -> a -> b
$
[(Token, BinOp)] -> AParser MExpr -> AParser MExpr
samePrioL [(Token, BinOp)]
lvl5 forall a b. (a -> b) -> a -> b
$
[(Token, BinOp)] -> AParser MExpr -> AParser MExpr
samePrioL [(Token, BinOp)]
lvl6 forall a b. (a -> b) -> a -> b
$
Region -> Expr -> MExpr
MExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser Region
pPos'
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (UnOp -> MExpr -> Expr
UnOpExpr forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser UnOp
parseUnOp forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MExpr
parseExpression)
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> [(Token, BinOp)] -> AParser MExpr -> AParser MExpr
samePrioR [(Token, BinOp)]
lvl8 (Region -> Expr -> MExpr
MExpr forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser Region
pPos' forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (AParser Expr
parseSubExpression forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> UnOp -> MExpr -> Expr
UnOpExpr forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser UnOp
parseUnOp forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MExpr
parseExpression))
parseBinOp :: AParser BinOp
parseBinOp :: AParser BinOp
parseBinOp =
forall a b. a -> b -> a
const BinOp
AOr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
Or
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
AOr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
COr
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
AAnd
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
And
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
AAnd
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
CAnd
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
ALT
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
TLT
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
AGT
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
TGT
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
ALEQ
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
TLEQ
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
AGEQ
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
TGEQ
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
ANEq
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
TNEq
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
ANEq
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
TCNEq
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
AEq
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
TEq
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
AConcatenate
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
Concatenate
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
APlus
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
Plus
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
BinMinus
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
Minus
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
AMultiply
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
Multiply
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
ADivide
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
Divide
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
AModulus
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
Modulus
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall a b. a -> b -> a
const BinOp
APower
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Token -> AParser MToken
pMTok Token
Power
parsePrefixExp :: AParser PrefixExp
parsePrefixExp :: AParser PrefixExp
parsePrefixExp = AParser ExprSuffixList -> AParser PrefixExp
pPrefixExp (forall (p :: * -> *) a. IsParser p => p a -> p [a]
pMany AParser PFExprSuffix
pPFExprSuffix)
pPrefixExp :: AParser [PFExprSuffix] -> AParser PrefixExp
pPrefixExp :: AParser ExprSuffixList -> AParser PrefixExp
pPrefixExp AParser ExprSuffixList
suffixes =
MToken -> ExprSuffixList -> PrefixExp
PFVar
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser MToken
pName
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser ExprSuffixList
suffixes
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> MExpr -> ExprSuffixList -> PrefixExp
ExprVar
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
LRound
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MExpr
parseExpression
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
RRound
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser ExprSuffixList
suffixes
pPFExprSuffix :: AParser PFExprSuffix
pPFExprSuffix :: AParser PFExprSuffix
pPFExprSuffix = AParser PFExprSuffix
pPFExprCallSuffix forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> AParser PFExprSuffix
pPFExprIndexSuffix
pPFExprCallSuffix :: AParser PFExprSuffix
pPFExprCallSuffix :: AParser PFExprSuffix
pPFExprCallSuffix =
Args -> PFExprSuffix
Call
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser Args
parseArgs
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> MToken -> Args -> PFExprSuffix
MetaCall
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Colon
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MToken
pName
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser Args
parseArgs
pPFExprIndexSuffix :: AParser PFExprSuffix
pPFExprIndexSuffix :: AParser PFExprSuffix
pPFExprIndexSuffix =
MExpr -> PFExprSuffix
ExprIndex
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
LSquare
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MExpr
parseExpression
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
RSquare
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> MToken -> PFExprSuffix
DotIndex
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Dot
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MToken
pName
pFunctionCall :: AParser PrefixExp
pFunctionCall :: AParser PrefixExp
pFunctionCall = AParser ExprSuffixList -> AParser PrefixExp
pPrefixExp AParser ExprSuffixList
suffixes
where
suffixes :: AParser ExprSuffixList
suffixes =
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (p :: * -> *) a. IsParser p => p a -> p [a]
pSome
( (\ExprSuffixList
ix PFExprSuffix
c -> ExprSuffixList
ix forall a. [a] -> [a] -> [a]
++ [PFExprSuffix
c])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (p :: * -> *) a. IsParser p => p a -> p [a]
pSome AParser PFExprSuffix
pPFExprIndexSuffix
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser PFExprSuffix
pPFExprCallSuffix
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> (forall a. a -> [a] -> [a]
: [])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser PFExprSuffix
pPFExprCallSuffix
)
parseVar :: AParser PrefixExp
parseVar :: AParser PrefixExp
parseVar = AParser ExprSuffixList -> AParser PrefixExp
pPrefixExp AParser ExprSuffixList
suffixes
where
suffixes :: AParser ExprSuffixList
suffixes =
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (p :: * -> *) a. IsParser p => p a -> p [a]
pMany
( (\ExprSuffixList
c PFExprSuffix
ix -> ExprSuffixList
c forall a. [a] -> [a] -> [a]
++ [PFExprSuffix
ix])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (p :: * -> *) a. IsParser p => p a -> p [a]
pSome AParser PFExprSuffix
pPFExprCallSuffix
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser PFExprSuffix
pPFExprIndexSuffix
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> (forall a. a -> [a] -> [a]
: [])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser PFExprSuffix
pPFExprIndexSuffix
)
parseArgs :: AParser Args
parseArgs :: AParser Args
parseArgs =
[MExpr] -> Args
ListArgs
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
LRound
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (p :: * -> *) a. ExtAlternative p => p a -> a -> p a
opt AParser [MExpr]
parseExpressionList []
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
RRound
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> FieldList -> Args
TableArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser FieldList
parseTableConstructor
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> MToken -> Args
StringArg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser MToken
parseString
parseTableConstructor :: AParser [Field]
parseTableConstructor :: AParser FieldList
parseTableConstructor = Token -> AParser MToken
pMTok Token
LCurly forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> AParser FieldList
parseFieldList forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
RCurly
parseFieldList :: AParser [Field]
parseFieldList :: AParser FieldList
parseFieldList =
AParser (FieldSep -> Field)
parseField
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> ( AParser FieldSep
parseFieldSep
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> ((\FieldList
rest FieldSep
sep FieldSep -> Field
field -> FieldSep -> Field
field FieldSep
sep forall a. a -> [a] -> [a]
: FieldList
rest) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (AParser FieldList
parseFieldList forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure []))
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure (\FieldSep -> Field
field -> [FieldSep -> Field
field FieldSep
NoSep])
)
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> forall (f :: * -> *) a. Applicative f => a -> f a
pure []
makeUnNamedField :: Maybe (BinOp, MExpr) -> ExprSuffixList -> (Region, MToken) -> (FieldSep -> Field)
makeUnNamedField :: Maybe (BinOp, MExpr)
-> ExprSuffixList -> (Region, MToken) -> FieldSep -> Field
makeUnNamedField Maybe (BinOp, MExpr)
Nothing ExprSuffixList
sfs (Region
p, MToken
nm) = MExpr -> FieldSep -> Field
UnnamedField forall a b. (a -> b) -> a -> b
$ Region -> Expr -> MExpr
MExpr Region
p forall a b. (a -> b) -> a -> b
$ PrefixExp -> Expr
APrefixExpr forall a b. (a -> b) -> a -> b
$ MToken -> ExprSuffixList -> PrefixExp
PFVar MToken
nm ExprSuffixList
sfs
makeUnNamedField (Just (BinOp
op, MExpr
mexpr)) ExprSuffixList
sfs (Region
p, MToken
nm) = MExpr -> FieldSep -> Field
UnnamedField forall a b. (a -> b) -> a -> b
$ Region -> Expr -> MExpr
MExpr Region
p forall a b. (a -> b) -> a -> b
$ (Expr -> MExpr -> Expr
merge (PrefixExp -> Expr
APrefixExpr forall a b. (a -> b) -> a -> b
$ MToken -> ExprSuffixList -> PrefixExp
PFVar MToken
nm ExprSuffixList
sfs) MExpr
mexpr)
where
merge :: Expr -> MExpr -> Expr
merge :: Expr -> MExpr -> Expr
merge Expr
pf e :: MExpr
e@(MExpr Region
_ (BinOpExpr BinOp
op' MExpr
l MExpr
r)) =
if BinOp
op forall a. Ord a => a -> a -> Bool
> BinOp
op'
then BinOp -> MExpr -> MExpr -> Expr
BinOpExpr BinOp
op' (Region -> Expr -> MExpr
MExpr Region
p forall a b. (a -> b) -> a -> b
$ (Expr -> MExpr -> Expr
merge Expr
pf MExpr
l)) MExpr
r
else BinOp -> MExpr -> MExpr -> Expr
BinOpExpr BinOp
op (Region -> Expr -> MExpr
MExpr Region
p Expr
pf) MExpr
e
merge Expr
pf MExpr
e = BinOp -> MExpr -> MExpr -> Expr
BinOpExpr BinOp
op (Region -> Expr -> MExpr
MExpr Region
p Expr
pf) MExpr
e
parseField :: AParser (FieldSep -> Field)
parseField :: AParser (FieldSep -> Field)
parseField =
MExpr -> MExpr -> FieldSep -> Field
ExprField
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
LSquare
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MExpr
parseExpression
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
RSquare
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Token -> AParser MToken
pMTok Token
Equals
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MExpr
parseExpression
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> ( (,)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser Region
pPos'
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MToken
pName
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**>
( ((\MExpr
e (Region
_, MToken
n) -> MToken -> MExpr -> FieldSep -> Field
NamedField MToken
n MExpr
e) forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Equals forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MExpr
parseExpression)
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|>
forall (p :: * -> *) a. IsParser p => p a -> p [a]
pMany AParser PFExprSuffix
pPFExprSuffix
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> ( Maybe (BinOp, MExpr)
-> ExprSuffixList -> (Region, MToken) -> FieldSep -> Field
makeUnNamedField
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (
forall a b c. ((a, b) -> c) -> a -> b -> c
curry forall a. a -> Maybe a
Just
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser BinOp
parseBinOp
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AParser MExpr
parseExpression
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|>
forall (p :: * -> *) a. Applicative p => a -> p a
pReturn forall a. Maybe a
Nothing
)
)
)
)
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> MExpr -> FieldSep -> Field
UnnamedField
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AParser MExpr
parseExpression
parseFieldSep :: AParser FieldSep
parseFieldSep :: AParser FieldSep
parseFieldSep =
FieldSep
CommaSep
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Comma
forall (p :: * -> *) a. ExtAlternative p => p a -> p a -> p a
<<|> FieldSep
SemicolonSep
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Token -> AParser MToken
pMTok Token
Semicolon