{-# 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
','))
--  <||> FTuple             <$$> parens   (multipleSepBy pFuncons (keychar ','))
  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" -- NOT OK, would parse "-2.-3"
          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