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.Grammar.ExpressionWithHole ( substExpressionWithHole )
> 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 e
> -> ActionTable
> -> GotoTable
> -> Array Int (Int,Int)
> -> String
> -> [Int]
> -> [String]
> -> Version
> -> String
> genInfoFile :: forall e.
[Set Lr0Item]
-> Grammar e
-> ActionTable
-> GotoTable
-> Array Int (Int, Int)
-> String
-> [Int]
-> [String]
-> Version
-> String
genInfoFile [Set Lr0Item]
items
> (Grammar { productions :: forall eliminator. Grammar eliminator -> [Production eliminator]
productions = [Production e]
prods
> , lookupProdNo :: forall eliminator.
Grammar eliminator -> Int -> Production eliminator
lookupProdNo = Int -> Production e
lookupProd
> , lookupProdsOfName :: forall eliminator. Grammar eliminator -> Name -> [Int]
lookupProdsOfName = Name -> [Int]
lookupProdNos
> , non_terminals :: forall eliminator. Grammar eliminator -> [Name]
non_terminals = [Name]
nonterms
> , token_names :: forall eliminator. Grammar eliminator -> Array Name String
token_names = Array Name String
env
> , token_specs :: forall eliminator. Grammar eliminator -> [(Name, TokenSpec)]
token_specs = [(Name, TokenSpec)]
tokens
> })
> ActionTable
action GotoTable
goto 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 e -> Int -> String -> String)
-> [Production e] -> [Int] -> [String -> String]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Production e -> Int -> String -> String
forall {a} {eliminator}.
Show a =>
Production eliminator -> a -> String -> String
showProduction [Production e]
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 eliminator -> a -> String -> String
showProduction (Production Name
nt [Name]
toks (eliminator, [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
. Name -> String -> String
showName Name
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
" " ((Name -> String -> String) -> [Name] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map Name -> String -> String
showName [Name]
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 (((Name, LRAction) -> String -> String)
-> [(Name, LRAction)] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map (Name, LRAction) -> String -> String
showAction (Array Name LRAction -> [(Name, LRAction)]
forall i e. Ix i => Array i e -> [(i, e)]
assocs (ActionTable
action ActionTable -> Int -> Array Name 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 (((Name, Goto) -> String -> String)
-> [(Name, Goto)] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map (Name, Goto) -> String -> String
showGoto (Array Name Goto -> [(Name, Goto)]
forall i e. Ix i => Array i e -> [(i, e)]
assocs (GotoTable
goto GotoTable -> Int -> Array Name 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
. Name -> String -> String
showName Name
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
" " ((Name -> String -> String) -> [Name] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map Name -> String -> String
showName [Name]
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
" " ((Name -> String -> String) -> [Name] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map Name -> String -> String
showName [Name]
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 Name
nt [Name]
toks (e, [Int])
_sem Priority
_prec = Int -> Production e
lookupProd Int
rule
> ([Name]
beforeDot, [Name]
afterDot) = Int -> [Name] -> ([Name], [Name])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
dot [Name]
toks
> showAction :: (Name, LRAction) -> String -> String
showAction (Name
_, LRAction
LR'Fail)
> = String -> String
forall a. a -> a
id
> showAction (Name
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 -> Name -> String -> String
showJName Int
15 Name
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 :: (Name, Goto) -> String -> String
showGoto (Name
_, Goto
NoGoto)
> = String -> String
forall a. a -> a
id
> showGoto (Name
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 -> Name -> String -> String
showJName Int
15 Name
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" (((Name, TokenSpec) -> String -> String)
-> [(Name, TokenSpec)] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map (Name, TokenSpec) -> String -> String
showTerminal [(Name, TokenSpec)]
tokens)
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n"
> showTerminal :: (Name, TokenSpec) -> String -> String
showTerminal (Name
t,TokenSpec
s)
> = String -> String -> String
str String
"\t"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Name -> String -> String
showJName Int
15 Name
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
. TokenSpec -> String -> String
showToken TokenSpec
s (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
" }"
> showToken :: TokenSpec -> String -> String
showToken (TokenFixed String
s) = String -> String -> String
str String
s
> showToken (TokenWithValue ExpressionWithHole
e) = String -> String -> String
str (String -> String -> String) -> String -> String -> String
forall a b. (a -> b) -> a -> b
$ ExpressionWithHole -> String -> String
substExpressionWithHole ExpressionWithHole
e 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" ((Name -> String -> String) -> [Name] -> [String -> String]
forall a b. (a -> b) -> [a] -> [b]
map Name -> String -> String
showNonTerminal [Name]
nonterms)
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
str String
"\n"
> showNonTerminal :: Name -> String -> String
showNonTerminal Name
nt
> = String -> String -> String
str String
"\t"
> (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Name -> String -> String
showJName Int
15 Name
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 (Name -> [Int]
lookupProdNos Name
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 e] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Production e]
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 ([(Name, TokenSpec)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(Name, TokenSpec)]
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 ([Name] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Name]
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 :: Name -> String
nameOf Name
n = Array Name String
env Array Name String -> Name -> String
forall i e. Ix i => Array i e -> i -> e
! Name
n
> showName :: Name -> String -> String
showName = String -> String -> String
str (String -> String -> String)
-> (Name -> String) -> Name -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> String
nameOf
> showJName :: Int -> Name -> String -> String
showJName Int
j = String -> String -> String
str (String -> String -> String)
-> (Name -> String) -> Name -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> String -> String
ljustify Int
j (String -> String) -> (Name -> String) -> Name -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> 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)