Finding type errors in grammar files is inherently
difficult because the code for reductions is moved around before
being placed in the parser. We currently have no way of passing
the original filename and line numbers to the Haskell compiler,
so there is no alternative but to look at the parser and match
the code to the grammar file. An info file (generated by the
-i
option) can be helpful here.
Type signature sometimes help by pinning down the particular error to the place where the mistake is made, not half way down the file. For each production in the grammar, there's a bit of code in the generated file that looks like this:
HappyAbsSyn<n> ( E )
where E
is the Haskell expression from the
grammar file (with $n
replaced by
happy_var_n
). If there is a type signature for this
production, then Happy will have taken it into
account when declaring the HappyAbsSyn datatype, and errors in
E
will be caught right here. Of course, the error may
be really caused by incorrect use of one of the
happy_var_n
variables.
(this section will contain more info as we gain experience with creating grammar files. Please send us any helpful tips you find.)