{-# LANGUAGE OverloadedStrings #-}
module Funcons.GLLParser where
import Funcons.Types
import GLL.Combinators hiding (many, some, Char, parse)
import Data.Char (isAlphaNum, isLower)
import Text.Regex.Applicative hiding ((<**>), optional)
import Data.Text (pack)
import Numeric
type Parser a = BNF Token a
fct_parse :: String -> Funcons
fct_parse :: String -> Funcons
fct_parse = forall a. Parser a -> String -> a
parser_a Parser Funcons
pFuncons
fct_parse_either :: String -> Either String Funcons
fct_parse_either :: String -> Either String Funcons
fct_parse_either String
s = case forall a. Parser a -> String -> Either String [a]
parsesWithErrors Parser Funcons
pFuncons String
s of
Left String
err -> forall a b. a -> Either a b
Left String
err
Right [] -> forall a b. a -> Either a b
Left String
"no parse result"
Right [Funcons
f] -> forall a b. b -> Either a b
Right Funcons
f
Right [Funcons]
fs -> forall a b. a -> Either a b
Left String
"ambiguous parse result"
fvalue_parse :: String -> Funcons
fvalue_parse :: String -> Funcons
fvalue_parse = Values -> Funcons
FValue forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Values
fvalue_parse_
fvalue_parse_either :: String -> Either String Funcons
fvalue_parse_either :: String -> Either String Funcons
fvalue_parse_either = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Values -> Funcons
FValue forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Either String Values
fvalue_parse_either_
fvalue_parse_ :: String -> Values
fvalue_parse_ :: String -> Values
fvalue_parse_ = forall a. Parser a -> String -> a
parser_a Parser Values
pValues
fvalue_parse_either_ :: String -> Either String Values
fvalue_parse_either_ :: String -> Either String Values
fvalue_parse_either_ String
str = case forall a. Parser a -> String -> Either String [a]
parsesWithErrors Parser Values
pValues String
str of
Left String
err -> forall a b. a -> Either a b
Left String
err
Right [] -> forall a b. a -> Either a b
Left String
"no parse result"
Right [Values
f] -> forall a b. b -> Either a b
Right Values
f
Right [Values]
fs -> forall a b. a -> Either a b
Left String
"ambiguous parse result"
parse :: Parser a -> String -> a
parse :: forall a. Parser a -> String -> a
parse Parser a
p String
str = case forall a. Parser a -> String -> [a]
allParses Parser a
p String
str of [] -> forall a. HasCallStack => String -> a
error String
"no parse"
(a
a:[a]
_) -> a
a
parser_a :: Parser a -> String -> a
parser_a :: forall a. Parser a -> String -> a
parser_a Parser a
p String
string = case forall a. Parser a -> String -> [a]
allParses Parser a
p String
string of
[] -> forall a. HasCallStack => String -> a
error String
"no parse"
(a
f:[a]
_) -> a
f
allParses :: Parser a -> String -> [a]
allParses :: forall a. Parser a -> String -> [a]
allParses Parser a
p String
string = forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
CombinatorOptions -> s t a -> [t] -> [a]
GLL.Combinators.parseWithOptions [CombinatorOption
throwErrors] Parser a
p
(String -> [Token]
Funcons.GLLParser.lexer String
string)
parsesWithErrors :: Parser a -> String -> Either String [a]
parsesWithErrors :: forall a. Parser a -> String -> Either String [a]
parsesWithErrors Parser a
p String
string = case (String -> Either String [Token]
Funcons.GLLParser.lexerEither String
string) of
Left String
err -> forall a b. a -> Either a b
Left String
err
Right [Token]
ts -> forall t (s :: * -> * -> *) a.
(Show t, Parseable t, IsSymbExpr s) =>
CombinatorOptions -> s t a -> [t] -> Either String [a]
GLL.Combinators.parseWithOptionsAndError [] Parser a
p [Token]
ts
fct_lexerSettings :: LexerSettings
fct_lexerSettings = LexerSettings
emptyLanguage {
lineComment :: String
lineComment = String
"//"
, identifiers :: RE Char String
identifiers = RE Char String
lName
, keywords :: [String]
keywords = [String]
fct_keywords
, keychars :: String
keychars = String
fct_keychars
}
lexer :: String -> [Token]
lexer = forall t. SubsumesToken t => LexerSettings -> String -> [t]
GLL.Combinators.lexer LexerSettings
fct_lexerSettings
lexerEither :: String -> Either String [Token]
lexerEither = forall t.
SubsumesToken t =>
LexerSettings -> String -> Either String [t]
GLL.Combinators.lexerEither LexerSettings
fct_lexerSettings
fct_keywords :: [String]
fct_keywords = [String
"void", String
"depends", String
"forall", String
"type_abs"
,String
"typevar", String
"?", String
"*", String
"+", String
"|->", String
"=>"]
fct_keychars :: String
fct_keychars = String
"{}(),'\"[]|^&~"
lName :: RE Char String
lName = (:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s. (s -> Bool) -> RE s s
psym Char -> Bool
isLower forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (forall s. (s -> Bool) -> RE s s
psym (\Char
c -> Char -> Bool
isAlphaNum Char
c Bool -> Bool -> Bool
|| Char
c forall a. Eq a => a -> a -> Bool
== Char
'-'))
data FSuffix = SuffixComputesFrom Funcons
| SuffixSeq SeqSortOp
| SuffixSortUnion Funcons
| SuffixSortInter Funcons
| SuffixPower Funcons
pFuncons :: Parser Funcons
pFuncons :: Parser Funcons
pFuncons = String
"FUNCONS"
forall {t} {b :: * -> * -> *} {a}.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:= [Funcons] -> Funcons
FSet forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> forall {t} {s :: * -> * -> *} {b}.
(Show t, Ord t, IsSymbExpr s, SubsumesToken t) =>
s t b -> BNF t b
braces (forall t (s :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s, IsSymbExpr s2, IsAltExpr s2) =>
s t a -> s2 t b -> SymbExpr t [a]
multipleSepBy Parser Funcons
pFuncons (forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
','))
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Name -> [Funcons] -> Funcons
FApp Name
"list" forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> forall {t} {s :: * -> * -> *} {b}.
(Show t, Ord t, IsSymbExpr s, SubsumesToken t) =>
s t b -> BNF t b
brackets (forall t (s :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s, IsSymbExpr s2, IsAltExpr s2) =>
s t a -> s2 t b -> SymbExpr t [a]
multipleSepBy Parser Funcons
pFuncons (forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
','))
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> [Funcons] -> Funcons
FMap forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> forall {t} {s :: * -> * -> *} {b}.
(Show t, Ord t, IsSymbExpr s, SubsumesToken t) =>
s t b -> BNF t b
braces (forall t (s :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s, IsSymbExpr s2, IsAltExpr s2) =>
s t a -> s2 t b -> SymbExpr t [a]
multipleSepBy1 Parser Funcons
pKeyPair (forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
','))
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Funcons -> Funcons
FSortComputes forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ forall t. SubsumesToken t => String -> SymbExpr t String
keyword String
"=>" forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> Parser Funcons
pFuncons
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Funcons -> Funcons
FSortComplement forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'~' forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> Parser Funcons
pFuncons
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Funcons -> FSuffix -> Funcons
suffix_select forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> Parser Funcons
pFuncons forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> Parser FSuffix
pFSuffix
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Funcons -> FSuffix -> Funcons
suffix_select forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> forall {t} {s :: * -> * -> *} {b}.
(Show t, Ord t, IsSymbExpr s, SubsumesToken t) =>
s t b -> BNF t b
parens Parser Funcons
pFuncons forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> Parser FSuffix
pFSuffix
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Name -> Maybe (Either Funcons [Funcons]) -> Funcons
maybe_apply forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Name
pack forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> forall t. SubsumesToken t => SymbExpr t String
id_lit forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> forall t (s :: * -> * -> *) a.
(Show t, Ord t, IsSymbExpr s) =>
s t a -> SymbExpr t (Maybe a)
optional Parser (Either Funcons [Funcons])
pFunconss
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Values -> Funcons
FValue forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> Parser Values
pValues
where
maybe_apply :: Name -> Maybe (Either Funcons [Funcons]) -> Funcons
maybe_apply Name
nm Maybe (Either Funcons [Funcons])
Nothing = Name -> Funcons
FName Name
nm
maybe_apply Name
nm (Just (Right [Funcons]
args)) = Name -> [Funcons] -> Funcons
FApp Name
nm [Funcons]
args
maybe_apply Name
nm (Just (Left Funcons
arg)) = Name -> [Funcons] -> Funcons
FApp Name
nm [Funcons
arg]
suffix_select :: Funcons -> FSuffix -> Funcons
suffix_select Funcons
f1 FSuffix
s = case FSuffix
s of
SuffixComputesFrom Funcons
f2 -> Funcons -> Funcons -> Funcons
FSortComputesFrom Funcons
f1 Funcons
f2
SuffixSeq SeqSortOp
op -> Funcons -> SeqSortOp -> Funcons
FSortSeq Funcons
f1 SeqSortOp
op
SuffixSortUnion Funcons
f2 -> Funcons -> Funcons -> Funcons
FSortUnion Funcons
f1 Funcons
f2
SuffixSortInter Funcons
f2 -> Funcons -> Funcons -> Funcons
FSortInter Funcons
f1 Funcons
f2
SuffixPower Funcons
f2 -> Funcons -> Funcons -> Funcons
FSortPower Funcons
f1 Funcons
f2
pFSuffix :: Parser FSuffix
pFSuffix :: Parser FSuffix
pFSuffix = String
"FSUFFIX"
forall {t} {b :: * -> * -> *} {a}.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:=> Funcons -> FSuffix
SuffixComputesFrom forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ forall t. SubsumesToken t => String -> SymbExpr t String
keyword String
"=>" forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> Parser Funcons
pFuncons
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> SeqSortOp -> FSuffix
SuffixSeq forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> Parser SeqSortOp
pOp
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Funcons -> FSuffix
SuffixSortUnion forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'|' forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> Parser Funcons
pFuncons
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Funcons -> FSuffix
SuffixSortInter forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'&' forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> Parser Funcons
pFuncons
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> Funcons -> FSuffix
SuffixPower forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'^' forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> Parser Funcons
pFuncons
pFunconss :: Parser (Either Funcons [Funcons])
pFunconss :: Parser (Either Funcons [Funcons])
pFunconss = String
"FUNCONS-SEQUENCE"
forall {t} {b :: * -> * -> *} {a}.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<::= forall a b. a -> Either a b
Left forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> Parser Funcons
pFuncons
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> forall a b. b -> Either a b
Right forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {a}. [Either a [a]] -> [a]
merge forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> forall {t} {s :: * -> * -> *} {b}.
(Show t, Ord t, IsSymbExpr s, SubsumesToken t) =>
s t b -> BNF t b
parens (forall t (s :: * -> * -> *) (s2 :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s, IsSymbExpr s2, IsAltExpr s2) =>
s t a -> s2 t b -> SymbExpr t [a]
multipleSepBy Parser (Either Funcons [Funcons])
pFunconss (forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
','))
where merge :: [Either a [a]] -> [a]
merge = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall {a}. Either a [a] -> [a] -> [a]
op []
where op :: Either a [a] -> [a] -> [a]
op (Left a
f) [a]
acc = a
fforall a. a -> [a] -> [a]
:[a]
acc
op (Right [a]
fs) [a]
acc = [a]
fsforall a. [a] -> [a] -> [a]
++[a]
acc
pFunconsSeq :: Parser [Funcons]
pFunconsSeq :: Parser [Funcons]
pFunconsSeq = String
"FUNCONS-SEQ"
forall {t} {b :: * -> * -> *} {a}.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:=> forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a. a -> [a] -> [a]
:[]) forall a. a -> a
id forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> Parser (Either Funcons [Funcons])
pFunconss
pKeyPair :: Parser Funcons
pKeyPair :: Parser Funcons
pKeyPair = String
"KEYPAIR" forall {t} {b :: * -> * -> *} {a}.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:=>
Funcons -> Either Funcons [Funcons] -> Funcons
fBinding forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> Parser Funcons
pFuncons forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** forall t. SubsumesToken t => String -> SymbExpr t String
keyword String
"|->" forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> Parser (Either Funcons [Funcons])
pFunconss
where fBinding :: Funcons -> Either Funcons [Funcons] -> Funcons
fBinding Funcons
k Either Funcons [Funcons]
ev = Funcons -> [Funcons] -> Funcons
FBinding Funcons
k (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a. a -> [a] -> [a]
:[]) forall a. a -> a
id Either Funcons [Funcons]
ev)
pOp :: Parser SeqSortOp
pOp :: Parser SeqSortOp
pOp = String
"OP" forall {t} {b :: * -> * -> *} {a}.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:=>
SeqSortOp
StarOp forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ forall t. SubsumesToken t => String -> SymbExpr t String
keyword String
"*"
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> SeqSortOp
PlusOp forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ forall t. SubsumesToken t => String -> SymbExpr t String
keyword String
"+"
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> SeqSortOp
QuestionMarkOp forall t (s :: * -> * -> *) b a.
(Show t, Ord t, IsSymbExpr s) =>
b -> s t a -> AltExpr t b
<$$ forall t. SubsumesToken t => String -> SymbExpr t String
keyword String
"?"
pValues :: Parser Values
pValues :: Parser Values
pValues = String
"VALUES"
forall {t} {b :: * -> * -> *} {a}.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:=> forall t. HasValues t => Char -> Values t
mk_unicode_characters forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> forall t. SubsumesToken t => SymbExpr t Char
char_lit
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> String -> Values
string__ forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> forall t. SubsumesToken t => SymbExpr t String
string_lit
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> forall t. Integer -> Values t
mk_integers forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Integral a => a -> Integer
toInteger forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> forall t. SubsumesToken t => SymbExpr t Int
int_lit
forall t (i :: * -> * -> *) (b :: * -> * -> *) a.
(Show t, Ord t, IsAltExpr i, HasAlts b) =>
i t a -> b t a -> AltExprs t a
<||> forall t. Double -> Values t
IEEE_Float_64 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
. forall a. [a] -> a
head forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. RealFrac a => ReadS a
readFloat forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> SymbExpr Token String
pRatioAsString
where pRatioAsString :: SymbExpr Token String
pRatioAsString = String
"RATIOasSTRING"
forall {t} {b :: * -> * -> *} {a}.
(Show t, Ord t, HasAlts b) =>
String -> b t a -> SymbExpr t a
<:=> (\Int
m Int
l -> forall a. Show a => a -> String
show Int
m forall a. [a] -> [a] -> [a]
++ String
"." forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
l) forall t (s :: * -> * -> *) a b.
(Show t, Ord t, IsSymbExpr s) =>
(a -> b) -> s t a -> AltExpr t b
<$$> forall t. SubsumesToken t => SymbExpr t Int
int_lit forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t a -> s t b -> AltExpr t a
<** forall t. SubsumesToken t => Char -> SymbExpr t Char
keychar Char
'.'
forall t (i :: * -> * -> *) (s :: * -> * -> *) a b.
(Show t, Ord t, IsAltExpr i, IsSymbExpr s) =>
i t (a -> b) -> s t a -> AltExpr t b
<**> forall t. SubsumesToken t => SymbExpr t Int
int_lit