mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
graphs: documentation
Note that 'make web-manual' fails. * NEWS: Document these changes. * doc/Makefile.am: Adjust to generate example files. * doc/bison.texi: Add a Graphviz section after "Understanding::", the section describing the .output file, because these are similar. * doc/figs/example-reduce.dot, doc/figs/example-reduce.txt, doc/figs/example-shift.dot, doc/figs/example-shift.txt: New, minimal examples to illustrate the documentation. Signed-off-by: Akim Demaille <akim@lrde.epita.fr>
This commit is contained in:
committed by
Akim Demaille
parent
dd47b5220c
commit
fc4fdd623e
@@ -96,6 +96,33 @@ PREPATH = $(top_builddir)/src
|
||||
|
||||
nodist_man_MANS = yacc.1
|
||||
|
||||
## ----------------------------- ##
|
||||
## Graphviz examples generation. ##
|
||||
## ----------------------------- ##
|
||||
|
||||
CLEANDIRS += figs
|
||||
EXTRA_DIST += figs/example-reduce.dot figs/example-shift.dot
|
||||
SUFFIXES += .dot .eps .pdf .png
|
||||
|
||||
bison.dvi: figs/example-reduce.eps figs/example-shift.eps
|
||||
bison.html: figs/example-reduce.png figs/example-shift.png
|
||||
bison.pdf: figs/example-reduce.pdf figs/example-shift.pdf
|
||||
|
||||
.dot.eps:
|
||||
$(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'`
|
||||
$(AM_V_at) dot -Teps $< >$@.tmp
|
||||
$(AM_V_at) mv $@.tmp $@
|
||||
|
||||
.dot.pdf:
|
||||
$(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'`
|
||||
$(AM_V_at) dot -Tpdf -Gmargin=0 $< >$@.tmp
|
||||
$(AM_V_at) mv $@.tmp $@
|
||||
|
||||
.dot.png:
|
||||
$(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'`
|
||||
$(AM_V_at) dot -Tpng $< >$@.tmp
|
||||
$(AM_V_at) mv $@.tmp $@
|
||||
|
||||
## -------------- ##
|
||||
## Doxygenation. ##
|
||||
## -------------- ##
|
||||
|
||||
110
doc/bison.texi
110
doc/bison.texi
@@ -294,6 +294,7 @@ Handling Context Dependencies
|
||||
Debugging Your Parser
|
||||
|
||||
* Understanding:: Understanding the structure of your parser.
|
||||
* Graphviz:: Getting a visual representation of the parser.
|
||||
* Tracing:: Tracing the execution of your parser.
|
||||
|
||||
Tracing Your Parser
|
||||
@@ -8093,6 +8094,7 @@ automaton, and how to enable and understand the parser run-time traces.
|
||||
|
||||
@menu
|
||||
* Understanding:: Understanding the structure of your parser.
|
||||
* Graphviz:: Getting a visual representation of the parser.
|
||||
* Tracing:: Tracing the execution of your parser.
|
||||
@end menu
|
||||
|
||||
@@ -8509,6 +8511,114 @@ precedence of @samp{/} with respect to @samp{+}, @samp{-}, and
|
||||
@samp{*}, but also because the
|
||||
associativity of @samp{/} is not specified.
|
||||
|
||||
@c ================================================= Graphical Representation
|
||||
|
||||
@node Graphviz
|
||||
@section Visualizing Your Parser
|
||||
@cindex dot
|
||||
|
||||
As another means to gain better understanding of the shift/reduce
|
||||
automaton corresponding to the Bison parser, a DOT file can be generated. Note
|
||||
that debugging a real grammar with this is tedious at best, and impractical
|
||||
most of the times, because the generated files are huge (the generation of
|
||||
a PDF or PNG file from it will take very long, and more often than not it will
|
||||
fail due to memory exhaustion). This option was rather designed for beginners,
|
||||
to help them understand LR parsers.
|
||||
|
||||
This file is generated when the @option{--graph} option is specified (see
|
||||
@pxref{Invocation, , Invoking Bison}). Its name is made by removing
|
||||
@samp{.tab.c} or @samp{.c} from the parser implementation file name, and
|
||||
adding @samp{.dot} instead. If the grammar file is @file{foo.y}, the
|
||||
Graphviz output file is called @file{foo.dot}.
|
||||
|
||||
The following grammar file, @file{rr.y}, will be used in the sequel:
|
||||
|
||||
@example
|
||||
%%
|
||||
@group
|
||||
exp: a ";" | b ".";
|
||||
a: "0";
|
||||
b: "0";
|
||||
@end group
|
||||
@end example
|
||||
|
||||
The graphical output is very similar to the textual one, and as such it is
|
||||
easier understood by making direct comparisons between them. See
|
||||
@ref{Debugging, , Debugging Your Parser} for a detailled analysis of the
|
||||
textual report.
|
||||
|
||||
@subheading Graphical Representation of States
|
||||
|
||||
The items (pointed rules) for each state are grouped together in graph nodes.
|
||||
Their numbering is the same as in the verbose file. See the following points,
|
||||
about transitions, for examples
|
||||
|
||||
When invoked with @option{--report=lookaheads}, the lookahead tokens, when
|
||||
needed, are shown next to the relevant rule between square brackets as a
|
||||
comma separated list. This is the case in the figure for the representation of
|
||||
reductions, below.
|
||||
|
||||
@sp 1
|
||||
|
||||
The transitions are represented as directed edges between the current and
|
||||
the target states.
|
||||
|
||||
@subheading Graphical Representation of Shifts
|
||||
|
||||
Shifts are shown as solid arrows, labelled with the lookahead token for that
|
||||
shift. The following describes a reduction in the @file{rr.output} file:
|
||||
|
||||
@example
|
||||
@group
|
||||
state 3
|
||||
|
||||
1 exp: a . ";"
|
||||
|
||||
";" shift, and go to state 6
|
||||
@end group
|
||||
@end example
|
||||
|
||||
A Graphviz rendering of this portion of the graph could be:
|
||||
|
||||
@center @image{figs/example-shift, 100pt}
|
||||
|
||||
@subheading Graphical Representation of Reductions
|
||||
|
||||
Reductions are shown as solid arrows, leading to a diamond-shaped node
|
||||
bearing the number of the reduction rule. The arrow is labelled with the
|
||||
appropriate comma separated lookahead tokens. If the reduction is the default
|
||||
action for the given state, there is no such label.
|
||||
|
||||
This is how reductions are represented in the verbose file @file{rr.output}:
|
||||
@example
|
||||
state 1
|
||||
|
||||
3 a: "0" . [";"]
|
||||
4 b: "0" . ["."]
|
||||
|
||||
"." reduce using rule 4 (b)
|
||||
$default reduce using rule 3 (a)
|
||||
@end example
|
||||
|
||||
A Graphviz rendering of this portion of the graph could be:
|
||||
|
||||
@center @image{figs/example-reduce, 120pt}
|
||||
|
||||
When unresolved conflicts are present, because in deterministic parsing
|
||||
a single decision can be made, Bison can arbitrarily choose to disable a
|
||||
reduction, see @ref{Shift/Reduce, , Shift/Reduce Conflicts}. Discarded actions
|
||||
are distinguished by a red filling color on these nodes, just like how they are
|
||||
reported between square brackets in the verbose file.
|
||||
|
||||
The reduction corresponding to the rule number 0 is the acceptation state. It
|
||||
is shown as a blue diamond, labelled "Acc".
|
||||
|
||||
@subheading Graphical representation of go tos
|
||||
|
||||
The @samp{go to} jump transitions are represented as dotted lines bearing
|
||||
the name of the rule being jumped to.
|
||||
|
||||
@c ================================================= Tracing
|
||||
|
||||
@node Tracing
|
||||
@section Tracing Your Parser
|
||||
|
||||
11
doc/figs/example-reduce.dot
Normal file
11
doc/figs/example-reduce.dot
Normal file
@@ -0,0 +1,11 @@
|
||||
digraph "reduce.y"
|
||||
{
|
||||
node [fontname=courier shape=box]
|
||||
edge [fontname=courier]
|
||||
|
||||
1 [label="State 1\n 3 a: \"0\" . [\".\"]\l 4 b: \"0\" . [\";\"]\l"]
|
||||
1 -> "1R3" [label="" style=solid]
|
||||
"1R3" [style=filled shape=diamond fillcolor=yellowgreen label="R3"]
|
||||
1 -> "1R4" [label="[\";\"]" style=solid]
|
||||
"1R4" [style=filled shape=diamond fillcolor=yellowgreen label="R4"]
|
||||
}
|
||||
15
doc/figs/example-reduce.txt
Normal file
15
doc/figs/example-reduce.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
.------------------.
|
||||
| State 1 |
|
||||
| 3 a: "0" . [";"] |
|
||||
| 4 b: "0" . ["."] |
|
||||
`------------------'
|
||||
/ \
|
||||
/ \ ["."]
|
||||
/ \
|
||||
v v
|
||||
. .
|
||||
/ \ / \
|
||||
/ R \ / R \
|
||||
(green) \ 3 / \ 4 / (green)
|
||||
\ / \ /
|
||||
. .
|
||||
9
doc/figs/example-shift.dot
Normal file
9
doc/figs/example-shift.dot
Normal file
@@ -0,0 +1,9 @@
|
||||
digraph "shift.y"
|
||||
{
|
||||
node [fontname=courier shape=box]
|
||||
edge [fontname=courier]
|
||||
|
||||
3 [label="State 3\n 1 exp: a . \".\"\l"]
|
||||
3 -> 6 [style=solid label="\".\""]
|
||||
6 [label="State 6\n 1 exp: a \".\" .\l"]
|
||||
}
|
||||
12
doc/figs/example-shift.txt
Normal file
12
doc/figs/example-shift.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
.----------------.
|
||||
| State 3 |
|
||||
| 1 exp: a . ";" |
|
||||
`----------------'
|
||||
|
|
||||
| ";"
|
||||
|
|
||||
v
|
||||
.----------------.
|
||||
| State 6 |
|
||||
| 1 exp: a ";" . |
|
||||
`----------------'
|
||||
Reference in New Issue
Block a user