Related articles |
---|
Error report in multipass compilers kjell@saturn.ucsc.edu (Kjell Post) (1989-03-23) |
Date: | Thu, 23 Mar 89 14:34:24 PST |
From: | Kjell Post <kjell@saturn.ucsc.edu> |
I am currently writing a multipass compiler where the parser builds
an Abstract Syntax Tree which is later traversed in several passes.
I would like to keep track of the linenumbers so I can refer to a
specific line when an error is detected during the tree traversal.
There are two approaches I can think of:
1. Store the linenumbers in the leaf nodes only.
When an error occur, go first right then all the
way down the left spine to find a leaf.
This doesn't work in all cases; for instance
stmt ::= RETURN ';' { ... }
doesn't have a leaf node and no line number can be
associated with that construct.
2. Store the linenumbers in all nodes.
The problem here is how to synthesize a linenumber from
two subtrees in an non-ad-hoc way. Example
expr ::= expr '+' expr { ... }
The linenumber stored in $$ should probably be the linenumber
where the '+' appeared. But some productions have right-hand
sides without any terminals and so $$'s linenumber must be
synthesized from one of the nonterminals. Empty subtrees must
of course be avoided so this method requires careful thinking.
Is there some clean, obvious way that I have missed?
--Kjell (kjell@saturn.ucsc.edu)
[At parse time, I'd set the line number in a node from the current line number
kept by the lexer. Crude, but as likely as anything else to be right. -John]
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.