From be3517b007a833ffec1735691f256f6a37e4a67f Mon Sep 17 00:00:00 2001 From: Theophile Ranquet Date: Tue, 23 Oct 2012 15:43:54 +0000 Subject: [PATCH] xml: match DOT output and xml2dot.xsl processing Make the DOT produced by XSLT processing equivalent to the one made with the --graph option. * data/xslt/xml2dot.xsl: Stylistic changes, and add support for reductions. * doc/bison.texi (Xml): Update. * src/graphviz.c (conclude_red): Minor stylistic changes to DOT internals. (output_red): Swap enabled and disabled reductions output, for coherence with XSLT output. * src/print_graph.c (print_core): Minor stylistic change to States' output. (print_actions): Swap order of output for reductions and transitions. * tests/local.at (AT_BISON_CHECK_XML): Ignore differences in order. * tests/output.at: Adjust to changes in DOT internals. --- data/xslt/xml2dot.xsl | 185 ++++++++++++++++++++++- data/xslt/xml2text.xsl | 2 +- doc/bison.texi | 7 +- src/graphviz.c | 34 +++-- src/print_graph.c | 7 +- tests/local.at | 4 +- tests/output.at | 322 ++++++++++++++++++++--------------------- 7 files changed, 367 insertions(+), 194 deletions(-) diff --git a/data/xslt/xml2dot.xsl b/data/xslt/xml2dot.xsl index 111613ce..dceb8e1e 100644 --- a/data/xslt/xml2dot.xsl +++ b/data/xslt/xml2dot.xsl @@ -55,7 +55,7 @@ - { + " { node [fontname = courier, shape = box, colorscheme = paired6] edge [fontname = courier] @@ -68,11 +68,87 @@ - + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + label="[ + + + + + + , + + + ]", + + + + style=solid] + + + + + + + + + 3 + + + 5 + + + + + + @@ -80,17 +156,48 @@ + + + + + - - -> + + + + + + + + + + + + + + + + + + + + + + + : + + . @@ -110,7 +217,7 @@ - [ + [ ] @@ -122,6 +229,50 @@ + + + + + + + + -> " + + R + + + d + + " [ + + + + + + + + " + + R + + + d + + " [label=" + + + Acc", fillcolor=1 + + + R + + ", fillcolor= + + + + , shape=diamond, style=filled] + + @@ -153,10 +304,13 @@ [label=" + State + + \n - "] + \l"] @@ -197,7 +351,7 @@ - + @@ -223,4 +377,21 @@ + + + + + + + + + + + + + + + + + diff --git a/data/xslt/xml2text.xsl b/data/xslt/xml2text.xsl index 94e78e63..8b3f5ae4 100644 --- a/data/xslt/xml2text.xsl +++ b/data/xslt/xml2text.xsl @@ -230,7 +230,7 @@ - state + State diff --git a/doc/bison.texi b/doc/bison.texi index 023edd51..7bb41460 100644 --- a/doc/bison.texi +++ b/doc/bison.texi @@ -8639,8 +8639,8 @@ another alternative is to output an XML file that may then be, with @command{xsltproc}, rendered as either a raw text format equivalent to the verbose file, or as an HTML version of the same file, with clickable transitions, or even as a DOT. The @file{.output} and DOT files obtained via -XSLT have no difference whatsoever with those obtained by invoking bison -with options @option{--verbose} or @option{--graph}. +XSLT have no difference whatsoever with those obtained by invoking +@command{bison} with options @option{--verbose} or @option{--graph}. The textual file is generated when the options @option{-x} or @option{--xml[=FILE]} are specified, see @ref{Invocation,,Invoking Bison}. @@ -8654,8 +8654,7 @@ files to apply to the XML file. Their names are non-ambiguous: @table @file @item xml2dot.xsl -Used to output a DOT version of the automaton. This might not be exactly the -same as the one obtained through @option{--graph}. +Used to output a copy of the DOT visualization of the automaton. @item xml2text.xsl Used to output a copy of the .output file. @item xml2xhtml.xsl diff --git a/src/graphviz.c b/src/graphviz.c index ec102a49..16ea8b9e 100644 --- a/src/graphviz.c +++ b/src/graphviz.c @@ -106,7 +106,7 @@ conclude_red (struct obstack *out, int source, rule_number ruleno, return (void) obstack_finish0 (out); else { - char const *ed = enabled ? "e" : "d"; + char const *ed = enabled ? "" : "d"; char const *color = enabled ? ruleno ? "3" : "1" : "5"; /* First, build the edge's head. The name of reduction nodes is "nRm", @@ -116,24 +116,28 @@ conclude_red (struct obstack *out, int source, rule_number ruleno, fprintf (fout, " %1$d -> \"%1$dR%2$d%3$s\" [", source, ruleno, ed); + /* (The lookahead tokens have been added to the beginning of the + obstack, in the caller function.) */ if (! obstack_empty_p (out)) - /* (The lookahead tokens have been added to the beginning of the - obstack, in the caller function.) */ - fprintf (fout, "label = \"[%s]\" ", obstack_finish0 (out)); + { + char *label = obstack_finish0 (out); + fprintf (fout, "label=\"[%s]\", ", label); + obstack_free (out, label); + } /* Then, the edge's tail. */ - fprintf (fout, "style = solid]\n"); + fprintf (fout, "style=solid]\n"); /* Build the associated diamond representation of the target rule. */ - fprintf (fout, " \"%dR%d%s\" [style = filled, " - "shape = diamond, fillcolor = %s, ", - source, ruleno, ed, color); - - if (ruleno) - fprintf (fout, "label = \"R%d\"]\n", ruleno); + fprintf (fout, " \"%dR%d%s\" [label=\"", + source, ruleno, ed); + if (ruleno) + fprintf (fout, "R%d", ruleno); else - fprintf (fout, "label = \"Acc\"]\n"); + fprintf (fout, "Acc"); + fprintf (fout, "\", fillcolor=%s, shape=diamond, style=filled]\n", + color); } } @@ -171,7 +175,7 @@ output_red (state const *s, reductions const *reds, FILE *fout) bool defaulted = false; bool firstd = true; bool firste = true; - rule_number ruleno = reds->rules[j]->user_number; + rule_number ruleno = reds->rules[j]->number; rule *default_reduction = NULL; if (yydefact[s->number] != 0) @@ -199,11 +203,11 @@ output_red (state const *s, reductions const *reds, FILE *fout) } /* Do the actual output. */ - conclude_red (&eout, source, ruleno, true, firste && !defaulted, fout); conclude_red (&dout, source, ruleno, false, firstd, fout); + conclude_red (&eout, source, ruleno, true, firste && !defaulted, fout); } - obstack_free (&eout, 0); obstack_free (&dout, 0); + obstack_free (&eout, 0); bitset_free (no_reduce_set); } diff --git a/src/print_graph.c b/src/print_graph.c index 5ce0aa98..f4742b16 100644 --- a/src/print_graph.c +++ b/src/print_graph.c @@ -76,7 +76,7 @@ print_core (struct obstack *oout, state *s) } obstack_printf (oout, _("State %d"), s->number); - obstack_sgrow (oout, "\\n"); + obstack_sgrow (oout, "\\n\\l"); for (i = 0; i < snritems; i++) { item_number *sp; @@ -142,9 +142,6 @@ print_actions (state const *s, FILE *fgraph) transitions const *trans = s->transitions; int i; - /* Display reductions. */ - output_red (s, s->reductions, fgraph); - if (!trans->num && !s->reductions) return; @@ -167,6 +164,8 @@ print_actions (state const *s, FILE *fgraph) TRANSITION_IS_ERROR (trans, i) ? NULL : symbols[sym]->tag, style, fgraph); } + /* Display reductions. */ + output_red (s, s->reductions, fgraph); } diff --git a/tests/local.at b/tests/local.at index ca64693e..efba29dc 100644 --- a/tests/local.at +++ b/tests/local.at @@ -556,10 +556,10 @@ m4_define([AT_BISON_CHECK_XML], AT_CHECK([[$XSLTPROC \ `]]AT_QUELL_VALGRIND[[ bison --print-datadir`/xslt/xml2text.xsl \ xml-tests/test.xml]], [[0]], [expout]) - [cp xml-tests/test.dot expout] + [sort xml-tests/test.dot > expout] AT_CHECK([[$XSLTPROC \ `]]AT_QUELL_VALGRIND[[ bison --print-datadir`/xslt/xml2dot.xsl \ - xml-tests/test.xml]], [[0]], [expout]) + xml-tests/test.xml | sort]], [[0]], [expout]) [rm -rf xml-tests expout] AT_RESTORE_SPECIAL_FILES [fi]]) diff --git a/tests/output.at b/tests/output.at index 37d2c3da..657903a5 100644 --- a/tests/output.at +++ b/tests/output.at @@ -264,27 +264,27 @@ a: ; b: 'b'; ]], [[ - 0 [label="State 0\n 0 $accept: . exp $end\l 1 exp: . a '?' b\l 2 a: .\l"] - 0 -> "0R2e" [style = solid] - "0R2e" [style = filled, shape = diamond, fillcolor = 3, label = "R2"] + 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a '?' b\l 2 a: .\l"] 0 -> 1 [style=dashed label="exp"] 0 -> 2 [style=dashed label="a"] - 1 [label="State 1\n 0 $accept: exp . $end\l"] + 0 -> "0R2" [style=solid] + "0R2" [label="R2", fillcolor=3, shape=diamond, style=filled] + 1 [label="State 1\n\l 0 $accept: exp . $end\l"] 1 -> 3 [style=solid label="$end"] - 2 [label="State 2\n 1 exp: a . '?' b\l"] + 2 [label="State 2\n\l 1 exp: a . '?' b\l"] 2 -> 4 [style=solid label="'?'"] - 3 [label="State 3\n 0 $accept: exp $end .\l"] - 3 -> "3R0e" [style = solid] - "3R0e" [style = filled, shape = diamond, fillcolor = 1, label = "Acc"] - 4 [label="State 4\n 1 exp: a '?' . b\l 3 b: . 'b'\l"] + 3 [label="State 3\n\l 0 $accept: exp $end .\l"] + 3 -> "3R0" [style=solid] + "3R0" [label="Acc", fillcolor=1, shape=diamond, style=filled] + 4 [label="State 4\n\l 1 exp: a '?' . b\l 3 b: . 'b'\l"] 4 -> 5 [style=solid label="'b'"] 4 -> 6 [style=dashed label="b"] - 5 [label="State 5\n 3 b: 'b' .\l"] - 5 -> "5R3e" [style = solid] - "5R3e" [style = filled, shape = diamond, fillcolor = 3, label = "R3"] - 6 [label="State 6\n 1 exp: a '?' b .\l"] - 6 -> "6R1e" [style = solid] - "6R1e" [style = filled, shape = diamond, fillcolor = 3, label = "R1"] + 5 [label="State 5\n\l 3 b: 'b' .\l"] + 5 -> "5R3" [style=solid] + "5R3" [label="R3", fillcolor=3, shape=diamond, style=filled] + 6 [label="State 6\n\l 1 exp: a '?' b .\l"] + 6 -> "6R1" [style=solid] + "6R1" [label="R1", fillcolor=3, shape=diamond, style=filled] ]]) ## ------------------------ ## @@ -306,13 +306,7 @@ empty_b: %prec 'b'; empty_c: %prec 'c'; ]], [[ - 0 [label="State 0\n 0 $accept: . start $end\l 1 start: . 'a'\l 2 | . empty_a 'a'\l 3 | . 'b'\l 4 | . empty_b 'b'\l 5 | . 'c'\l 6 | . empty_c 'c'\l 7 empty_a: . ['a']\l 8 empty_b: . ['b']\l 9 empty_c: . ['c']\l"] - 0 -> "0R7d" [label = "['a']" style = solid] - "0R7d" [style = filled, shape = diamond, fillcolor = 5, label = "R7"] - 0 -> "0R8d" [label = "['b']" style = solid] - "0R8d" [style = filled, shape = diamond, fillcolor = 5, label = "R8"] - 0 -> "0R9d" [label = "['c']" style = solid] - "0R9d" [style = filled, shape = diamond, fillcolor = 5, label = "R9"] + 0 [label="State 0\n\l 0 $accept: . start $end\l 1 start: . 'a'\l 2 | . empty_a 'a'\l 3 | . 'b'\l 4 | . empty_b 'b'\l 5 | . 'c'\l 6 | . empty_c 'c'\l 7 empty_a: . ['a']\l 8 empty_b: . ['b']\l 9 empty_c: . ['c']\l"] 0 -> 1 [style=solid label="'a'"] 0 -> 2 [style=solid label="'b'"] 0 -> 3 [style=solid label="'c'"] @@ -320,35 +314,41 @@ empty_c: %prec 'c'; 0 -> 5 [style=dashed label="empty_a"] 0 -> 6 [style=dashed label="empty_b"] 0 -> 7 [style=dashed label="empty_c"] - 1 [label="State 1\n 1 start: 'a' .\l"] - 1 -> "1R1e" [style = solid] - "1R1e" [style = filled, shape = diamond, fillcolor = 3, label = "R1"] - 2 [label="State 2\n 3 start: 'b' .\l"] - 2 -> "2R3e" [style = solid] - "2R3e" [style = filled, shape = diamond, fillcolor = 3, label = "R3"] - 3 [label="State 3\n 5 start: 'c' .\l"] - 3 -> "3R5e" [style = solid] - "3R5e" [style = filled, shape = diamond, fillcolor = 3, label = "R5"] - 4 [label="State 4\n 0 $accept: start . $end\l"] + 0 -> "0R7d" [label="['a']", style=solid] + "0R7d" [label="R7", fillcolor=5, shape=diamond, style=filled] + 0 -> "0R8d" [label="['b']", style=solid] + "0R8d" [label="R8", fillcolor=5, shape=diamond, style=filled] + 0 -> "0R9d" [label="['c']", style=solid] + "0R9d" [label="R9", fillcolor=5, shape=diamond, style=filled] + 1 [label="State 1\n\l 1 start: 'a' .\l"] + 1 -> "1R1" [style=solid] + "1R1" [label="R1", fillcolor=3, shape=diamond, style=filled] + 2 [label="State 2\n\l 3 start: 'b' .\l"] + 2 -> "2R3" [style=solid] + "2R3" [label="R3", fillcolor=3, shape=diamond, style=filled] + 3 [label="State 3\n\l 5 start: 'c' .\l"] + 3 -> "3R5" [style=solid] + "3R5" [label="R5", fillcolor=3, shape=diamond, style=filled] + 4 [label="State 4\n\l 0 $accept: start . $end\l"] 4 -> 8 [style=solid label="$end"] - 5 [label="State 5\n 2 start: empty_a . 'a'\l"] + 5 [label="State 5\n\l 2 start: empty_a . 'a'\l"] 5 -> 9 [style=solid label="'a'"] - 6 [label="State 6\n 4 start: empty_b . 'b'\l"] + 6 [label="State 6\n\l 4 start: empty_b . 'b'\l"] 6 -> 10 [style=solid label="'b'"] - 7 [label="State 7\n 6 start: empty_c . 'c'\l"] + 7 [label="State 7\n\l 6 start: empty_c . 'c'\l"] 7 -> 11 [style=solid label="'c'"] - 8 [label="State 8\n 0 $accept: start $end .\l"] - 8 -> "8R0e" [style = solid] - "8R0e" [style = filled, shape = diamond, fillcolor = 1, label = "Acc"] - 9 [label="State 9\n 2 start: empty_a 'a' .\l"] - 9 -> "9R2e" [style = solid] - "9R2e" [style = filled, shape = diamond, fillcolor = 3, label = "R2"] - 10 [label="State 10\n 4 start: empty_b 'b' .\l"] - 10 -> "10R4e" [style = solid] - "10R4e" [style = filled, shape = diamond, fillcolor = 3, label = "R4"] - 11 [label="State 11\n 6 start: empty_c 'c' .\l"] - 11 -> "11R6e" [style = solid] - "11R6e" [style = filled, shape = diamond, fillcolor = 3, label = "R6"] + 8 [label="State 8\n\l 0 $accept: start $end .\l"] + 8 -> "8R0" [style=solid] + "8R0" [label="Acc", fillcolor=1, shape=diamond, style=filled] + 9 [label="State 9\n\l 2 start: empty_a 'a' .\l"] + 9 -> "9R2" [style=solid] + "9R2" [label="R2", fillcolor=3, shape=diamond, style=filled] + 10 [label="State 10\n\l 4 start: empty_b 'b' .\l"] + 10 -> "10R4" [style=solid] + "10R4" [label="R4", fillcolor=3, shape=diamond, style=filled] + 11 [label="State 11\n\l 6 start: empty_c 'c' .\l"] + 11 -> "11R6" [style=solid] + "11R6" [label="R6", fillcolor=3, shape=diamond, style=filled] ]]) ## ---------------------- ## @@ -373,41 +373,41 @@ empty_b: %prec 'b'; empty_c: %prec 'c'; ]], [[ - 0 [label="State 0\n 0 $accept: . start $end\l 1 start: . 'a'\l 2 | . empty_a 'a'\l 3 | . 'b'\l 4 | . empty_b 'b'\l 5 | . 'c'\l 6 | . empty_c 'c'\l 7 empty_a: . ['a']\l 8 empty_b: . []\l 9 empty_c: . []\l"] - 0 -> "0R7e" [style = solid] - "0R7e" [style = filled, shape = diamond, fillcolor = 3, label = "R7"] + 0 [label="State 0\n\l 0 $accept: . start $end\l 1 start: . 'a'\l 2 | . empty_a 'a'\l 3 | . 'b'\l 4 | . empty_b 'b'\l 5 | . 'c'\l 6 | . empty_c 'c'\l 7 empty_a: . ['a']\l 8 empty_b: . []\l 9 empty_c: . []\l"] 0 -> 1 [style=solid label="'b'"] 0 -> 2 [style=solid label="'c'"] 0 -> 3 [style=dashed label="start"] 0 -> 4 [style=dashed label="empty_a"] 0 -> 5 [style=dashed label="empty_b"] 0 -> 6 [style=dashed label="empty_c"] - 1 [label="State 1\n 3 start: 'b' .\l"] - 1 -> "1R3e" [style = solid] - "1R3e" [style = filled, shape = diamond, fillcolor = 3, label = "R3"] - 2 [label="State 2\n 5 start: 'c' .\l"] - 2 -> "2R5e" [style = solid] - "2R5e" [style = filled, shape = diamond, fillcolor = 3, label = "R5"] - 3 [label="State 3\n 0 $accept: start . $end\l"] + 0 -> "0R7" [style=solid] + "0R7" [label="R7", fillcolor=3, shape=diamond, style=filled] + 1 [label="State 1\n\l 3 start: 'b' .\l"] + 1 -> "1R3" [style=solid] + "1R3" [label="R3", fillcolor=3, shape=diamond, style=filled] + 2 [label="State 2\n\l 5 start: 'c' .\l"] + 2 -> "2R5" [style=solid] + "2R5" [label="R5", fillcolor=3, shape=diamond, style=filled] + 3 [label="State 3\n\l 0 $accept: start . $end\l"] 3 -> 7 [style=solid label="$end"] - 4 [label="State 4\n 2 start: empty_a . 'a'\l"] + 4 [label="State 4\n\l 2 start: empty_a . 'a'\l"] 4 -> 8 [style=solid label="'a'"] - 5 [label="State 5\n 4 start: empty_b . 'b'\l"] + 5 [label="State 5\n\l 4 start: empty_b . 'b'\l"] 5 -> 9 [style=solid label="'b'"] - 6 [label="State 6\n 6 start: empty_c . 'c'\l"] + 6 [label="State 6\n\l 6 start: empty_c . 'c'\l"] 6 -> 10 [style=solid label="'c'"] - 7 [label="State 7\n 0 $accept: start $end .\l"] - 7 -> "7R0e" [style = solid] - "7R0e" [style = filled, shape = diamond, fillcolor = 1, label = "Acc"] - 8 [label="State 8\n 2 start: empty_a 'a' .\l"] - 8 -> "8R2e" [style = solid] - "8R2e" [style = filled, shape = diamond, fillcolor = 3, label = "R2"] - 9 [label="State 9\n 4 start: empty_b 'b' .\l"] - 9 -> "9R4e" [style = solid] - "9R4e" [style = filled, shape = diamond, fillcolor = 3, label = "R4"] - 10 [label="State 10\n 6 start: empty_c 'c' .\l"] - 10 -> "10R6e" [style = solid] - "10R6e" [style = filled, shape = diamond, fillcolor = 3, label = "R6"] + 7 [label="State 7\n\l 0 $accept: start $end .\l"] + 7 -> "7R0" [style=solid] + "7R0" [label="Acc", fillcolor=1, shape=diamond, style=filled] + 8 [label="State 8\n\l 2 start: empty_a 'a' .\l"] + 8 -> "8R2" [style=solid] + "8R2" [label="R2", fillcolor=3, shape=diamond, style=filled] + 9 [label="State 9\n\l 4 start: empty_b 'b' .\l"] + 9 -> "9R4" [style=solid] + "9R4" [label="R4", fillcolor=3, shape=diamond, style=filled] + 10 [label="State 10\n\l 6 start: empty_c 'c' .\l"] + 10 -> "10R6" [style=solid] + "10R6" [label="R6", fillcolor=3, shape=diamond, style=filled] ]]) ## ---------------- ## @@ -421,25 +421,25 @@ a: ; b: ; ]], [[ - 0 [label="State 0\n 0 $accept: . exp $end\l 1 exp: . a\l 2 | . b\l 3 a: . [$end]\l 4 b: . [$end]\l"] - 0 -> "0R3e" [style = solid] - "0R3e" [style = filled, shape = diamond, fillcolor = 3, label = "R3"] - 0 -> "0R4d" [label = "[$end]" style = solid] - "0R4d" [style = filled, shape = diamond, fillcolor = 5, label = "R4"] + 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a\l 2 | . b\l 3 a: . [$end]\l 4 b: . [$end]\l"] 0 -> 1 [style=dashed label="exp"] 0 -> 2 [style=dashed label="a"] 0 -> 3 [style=dashed label="b"] - 1 [label="State 1\n 0 $accept: exp . $end\l"] + 0 -> "0R3" [style=solid] + "0R3" [label="R3", fillcolor=3, shape=diamond, style=filled] + 0 -> "0R4d" [label="[$end]", style=solid] + "0R4d" [label="R4", fillcolor=5, shape=diamond, style=filled] + 1 [label="State 1\n\l 0 $accept: exp . $end\l"] 1 -> 4 [style=solid label="$end"] - 2 [label="State 2\n 1 exp: a .\l"] - 2 -> "2R1e" [style = solid] - "2R1e" [style = filled, shape = diamond, fillcolor = 3, label = "R1"] - 3 [label="State 3\n 2 exp: b .\l"] - 3 -> "3R2e" [style = solid] - "3R2e" [style = filled, shape = diamond, fillcolor = 3, label = "R2"] - 4 [label="State 4\n 0 $accept: exp $end .\l"] - 4 -> "4R0e" [style = solid] - "4R0e" [style = filled, shape = diamond, fillcolor = 1, label = "Acc"] + 2 [label="State 2\n\l 1 exp: a .\l"] + 2 -> "2R1" [style=solid] + "2R1" [label="R1", fillcolor=3, shape=diamond, style=filled] + 3 [label="State 3\n\l 2 exp: b .\l"] + 3 -> "3R2" [style=solid] + "3R2" [label="R2", fillcolor=3, shape=diamond, style=filled] + 4 [label="State 4\n\l 0 $accept: exp $end .\l"] + 4 -> "4R0" [style=solid] + "4R0" [label="Acc", fillcolor=1, shape=diamond, style=filled] ]]) ## ---------------------------------------- ## @@ -454,51 +454,51 @@ b: ; c: ; ]], [[ - 0 [label="State 0\n 0 $accept: . exp $end\l 1 exp: . a ';'\l 2 | . a ';'\l 3 | . a '.'\l 4 | . b '?'\l 5 | . b '!'\l 6 | . c '?'\l 7 | . c ';'\l 8 a: . [';', '.']\l 9 b: . ['?', '!']\l 10 c: . [';', '?']\l"] - 0 -> "0R8e" [style = solid] - "0R8e" [style = filled, shape = diamond, fillcolor = 3, label = "R8"] - 0 -> "0R9e" [label = "['?', '!']" style = solid] - "0R9e" [style = filled, shape = diamond, fillcolor = 3, label = "R9"] - 0 -> "0R10d" [label = "[';', '?']" style = solid] - "0R10d" [style = filled, shape = diamond, fillcolor = 5, label = "R10"] + 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a ';'\l 2 | . a ';'\l 3 | . a '.'\l 4 | . b '?'\l 5 | . b '!'\l 6 | . c '?'\l 7 | . c ';'\l 8 a: . [';', '.']\l 9 b: . ['?', '!']\l 10 c: . [';', '?']\l"] 0 -> 1 [style=dashed label="exp"] 0 -> 2 [style=dashed label="a"] 0 -> 3 [style=dashed label="b"] 0 -> 4 [style=dashed label="c"] - 1 [label="State 1\n 0 $accept: exp . $end\l"] + 0 -> "0R8" [style=solid] + "0R8" [label="R8", fillcolor=3, shape=diamond, style=filled] + 0 -> "0R9" [label="['?', '!']", style=solid] + "0R9" [label="R9", fillcolor=3, shape=diamond, style=filled] + 0 -> "0R10d" [label="[';', '?']", style=solid] + "0R10d" [label="R10", fillcolor=5, shape=diamond, style=filled] + 1 [label="State 1\n\l 0 $accept: exp . $end\l"] 1 -> 5 [style=solid label="$end"] - 2 [label="State 2\n 1 exp: a . ';'\l 2 | a . ';'\l 3 | a . '.'\l"] + 2 [label="State 2\n\l 1 exp: a . ';'\l 2 | a . ';'\l 3 | a . '.'\l"] 2 -> 6 [style=solid label="';'"] 2 -> 7 [style=solid label="'.'"] - 3 [label="State 3\n 4 exp: b . '?'\l 5 | b . '!'\l"] + 3 [label="State 3\n\l 4 exp: b . '?'\l 5 | b . '!'\l"] 3 -> 8 [style=solid label="'?'"] 3 -> 9 [style=solid label="'!'"] - 4 [label="State 4\n 6 exp: c . '?'\l 7 | c . ';'\l"] + 4 [label="State 4\n\l 6 exp: c . '?'\l 7 | c . ';'\l"] 4 -> 10 [style=solid label="';'"] 4 -> 11 [style=solid label="'?'"] - 5 [label="State 5\n 0 $accept: exp $end .\l"] - 5 -> "5R0e" [style = solid] - "5R0e" [style = filled, shape = diamond, fillcolor = 1, label = "Acc"] - 6 [label="State 6\n 1 exp: a ';' . [$end]\l 2 | a ';' . [$end]\l"] - 6 -> "6R1e" [style = solid] - "6R1e" [style = filled, shape = diamond, fillcolor = 3, label = "R1"] - 6 -> "6R2d" [label = "[$end]" style = solid] - "6R2d" [style = filled, shape = diamond, fillcolor = 5, label = "R2"] - 7 [label="State 7\n 3 exp: a '.' .\l"] - 7 -> "7R3e" [style = solid] - "7R3e" [style = filled, shape = diamond, fillcolor = 3, label = "R3"] - 8 [label="State 8\n 4 exp: b '?' .\l"] - 8 -> "8R4e" [style = solid] - "8R4e" [style = filled, shape = diamond, fillcolor = 3, label = "R4"] - 9 [label="State 9\n 5 exp: b '!' .\l"] - 9 -> "9R5e" [style = solid] - "9R5e" [style = filled, shape = diamond, fillcolor = 3, label = "R5"] - 10 [label="State 10\n 7 exp: c ';' .\l"] - 10 -> "10R7e" [style = solid] - "10R7e" [style = filled, shape = diamond, fillcolor = 3, label = "R7"] - 11 [label="State 11\n 6 exp: c '?' .\l"] - 11 -> "11R6e" [style = solid] - "11R6e" [style = filled, shape = diamond, fillcolor = 3, label = "R6"] + 5 [label="State 5\n\l 0 $accept: exp $end .\l"] + 5 -> "5R0" [style=solid] + "5R0" [label="Acc", fillcolor=1, shape=diamond, style=filled] + 6 [label="State 6\n\l 1 exp: a ';' . [$end]\l 2 | a ';' . [$end]\l"] + 6 -> "6R1" [style=solid] + "6R1" [label="R1", fillcolor=3, shape=diamond, style=filled] + 6 -> "6R2d" [label="[$end]", style=solid] + "6R2d" [label="R2", fillcolor=5, shape=diamond, style=filled] + 7 [label="State 7\n\l 3 exp: a '.' .\l"] + 7 -> "7R3" [style=solid] + "7R3" [label="R3", fillcolor=3, shape=diamond, style=filled] + 8 [label="State 8\n\l 4 exp: b '?' .\l"] + 8 -> "8R4" [style=solid] + "8R4" [label="R4", fillcolor=3, shape=diamond, style=filled] + 9 [label="State 9\n\l 5 exp: b '!' .\l"] + 9 -> "9R5" [style=solid] + "9R5" [label="R5", fillcolor=3, shape=diamond, style=filled] + 10 [label="State 10\n\l 7 exp: c ';' .\l"] + 10 -> "10R7" [style=solid] + "10R7" [label="R7", fillcolor=3, shape=diamond, style=filled] + 11 [label="State 11\n\l 6 exp: c '?' .\l"] + 11 -> "11R6" [style=solid] + "11R6" [label="R6", fillcolor=3, shape=diamond, style=filled] ]]) ## ------------------------------------------------------ ## @@ -514,85 +514,85 @@ opexp: exp '+' exp; imm: '0'; ]], [[ - 0 [label="State 0\n 0 $accept: . exp $end\l 1 exp: . ifexp\l 2 | . opexp\l 3 | . imm\l 4 ifexp: . \"if\" exp \"then\" exp elseexp\l 7 opexp: . exp '+' exp\l 8 imm: . '0'\l"] + 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . ifexp\l 2 | . opexp\l 3 | . imm\l 4 ifexp: . \"if\" exp \"then\" exp elseexp\l 7 opexp: . exp '+' exp\l 8 imm: . '0'\l"] 0 -> 1 [style=solid label="\"if\""] 0 -> 2 [style=solid label="'0'"] 0 -> 3 [style=dashed label="exp"] 0 -> 4 [style=dashed label="ifexp"] 0 -> 5 [style=dashed label="opexp"] 0 -> 6 [style=dashed label="imm"] - 1 [label="State 1\n 1 exp: . ifexp\l 2 | . opexp\l 3 | . imm\l 4 ifexp: . \"if\" exp \"then\" exp elseexp\l 4 | \"if\" . exp \"then\" exp elseexp\l 7 opexp: . exp '+' exp\l 8 imm: . '0'\l"] + 1 [label="State 1\n\l 1 exp: . ifexp\l 2 | . opexp\l 3 | . imm\l 4 ifexp: . \"if\" exp \"then\" exp elseexp\l 4 | \"if\" . exp \"then\" exp elseexp\l 7 opexp: . exp '+' exp\l 8 imm: . '0'\l"] 1 -> 1 [style=solid label="\"if\""] 1 -> 2 [style=solid label="'0'"] 1 -> 7 [style=dashed label="exp"] 1 -> 4 [style=dashed label="ifexp"] 1 -> 5 [style=dashed label="opexp"] 1 -> 6 [style=dashed label="imm"] - 2 [label="State 2\n 8 imm: '0' .\l"] - 2 -> "2R8e" [style = solid] - "2R8e" [style = filled, shape = diamond, fillcolor = 3, label = "R8"] - 3 [label="State 3\n 0 $accept: exp . $end\l 7 opexp: exp . '+' exp\l"] + 2 [label="State 2\n\l 8 imm: '0' .\l"] + 2 -> "2R8" [style=solid] + "2R8" [label="R8", fillcolor=3, shape=diamond, style=filled] + 3 [label="State 3\n\l 0 $accept: exp . $end\l 7 opexp: exp . '+' exp\l"] 3 -> 8 [style=solid label="$end"] 3 -> 9 [style=solid label="'+'"] - 4 [label="State 4\n 1 exp: ifexp .\l"] - 4 -> "4R1e" [style = solid] - "4R1e" [style = filled, shape = diamond, fillcolor = 3, label = "R1"] - 5 [label="State 5\n 2 exp: opexp .\l"] - 5 -> "5R2e" [style = solid] - "5R2e" [style = filled, shape = diamond, fillcolor = 3, label = "R2"] - 6 [label="State 6\n 3 exp: imm .\l"] - 6 -> "6R3e" [style = solid] - "6R3e" [style = filled, shape = diamond, fillcolor = 3, label = "R3"] - 7 [label="State 7\n 4 ifexp: \"if\" exp . \"then\" exp elseexp\l 7 opexp: exp . '+' exp\l"] + 4 [label="State 4\n\l 1 exp: ifexp .\l"] + 4 -> "4R1" [style=solid] + "4R1" [label="R1", fillcolor=3, shape=diamond, style=filled] + 5 [label="State 5\n\l 2 exp: opexp .\l"] + 5 -> "5R2" [style=solid] + "5R2" [label="R2", fillcolor=3, shape=diamond, style=filled] + 6 [label="State 6\n\l 3 exp: imm .\l"] + 6 -> "6R3" [style=solid] + "6R3" [label="R3", fillcolor=3, shape=diamond, style=filled] + 7 [label="State 7\n\l 4 ifexp: \"if\" exp . \"then\" exp elseexp\l 7 opexp: exp . '+' exp\l"] 7 -> 10 [style=solid label="\"then\""] 7 -> 9 [style=solid label="'+'"] - 8 [label="State 8\n 0 $accept: exp $end .\l"] - 8 -> "8R0e" [style = solid] - "8R0e" [style = filled, shape = diamond, fillcolor = 1, label = "Acc"] - 9 [label="State 9\n 1 exp: . ifexp\l 2 | . opexp\l 3 | . imm\l 4 ifexp: . \"if\" exp \"then\" exp elseexp\l 7 opexp: . exp '+' exp\l 7 | exp '+' . exp\l 8 imm: . '0'\l"] + 8 [label="State 8\n\l 0 $accept: exp $end .\l"] + 8 -> "8R0" [style=solid] + "8R0" [label="Acc", fillcolor=1, shape=diamond, style=filled] + 9 [label="State 9\n\l 1 exp: . ifexp\l 2 | . opexp\l 3 | . imm\l 4 ifexp: . \"if\" exp \"then\" exp elseexp\l 7 opexp: . exp '+' exp\l 7 | exp '+' . exp\l 8 imm: . '0'\l"] 9 -> 1 [style=solid label="\"if\""] 9 -> 2 [style=solid label="'0'"] 9 -> 11 [style=dashed label="exp"] 9 -> 4 [style=dashed label="ifexp"] 9 -> 5 [style=dashed label="opexp"] 9 -> 6 [style=dashed label="imm"] - 10 [label="State 10\n 1 exp: . ifexp\l 2 | . opexp\l 3 | . imm\l 4 ifexp: . \"if\" exp \"then\" exp elseexp\l 4 | \"if\" exp \"then\" . exp elseexp\l 7 opexp: . exp '+' exp\l 8 imm: . '0'\l"] + 10 [label="State 10\n\l 1 exp: . ifexp\l 2 | . opexp\l 3 | . imm\l 4 ifexp: . \"if\" exp \"then\" exp elseexp\l 4 | \"if\" exp \"then\" . exp elseexp\l 7 opexp: . exp '+' exp\l 8 imm: . '0'\l"] 10 -> 1 [style=solid label="\"if\""] 10 -> 2 [style=solid label="'0'"] 10 -> 12 [style=dashed label="exp"] 10 -> 4 [style=dashed label="ifexp"] 10 -> 5 [style=dashed label="opexp"] 10 -> 6 [style=dashed label="imm"] - 11 [label="State 11\n 7 opexp: exp . '+' exp\l 7 | exp '+' exp . [$end, \"then\", \"else\", '+']\l"] - 11 -> "11R7e" [style = solid] - "11R7e" [style = filled, shape = diamond, fillcolor = 3, label = "R7"] - 11 -> "11R7d" [label = "['+']" style = solid] - "11R7d" [style = filled, shape = diamond, fillcolor = 5, label = "R7"] + 11 [label="State 11\n\l 7 opexp: exp . '+' exp\l 7 | exp '+' exp . [$end, \"then\", \"else\", '+']\l"] 11 -> 9 [style=solid label="'+'"] - 12 [label="State 12\n 4 ifexp: \"if\" exp \"then\" exp . elseexp\l 5 elseexp: . \"else\" exp\l 6 | . [$end, \"then\", \"else\", '+']\l 7 opexp: exp . '+' exp\l"] - 12 -> "12R6e" [style = solid] - "12R6e" [style = filled, shape = diamond, fillcolor = 3, label = "R6"] - 12 -> "12R6d" [label = "[\"else\", '+']" style = solid] - "12R6d" [style = filled, shape = diamond, fillcolor = 5, label = "R6"] + 11 -> "11R7d" [label="['+']", style=solid] + "11R7d" [label="R7", fillcolor=5, shape=diamond, style=filled] + 11 -> "11R7" [style=solid] + "11R7" [label="R7", fillcolor=3, shape=diamond, style=filled] + 12 [label="State 12\n\l 4 ifexp: \"if\" exp \"then\" exp . elseexp\l 5 elseexp: . \"else\" exp\l 6 | . [$end, \"then\", \"else\", '+']\l 7 opexp: exp . '+' exp\l"] 12 -> 13 [style=solid label="\"else\""] 12 -> 9 [style=solid label="'+'"] 12 -> 14 [style=dashed label="elseexp"] - 13 [label="State 13\n 1 exp: . ifexp\l 2 | . opexp\l 3 | . imm\l 4 ifexp: . \"if\" exp \"then\" exp elseexp\l 5 elseexp: \"else\" . exp\l 7 opexp: . exp '+' exp\l 8 imm: . '0'\l"] + 12 -> "12R6d" [label="[\"else\", '+']", style=solid] + "12R6d" [label="R6", fillcolor=5, shape=diamond, style=filled] + 12 -> "12R6" [style=solid] + "12R6" [label="R6", fillcolor=3, shape=diamond, style=filled] + 13 [label="State 13\n\l 1 exp: . ifexp\l 2 | . opexp\l 3 | . imm\l 4 ifexp: . \"if\" exp \"then\" exp elseexp\l 5 elseexp: \"else\" . exp\l 7 opexp: . exp '+' exp\l 8 imm: . '0'\l"] 13 -> 1 [style=solid label="\"if\""] 13 -> 2 [style=solid label="'0'"] 13 -> 15 [style=dashed label="exp"] 13 -> 4 [style=dashed label="ifexp"] 13 -> 5 [style=dashed label="opexp"] 13 -> 6 [style=dashed label="imm"] - 14 [label="State 14\n 4 ifexp: \"if\" exp \"then\" exp elseexp .\l"] - 14 -> "14R4e" [style = solid] - "14R4e" [style = filled, shape = diamond, fillcolor = 3, label = "R4"] - 15 [label="State 15\n 5 elseexp: \"else\" exp . [$end, \"then\", \"else\", '+']\l 7 opexp: exp . '+' exp\l"] - 15 -> "15R5e" [style = solid] - "15R5e" [style = filled, shape = diamond, fillcolor = 3, label = "R5"] - 15 -> "15R5d" [label = "['+']" style = solid] - "15R5d" [style = filled, shape = diamond, fillcolor = 5, label = "R5"] + 14 [label="State 14\n\l 4 ifexp: \"if\" exp \"then\" exp elseexp .\l"] + 14 -> "14R4" [style=solid] + "14R4" [label="R4", fillcolor=3, shape=diamond, style=filled] + 15 [label="State 15\n\l 5 elseexp: \"else\" exp . [$end, \"then\", \"else\", '+']\l 7 opexp: exp . '+' exp\l"] 15 -> 9 [style=solid label="'+'"] + 15 -> "15R5d" [label="['+']", style=solid] + "15R5d" [label="R5", fillcolor=5, shape=diamond, style=filled] + 15 -> "15R5" [style=solid] + "15R5" [label="R5", fillcolor=3, shape=diamond, style=filled] ]]) m4_popdef([AT_TEST]) -- 2.45.2