Generating info files.
(c) 1993-2001 Andy Gill, Simon Marlow
> module Happy.Tabular.Info (genInfoFile) where
> import Data.Set ( Set )
> import qualified Data.Set as Set hiding ( Set )
> import Happy.Grammar
> import Happy.Tabular.LALR ( Lr0Item(..), LRAction(..), Goto(..), GotoTable, ActionTable )
> import Data.Array
> import Data.List (nub)
> import Data.Version ( Version, showVersion )
Produce a file of parser information, useful for debugging the parser.
> genInfoFile
> :: [Set Lr0Item]
> -> Grammar
> -> ActionTable
> -> GotoTable
> -> [(Int,String)]
> -> Array Int (Int,Int)
> -> String
> -> [Int]
> -> [String]
> -> Version
> -> String
> genInfoFile :: [Set Lr0Item]
-> Grammar
-> ActionTable
-> GotoTable
-> [(Int, String)]
-> Array Int (Int, Int)
-> String
-> [Int]
-> [String]
-> Version
-> String
genInfoFile [Set Lr0Item]
items
> (Grammar { productions :: Grammar -> [Production]
productions = [Production]
prods
> , lookupProdNo :: Grammar -> Int -> Production
lookupProdNo = Int -> Production
lookupProd
> , lookupProdsOfName :: Grammar -> Int -> [Int]
lookupProdsOfName = Int -> [Int]
lookupProdNos
> , non_terminals :: Grammar -> [Int]
non_terminals = [Int]
nonterms
> , token_names :: Grammar -> Array Int String
token_names = Array Int String
env
> })
> ActionTable
action GotoTable
goto [(Int, String)]
tokens Array Int (Int, Int)
conflictArray String
filename [Int]
unused_rules [String]
unused_terminals Version
version
> = (String -> String
showHeader
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
showConflicts
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
showUnused
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
showProductions
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
showTerminals
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
showNonTerminals
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
showStates
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
showStats
> ) String
""
> where
> showHeader :: String -> String
showHeader
> = String -> String -> String
banner (String
"Info file generated by Happy Version " String -> String -> String
forall a. [a] -> [a] -> [a]
++
> Version -> String
showVersion Version
version String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" from " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
filename)
> showConflicts :: String -> String
showConflicts
> = String -> String -> String
str String
"\n"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String -> String) -> (String -> String) -> String -> String)
-> (String -> String) -> [String -> String] -> String -> String
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) String -> String
forall a. a -> a
id (((Int, (Int, Int)) -> String -> String)
-> [(Int, (Int, Int))] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map (Int, (Int, Int)) -> String -> String
forall {a} {a} {a}.
(Eq a, Eq a, Num a, Num a, Show a, Show a, Show a) =>
(a, (a, a)) -> String -> String
showConflictsState (Array Int (Int, Int) -> [(Int, (Int, Int))]
forall i e. Ix i => Array i e -> [(i, e)]
assocs Array Int (Int, Int)
conflictArray))
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n"
> showConflictsState :: (a, (a, a)) -> String -> String
showConflictsState (a
_, (a
0,a
0)) = String -> String
forall a. a -> a
id
> showConflictsState (a
state, (a
sr,a
rr))
> = String -> String -> String
str String
"state "
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String -> String
forall a. Show a => a -> String -> String
shows a
state
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
" contains "
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String -> String] -> String -> String
interleave' String
" and " (
> (if a
sr a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
0
> then [ a -> String -> String
forall a. Show a => a -> String -> String
shows a
sr (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
" shift/reduce conflicts" ]
> else []) [String -> String] -> [String -> String] -> [String -> String]
forall a. [a] -> [a] -> [a]
++
> if a
rr a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
0
> then [ a -> String -> String
forall a. Show a => a -> String -> String
shows a
rr (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
" reduce/reduce conflicts" ]
> else [])
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
".\n"
> showUnused :: String -> String
showUnused =
> (case [Int]
unused_rules of
> [] -> String -> String
forall a. a -> a
id
> [Int]
_ -> String -> [String -> String] -> String -> String
interleave String
"\n" (
> (Int -> String -> String) -> [Int] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map (\Int
r -> String -> String -> String
str String
"rule "
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Show a => a -> String -> String
shows Int
r
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
" is unused")
> [Int]
unused_rules)
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n")
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (case [String]
unused_terminals of
> [] -> String -> String
forall a. a -> a
id
> [String]
_ -> String -> [String -> String] -> String -> String
interleave String
"\n" (
> (String -> String -> String) -> [String] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map (\String
t -> String -> String -> String
str String
"terminal "
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
t
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
" is unused")
> [String]
unused_terminals)
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n")
> showProductions :: String -> String
showProductions =
> String -> String -> String
banner String
"Grammar"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String -> String] -> String -> String
interleave String
"\n" ((Production -> Int -> String -> String)
-> [Production] -> [Int] -> [String -> String]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Production -> Int -> String -> String
forall {a}. Show a => Production -> a -> String -> String
showProduction [Production]
prods [ Int
0 :: Int .. ])
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n"
> showProduction :: Production -> a -> String -> String
showProduction (Production Int
nt [Int]
toks (String, [Int])
_sem Priority
_prec) a
i
> = Int -> (String -> String) -> String -> String
ljuststr Int
50 (
> String -> String -> String
str String
"\t"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
showName Int
nt
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
" -> "
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String -> String] -> String -> String
interleave String
" " ((Int -> String -> String) -> [Int] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map Int -> String -> String
showName [Int]
toks))
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
" (" (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String -> String
forall a. Show a => a -> String -> String
shows a
i (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
")"
> showStates :: String -> String
showStates =
> String -> String -> String
banner String
"States"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String -> String] -> String -> String
interleave String
"\n" (([Lr0Item] -> Int -> String -> String)
-> [[Lr0Item]] -> [Int] -> [String -> String]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith [Lr0Item] -> Int -> String -> String
showState
> ((Set Lr0Item -> [Lr0Item]) -> [Set Lr0Item] -> [[Lr0Item]]
forall a b. (a -> b) -> [a] -> [b]
map Set Lr0Item -> [Lr0Item]
forall a. Set a -> [a]
Set.toAscList [Set Lr0Item]
items) [ Int
0 :: Int .. ])
> showState :: [Lr0Item] -> Int -> String -> String
showState [Lr0Item]
state Int
n
> = String -> String -> String
str String
"State "(String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Show a => a -> String -> String
shows Int
n
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n\n"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String -> String] -> String -> String
interleave String
"\n" ((Lr0Item -> String -> String) -> [Lr0Item] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map Lr0Item -> String -> String
showItem [Lr0Item]
selectedItems)
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String -> String) -> (String -> String) -> String -> String)
-> (String -> String) -> [String -> String] -> String -> String
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) String -> String
forall a. a -> a
id (((Int, LRAction) -> String -> String)
-> [(Int, LRAction)] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map (Int, LRAction) -> String -> String
showAction (Array Int LRAction -> [(Int, LRAction)]
forall i e. Ix i => Array i e -> [(i, e)]
assocs (ActionTable
action ActionTable -> Int -> Array Int LRAction
forall i e. Ix i => Array i e -> i -> e
! Int
n)))
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String -> String) -> (String -> String) -> String -> String)
-> (String -> String) -> [String -> String] -> String -> String
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) String -> String
forall a. a -> a
id (((Int, Goto) -> String -> String)
-> [(Int, Goto)] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map (Int, Goto) -> String -> String
showGoto (Array Int Goto -> [(Int, Goto)]
forall i e. Ix i => Array i e -> [(i, e)]
assocs (GotoTable
goto GotoTable -> Int -> Array Int Goto
forall i e. Ix i => Array i e -> i -> e
! Int
n)))
> where
> nonRuleItems :: [Lr0Item]
nonRuleItems = [ (Int -> Int -> Lr0Item
Lr0 Int
r Int
d) | (Lr0 Int
r Int
d) <- [Lr0Item]
state, Int
d Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
0 ]
> selectedItems :: [Lr0Item]
selectedItems = if [Lr0Item] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Lr0Item]
nonRuleItems then Int -> [Lr0Item] -> [Lr0Item]
forall a. Int -> [a] -> [a]
take Int
1 [Lr0Item]
state else [Lr0Item]
nonRuleItems
>
>
>
>
>
>
> showItem :: Lr0Item -> String -> String
showItem (Lr0 Int
rule Int
dot)
> = Int -> (String -> String) -> String -> String
ljuststr Int
50 (
> String -> String -> String
str String
"\t"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
showName Int
nt
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
" -> "
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String -> String] -> String -> String
interleave String
" " ((Int -> String -> String) -> [Int] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map Int -> String -> String
showName [Int]
beforeDot)
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
". "
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String -> String] -> String -> String
interleave String
" " ((Int -> String -> String) -> [Int] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map Int -> String -> String
showName [Int]
afterDot))
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
" (rule " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Show a => a -> String -> String
shows Int
rule (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
")"
> where
> Production Int
nt [Int]
toks (String, [Int])
_sem Priority
_prec = Int -> Production
lookupProd Int
rule
> ([Int]
beforeDot, [Int]
afterDot) = Int -> [Int] -> ([Int], [Int])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
dot [Int]
toks
> showAction :: (Int, LRAction) -> String -> String
showAction (Int
_, LRAction
LR'Fail)
> = String -> String
forall a. a -> a
id
> showAction (Int
t, LRAction
act)
> = String -> String -> String
str String
"\t"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int -> String -> String
showJName Int
15 Int
t
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LRAction -> String -> String
showAction' LRAction
act
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n"
> showAction' :: LRAction -> String -> String
showAction' LRAction
LR'MustFail
> = String -> String -> String
str String
"fail"
> showAction' (LR'Shift Int
n Priority
_)
> = String -> String -> String
str String
"shift, and enter state "
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Show a => a -> String -> String
shows Int
n
> showAction' LRAction
LR'Accept
> = String -> String -> String
str String
"accept"
> showAction' (LR'Reduce Int
n Priority
_)
> = String -> String -> String
str String
"reduce using rule "
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Show a => a -> String -> String
shows Int
n
> showAction' (LR'Multiple [LRAction]
as LRAction
a)
> = LRAction -> String -> String
showAction' LRAction
a
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String -> String] -> String -> String
interleave String
"\n"
> ((LRAction -> String -> String) -> [LRAction] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map (\LRAction
a' -> String -> String -> String
str String
"\t\t\t(" (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LRAction -> String -> String
showAction' LRAction
a' (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
")")
> ([LRAction] -> [LRAction]
forall a. Eq a => [a] -> [a]
nub ((LRAction -> Bool) -> [LRAction] -> [LRAction]
forall a. (a -> Bool) -> [a] -> [a]
filter (LRAction -> LRAction -> Bool
forall a. Eq a => a -> a -> Bool
/= LRAction
a) [LRAction]
as)))
> showAction' LRAction
LR'Fail = String -> String -> String
forall a. HasCallStack => String -> a
error String
"showAction' LR'Fail: Unhandled case"
> showGoto :: (Int, Goto) -> String -> String
showGoto (Int
_, Goto
NoGoto)
> = String -> String
forall a. a -> a
id
> showGoto (Int
nt, Goto Int
n)
> = String -> String -> String
str String
"\t"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int -> String -> String
showJName Int
15 Int
nt
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"goto state "
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Show a => a -> String -> String
shows Int
n
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n"
> showTerminals :: String -> String
showTerminals
> = String -> String -> String
banner String
"Terminals"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String -> String] -> String -> String
interleave String
"\n" (((Int, String) -> String -> String)
-> [(Int, String)] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map (Int, String) -> String -> String
showTerminal [(Int, String)]
tokens)
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n"
> showTerminal :: (Int, String) -> String -> String
showTerminal (Int
t,String
s)
> = String -> String -> String
str String
"\t"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int -> String -> String
showJName Int
15 Int
t
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"{ " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
s (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
" }"
> showNonTerminals :: String -> String
showNonTerminals
> = String -> String -> String
banner String
"Non-terminals"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String -> String] -> String -> String
interleave String
"\n" ((Int -> String -> String) -> [Int] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map Int -> String -> String
showNonTerminal [Int]
nonterms)
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n"
> showNonTerminal :: Int -> String -> String
showNonTerminal Int
nt
> = String -> String -> String
str String
"\t"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int -> String -> String
showJName Int
15 Int
nt
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (if ([String -> String] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String -> String]
nt_rules Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1)
> then String -> String -> String
str String
" rule "
> else String -> String -> String
str String
" rules ")
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String -> String) -> (String -> String) -> String -> String)
-> [String -> String] -> String -> String
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 (\String -> String
a String -> String
b -> String -> String
a (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
", " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
b) [String -> String]
nt_rules
> where nt_rules :: [String -> String]
nt_rules = (Int -> String -> String) -> [Int] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map Int -> String -> String
forall a. Show a => a -> String -> String
shows (Int -> [Int]
lookupProdNos Int
nt)
> showStats :: String -> String
showStats
> = String -> String -> String
banner String
"Grammar Totals"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"Number of rules: " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Show a => a -> String -> String
shows ([Production] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Production]
prods)
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\nNumber of terminals: " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Show a => a -> String -> String
shows ([(Int, String)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Int, String)]
tokens)
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\nNumber of non-terminals: " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Show a => a -> String -> String
shows ([Int] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Int]
nonterms)
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\nNumber of states: " (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
forall a. Show a => a -> String -> String
shows ([Set Lr0Item] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Set Lr0Item]
items)
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n"
> nameOf :: Int -> String
nameOf Int
n = Array Int String
env Array Int String -> Int -> String
forall i e. Ix i => Array i e -> i -> e
! Int
n
> showName :: Int -> String -> String
showName = String -> String -> String
str (String -> String -> String)
-> (Int -> String) -> Int -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String
nameOf
> showJName :: Int -> Int -> String -> String
showJName Int
j = String -> String -> String
str (String -> String -> String)
-> (Int -> String) -> Int -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
ljustify Int
j (String -> String) -> (Int -> String) -> Int -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String
nameOf
> ljustify :: Int -> String -> String
> ljustify :: Int -> String -> String
ljustify Int
n String
s = String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> Char -> String
forall a. Int -> a -> [a]
replicate (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s)) Char
' '
> ljuststr :: Int -> (String -> String) -> String -> String
> ljuststr :: Int -> (String -> String) -> String -> String
ljuststr Int
n String -> String
s = String -> String -> String
str (Int -> String -> String
ljustify Int
n (String -> String
s String
""))
> banner :: String -> String -> String
> banner :: String -> String -> String
banner String
s
> = String -> String -> String
str String
"-----------------------------------------------------------------------------\n"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
s
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n-----------------------------------------------------------------------------\n"
> str :: String -> String -> String
> str :: String -> String -> String
str = String -> String -> String
showString
> interleave :: String -> [String -> String] -> String -> String
> interleave :: String -> [String -> String] -> String -> String
interleave String
s = ((String -> String) -> (String -> String) -> String -> String)
-> (String -> String) -> [String -> String] -> String -> String
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\String -> String
a String -> String
b -> String -> String
a (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
s (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
b) String -> String
forall a. a -> a
id
> interleave' :: String -> [String -> String] -> String -> String
> interleave' :: String -> [String -> String] -> String -> String
interleave' String
s = ((String -> String) -> (String -> String) -> String -> String)
-> [String -> String] -> String -> String
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 (\String -> String
a String -> String
b -> String -> String
a (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
s (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
b)