Related articles |
---|
YACC debugger wanted guenter@student.uni-kl.de (Marvin) (1996-12-18) |
Re: YACC debugger wanted scotts@metaware.com (Scott Stanchfield) (1996-12-20) |
Re: YACC debugger wanted joerg@tc.pci.uni-heidelberg.de (1996-12-20) |
From: | Scott Stanchfield <scotts@metaware.com> |
Newsgroups: | comp.compilers |
Date: | 20 Dec 1996 17:14:27 -0500 |
Organization: | MetaWare Incorporated |
References: | 96-12-131 |
Keywords: | parse, yacc, debug |
I created some simple awk scripts to help debug yacc, but I couldn't
keep them when I left McCabe...
The idea I used was to help set breakpoints at rule reductions:
-- edit the ytab.c file (using awk):
-- add a routine called "rule_stop_here" that doesn't
have any code in it
-- add a global
char *rule_stop_pattern=(char *)0;
-- add a function
stop_in_rule(char *pattern)
which will set rule_stop_pattern to pattern.
(Make sure you malloc & strcpy the pattern, freeing an
old value first...)
-- at each action code section (your action code is put into a
large switch statement -- look for the cases) add the
following code (this is pseudo code...)
if current rule name matches rule_stop_pattern
call rule_stop_here
#line ...
Notes:
= the current rule name can be determined from (I think)
yyreds[], which is defined if you define YYDEBUG when
compiling and -t when yaccing
= there should be a #line directive at the start of
the action code "case;" insert your "if" right before
it or your line numbers get off...
-- go into a debugger (I used gdb with DDD as a GUI)
-- set a breakpoint on entry to rule_stop_here
-- set an action at the breakpoint that says "finish" (continue
until out of the routine.)
-- call rule_stop_pattern("ruleA")
(where ruleA is the rule you want to stop on.)
-- run your test...
If I remembered all the stuff you need to do, this _should_ stop you on
each piece of action code for the rule in question. This can help
quite a bit to find problems.
A possible extension might be to change the "if" to
if rule name matches pattern OR yylineno == line_to_stop_on
and define another routine to set line_to_stop_on.
I hope this is clear enough. It sped up my debugging significantly
(I didn't need to blindly step through the table lookups/state machine
stuff.)
Hope this helps! Happy Holidays!
Scott
Marvin wrote:
>
> Greetings. Is there something like a run-time debugger for YACC
> which allows somebody to check if a set of YACC rules and a
> text in this language match by making some top-down parsing?
--
Scott Stanchfield
MetaWare Incorporated
Santa Cruz, CA
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.