16
16
> import Data.Array
17
17
> import Data.List (nub)
18
> import Data.Version ( showVersion )
18
> import Data.Version ( showVersion )
20
20
Produce a file of parser information, useful for debugging the parser.
28
> -> Array Int (Int,Int)
30
> -> [Int] -- unused rules
31
> -> [String] -- unused terminals
28
> -> Array Int (Int,Int)
30
> -> [Int] -- unused rules
31
> -> [String] -- unused terminals
35
> (Grammar { productions = prods
36
> , lookupProdNo = lookupProd
37
> , lookupProdsOfName = lookupProdNos
38
> , non_terminals = nonterms
35
> (Grammar { productions = prods
36
> , lookupProdNo = lookupProd
37
> , lookupProdsOfName = lookupProdNos
38
> , non_terminals = nonterms
39
39
> , token_names = env
41
> action goto tokens conflictArray filename unused_rules unused_terminals
41
> action goto tokens conflictArray filename unused_rules unused_terminals
54
> = banner ("Info file generated by Happy Version " ++
55
> showVersion version ++ " from " ++ filename)
54
> = banner ("Info file generated by Happy Version " ++
55
> showVersion version ++ " from " ++ filename)
59
> . foldr (.) id (map showConflictsState (assocs conflictArray))
59
> . foldr (.) id (map showConflictsState (assocs conflictArray))
62
62
> showConflictsState (_, (0,0)) = id
63
63
> showConflictsState (state, (sr,rr))
67
> . interleave' " and " (
69
> then [ shows sr . str " shift/reduce conflicts" ]
72
> then [ shows rr . str " reduce/reduce conflicts" ]
67
> . interleave' " and " (
69
> then [ shows sr . str " shift/reduce conflicts" ]
72
> then [ shows rr . str " reduce/reduce conflicts" ]
77
> (case unused_rules of
79
> _ -> interleave "\n" (
80
> map (\r -> str "rule "
85
> . (case unused_terminals of
87
> _ -> interleave "\n" (
88
> map (\t -> str "terminal "
96
> . interleave "\n" (zipWith showProduction prods [ 0 :: Int .. ])
77
> (case unused_rules of
79
> _ -> interleave "\n" (
80
> map (\r -> str "rule "
85
> . (case unused_terminals of
87
> _ -> interleave "\n" (
88
> map (\t -> str "terminal "
96
> . interleave "\n" (zipWith showProduction prods [ 0 :: Int .. ])
99
99
> showProduction (nt, toks, _sem, _prec) i
104
> . interleave " " (map showName toks))
105
> . str " (" . shows i . str ")"
104
> . interleave " " (map showName toks))
105
> . str " (" . shows i . str ")"
109
> . interleave "\n" (zipWith showState
110
> (map Set.toAscList items) [ 0 :: Int .. ])
109
> . interleave "\n" (zipWith showState
110
> (map Set.toAscList items) [ 0 :: Int .. ])
112
112
> showState state n
113
> = str "State ". shows n
115
> . interleave "\n" (map showItem [ (Lr0 r d) | (Lr0 r d) <- state, d /= 0 ])
117
> . foldr (.) id (map showAction (assocs (action ! n)))
119
> . foldr (.) id (map showGoto (assocs (goto ! n)))
113
> = str "State ". shows n
115
> . interleave "\n" (map showItem [ (Lr0 r d) | (Lr0 r d) <- state, d /= 0 ])
117
> . foldr (.) id (map showAction (assocs (action ! n)))
119
> . foldr (.) id (map showGoto (assocs (goto ! n)))
121
121
> showItem (Lr0 rule dot)
126
> . interleave " " (map showName beforeDot)
128
> . interleave " " (map showName afterDot))
129
> . str " (rule " . shows rule . str ")"
131
> (nt, toks, _sem, _prec) = lookupProd rule
132
> (beforeDot, afterDot) = splitAt dot toks
126
> . interleave " " (map showName beforeDot)
128
> . interleave " " (map showName afterDot))
129
> . str " (rule " . shows rule . str ")"
131
> (nt, toks, _sem, _prec) = lookupProd rule
132
> (beforeDot, afterDot) = splitAt dot toks
134
134
> showAction (_, LR'Fail)
136
136
> showAction (t, act)
142
142
> showAction' LR'MustFail
144
144
> showAction' (LR'Shift n _)
145
> = str "shift, and enter state "
145
> = str "shift, and enter state "
147
147
> showAction' LR'Accept
149
149
> showAction' (LR'Reduce n _)
150
> = str "reduce using rule "
150
> = str "reduce using rule "
152
152
> showAction' (LR'Multiple as a)
156
> (map (\a' -> str "\t\t\t(" . showAction' a' . str ")")
157
> (nub (filter (/= a) as)))
156
> (map (\a' -> str "\t\t\t(" . showAction' a' . str ")")
157
> (nub (filter (/= a) as)))
158
158
> showAction' LR'Fail = error "showAction' LR'Fail: Unhandled case"
160
160
> showGoto (_, NoGoto)
162
162
> showGoto (nt, Goto n)
165
> . str "goto state "
165
> . str "goto state "
170
> = banner "Terminals"
171
> . interleave "\n" (map showTerminal tokens)
170
> = banner "Terminals"
171
> . interleave "\n" (map showTerminal tokens)
174
174
> showTerminal (t,s)
177
> . str "{ " . str s . str " }"
177
> . str "{ " . str s . str " }"
179
179
> showNonTerminals
180
> = banner "Non-terminals"
181
> . interleave "\n" (map showNonTerminal nonterms)
180
> = banner "Non-terminals"
181
> . interleave "\n" (map showNonTerminal nonterms)
184
184
> showNonTerminal nt
187
> . (if (length nt_rules == 1)
189
> else str " rules ")
190
> . foldr1 (\a b -> a . str ", " . b) nt_rules
191
> where nt_rules = map shows (lookupProdNos nt)
187
> . (if (length nt_rules == 1)
189
> else str " rules ")
190
> . foldr1 (\a b -> a . str ", " . b) nt_rules
191
> where nt_rules = map shows (lookupProdNos nt)
194
> = banner "Grammar Totals"
195
> . str "Number of rules: " . shows (length prods)
196
> . str "\nNumber of terminals: " . shows (length tokens)
197
> . str "\nNumber of non-terminals: " . shows (length nonterms)
198
> . str "\nNumber of states: " . shows (length items)
194
> = banner "Grammar Totals"
195
> . str "Number of rules: " . shows (length prods)
196
> . str "\nNumber of terminals: " . shows (length tokens)
197
> . str "\nNumber of non-terminals: " . shows (length nonterms)
198
> . str "\nNumber of states: " . shows (length items)
201
201
> nameOf n = env ! n
202
202
> showName = str . nameOf