
Hi Don. Don Stewart wrote:
alexander.fuchs:
In a happy parser I have this code 1):
%monad { Parsed } { thenP } { returnP }
type Parsed = State Env.Env
returnP :: a -> Parsed a returnP a = return a
thenP :: Parsed a -> (a -> Parsed b) -> Parsed b thenP x k = x >>= k
An alternative was this 2) (yes, redundant in happy):
returnP :: a -> Parsed a returnP = return
thenP :: Parsed a -> (a -> Parsed b) -> Parsed b thenP = (>>=)
Could you submit a minimal, complete grammar file, so we can look at the generated code?
After reducing and simplifying the grammar file to the minimum for my sample input I can't see any difference in performance anymore. Due to other code changes the difference is almost non-existent anymore even before simplification. I blame laziness for my lack of intuition of what is going on ;-) Anyway, as I am still wondering why ghc creates different code for returnP a = return a returnP = return I put the grammar file online, in case you still want to have a look at it: http://cs.uiowa.edu/~fuchs/DarwinCS/DarwinCS/Darwin/Tptp/Parser.y The complete source (compiles with make opt) is here: http://cs.uiowa.edu/~fuchs/DarwinCS/DarwinCS.tar.gz And I use it on this input: http://cs.uiowa.edu/~fuchs/DarwinCS/SYN854-1.p with the command line: time Darwin/Main +RTS -sstderr -RTS 600 SYN854-1.p Sorry about the noise, Alexander