bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 3/3] xml: match DOT output and xml2dot.xsl processing


From: Akim Demaille
Subject: Re: [PATCH 3/3] xml: match DOT output and xml2dot.xsl processing
Date: Wed, 24 Oct 2012 14:33:06 +0200

That's nice.  We need to test it though.

Le 24 oct. 2012 à 14:13, Theophile Ranquet a écrit :

> Make the DOT produced by XSLT processing similar to the one made with
> the --graph option.
> 
> * data/xslt/xml2dot.xsl: Stylistic changes, and add support for reductions.
> * doc/bison.texi: 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/output.at: Adjust.
> ---
> data/xslt/xml2dot.xsl | 151 +++++++++++++++++++++--
> doc/bison.texi        |   7 +-
> src/graphviz.c        |  25 ++--
> src/print_graph.c     |   8 +-
> tests/output.at       | 322 +++++++++++++++++++++++++-------------------------
> 5 files changed, 323 insertions(+), 190 deletions(-)
> 
> diff --git a/data/xslt/xml2dot.xsl b/data/xslt/xml2dot.xsl
> index 111613c..85d7935 100644
> --- a/data/xslt/xml2dot.xsl
> +++ b/data/xslt/xml2dot.xsl
> @@ -55,9 +55,9 @@
>   <xsl:call-template name="escape">
>     <xsl:with-param name="subject" select="$filename"/>
>   </xsl:call-template>
> -  <xsl:text>&#10;{
> -  node [fontname = courier, shape = box, colorscheme = paired6]
> -  edge [fontname = courier]
> +  <xsl:text>"&#10;{
> +  node [fontname=courier, shape = box, colorscheme = paired6]
> +  edge [fontname=courier]
> 
> </xsl:text>
>   <xsl:apply-templates select="state"/>
> @@ -68,11 +68,22 @@
>   <xsl:call-template name="output-node">
>     <xsl:with-param name="number" select="@number"/>
>     <xsl:with-param name="label">
> -      <xsl:value-of select="@number"/>
>       <xsl:apply-templates select="itemset/item"/>
>     </xsl:with-param>
>   </xsl:call-template>
>   <xsl:apply-templates select="actions/transitions"/>
> +  <xsl:apply-templates select="actions/reductions">
> +    <xsl:with-param name="staten">
> +      <xsl:value-of select="@number"/>
> +    </xsl:with-param>
> +  </xsl:apply-templates>
> +</xsl:template>
> +
> +<xsl:template match="actions/reductions">
> +  <xsl:param name="staten"/>
> +  <xsl:apply-templates select="reduction">
> +    <xsl:with-param name="staten" select="$staten"/>
> +  </xsl:apply-templates>
> </xsl:template>
> 
> <xsl:template match="actions/transitions">
> @@ -80,17 +91,37 @@
> </xsl:template>
> 
> <xsl:template match="item">
> +  <xsl:param name="prev-rule-number"
> +    select="preceding-sibling::item[1]/@rule-number"/>
>   <xsl:apply-templates select="key('bison:ruleByNumber', @rule-number)">
>     <xsl:with-param name="point" select="@point"/>
> +    <xsl:with-param name="num" select="@rule-number"/>
> +    <xsl:with-param name="prev-lhs"
> +      select="key('bison:ruleByNumber', $prev-rule-number)/lhs[text()]"
> +   />
>   </xsl:apply-templates>
>   <xsl:apply-templates select="lookaheads"/>
> </xsl:template>
> 
> <xsl:template match="rule">
>   <xsl:param name="point"/>
> +  <xsl:param name="num"/>
> +  <xsl:param name="prev-lhs"/>
>   <xsl:text>&#10;</xsl:text>
> -  <xsl:value-of select="lhs"/>
> -  <xsl:text> -&gt;</xsl:text>
> +  <xsl:value-of select="$num"/>
> +  <xsl:text> </xsl:text>
> +  <xsl:choose>
> +  <xsl:when test="$prev-lhs = lhs[text()]">
> +      <xsl:call-template name="lpad">
> +        <xsl:with-param name="str" select="'|'"/>
> +        <xsl:with-param name="pad" 
> select="number(string-length(lhs[text()])) + 1"/>
> +      </xsl:call-template>
> +    </xsl:when>
> +    <xsl:otherwise>
> +      <xsl:value-of select="lhs"/>
> +      <xsl:text>:</xsl:text>
> +    </xsl:otherwise>
> +  </xsl:choose>
>   <xsl:if test="$point = 0">
>     <xsl:text> .</xsl:text>
>   </xsl:if>
> @@ -110,7 +141,7 @@
> <xsl:template match="empty"/>
> 
> <xsl:template match="lookaheads">
> -  <xsl:text>[</xsl:text>
> +  <xsl:text>  [</xsl:text>
>   <xsl:apply-templates select="symbol"/>
>   <xsl:text>]</xsl:text>
> </xsl:template>
> @@ -122,6 +153,71 @@
>   </xsl:if>
> </xsl:template>
> 
> +<xsl:template match="reduction">
> +  <xsl:param name="staten"/>
> +
> +  <!-- The edge -->
> +  <xsl:text> </xsl:text>
> +  <xsl:value-of select="$staten"/>
> +  <xsl:text> -> </xsl:text>
> +  <xsl:text>"</xsl:text>

Why several xsl:text?

> +  <xsl:value-of select="$staten"/>
> +  <xsl:text>R</xsl:text>
> +  <xsl:value-of select="@rule"/>
> +  <xsl:if test="@enabled = 'false'">
> +    <xsl:text>d</xsl:text>
> +  </xsl:if>
> +
> +  <xsl:text>" [</xsl:text>
> +  <xsl:if test="@symbol != '$default'">
> +    <xsl:text>label="[</xsl:text>
> +    <xsl:call-template name="escape">
> +      <xsl:with-param name="subject" select="@symbol"/>
> +    </xsl:call-template>
> +    <xsl:text>]", </xsl:text>
> +  </xsl:if>
> +  <xsl:text>style=solid]&#10;</xsl:text>
> +
> +  <!-- The node -->
> +  <xsl:text>"</xsl:text>
> +  <xsl:value-of select="$staten"/>
> +  <xsl:text>R</xsl:text>
> +  <xsl:value-of select="@rule"/>
> +  <xsl:if test="@enabled = 'false'">
> +    <xsl:text>d</xsl:text>
> +  </xsl:if>
> +  <xsl:text>"</xsl:text>
> +  <xsl:text> [label="</xsl:text>
> +
> +  <xsl:choose>
> +  <xsl:when test="@rule = 'accept'">
> +    <xsl:text>Acc</xsl:text>
> +  </xsl:when>
> +  <xsl:otherwise>
> +    <xsl:text>R</xsl:text>
> +    <xsl:value-of select="@rule"/>
> +  </xsl:otherwise>
> +  </xsl:choose>
> +
> +  <xsl:text>", fillcolor=</xsl:text>
> +  <xsl:choose>
> +  <xsl:when test="@enabled = 'true'">
> +    <xsl:choose>
> +    <xsl:when test="@rule = 'accept'">
> +      <xsl:text>1</xsl:text>
> +    </xsl:when>
> +    <xsl:otherwise>
> +      <xsl:text>3</xsl:text>
> +    </xsl:otherwise>
> +    </xsl:choose>
> +  </xsl:when>
> +  <xsl:otherwise>
> +    <xsl:text>5</xsl:text>
> +  </xsl:otherwise>
> +  </xsl:choose>
> +  <xsl:text>, shape=diamond, style=filled]&#10;</xsl:text>
> +</xsl:template>
> +
> <xsl:template match="transition">
>   <xsl:call-template name="output-edge">
>     <xsl:with-param name="src" select="../../../@number"/>
> @@ -150,13 +246,16 @@
> <xsl:template name="output-node">
>   <xsl:param name="number"/>
>   <xsl:param name="label"/>
> -  <xsl:text>  </xsl:text>
> +  <xsl:text> </xsl:text>
>   <xsl:value-of select="$number"/>
>   <xsl:text> [label="</xsl:text>
> +  <xsl:text>State </xsl:text>

Likewise.

> +  <xsl:value-of select="$number"/>
> +  <xsl:text>\n</xsl:text>
>   <xsl:call-template name="escape">
>     <xsl:with-param name="subject" select="$label"/>
>   </xsl:call-template>
> -  <xsl:text>"]&#10;</xsl:text>
> +  <xsl:text>\l"]&#10;</xsl:text>
> </xsl:template>
> 
> <xsl:template name="output-edge">
> @@ -164,7 +263,7 @@
>   <xsl:param name="dst"/>
>   <xsl:param name="style"/>
>   <xsl:param name="label"/>
> -  <xsl:text>  </xsl:text>
> +  <xsl:text> </xsl:text>
>   <xsl:value-of select="$src"/>
>   <xsl:text> -> </xsl:text>
>   <xsl:value-of select="$dst"/>
> @@ -197,7 +296,7 @@
>       </xsl:call-template>
>     </xsl:with-param>
>     <xsl:with-param name="search" select="'&#10;'"/>
> -    <xsl:with-param name="replace" select="'\n'"/>
> +    <xsl:with-param name="replace" select="'\l'"/>
>   </xsl:call-template>
> </xsl:template>
> 
> @@ -223,4 +322,34 @@
>   </xsl:choose>
> </xsl:template>
> 
> +<xsl:template name="lpad">
> +  <xsl:param name="str" select="''"/>
> +  <xsl:param name="pad" select="0"/>
> +  <xsl:variable name="diff" select="$pad - string-length($str)" />
> +  <xsl:choose>
> +    <xsl:when test="$diff &lt; 0">
> +      <xsl:value-of select="$str"/>
> +    </xsl:when>
> +    <xsl:otherwise>
> +      <xsl:call-template name="space">
> +        <xsl:with-param name="repeat" select="$diff"/>
> +      </xsl:call-template>
> +      <xsl:value-of select="$str"/>
> +    </xsl:otherwise>
> +  </xsl:choose>
> +</xsl:template>
> +
> +<xsl:template name="space">
> +  <xsl:param name="repeat">0</xsl:param>
> +  <xsl:param name="fill" select="' '"/>
> +  <xsl:if test="number($repeat) &gt;= 1">
> +    <xsl:call-template name="space">
> +      <xsl:with-param name="repeat" select="$repeat - 1"/>
> +      <xsl:with-param name="fill" select="$fill"/>
> +    </xsl:call-template>
> +    <xsl:value-of select="$fill"/>
> +  </xsl:if>
> +</xsl:template>
> +
> +
> </xsl:stylesheet>

There's no code to share with the text version?  Code to move
into bison.xsl.

> diff --git a/doc/bison.texi b/doc/bison.texi
> index d143cdf..e3587b0 100644
> --- a/doc/bison.texi
> +++ b/doc/bison.texi
> @@ -8638,8 +8638,11 @@ Bison supports two major report formats: textual 
> output (
> alternative is to output an XML file than may then be, with xsltproc, rendered
> as either a raw text format very similar to the verbose file, or as an HTML
> version of the same file, with clickable transitions, or even as a DOT version
> -(which is, as of 2.6.2, a less exciting version than the one obtained with
> address@hidden, but this is subject to change in future releases).
> +(which is a bit different from the one obtained with @option{--graph}: for
> +example when a reduction may be applied for several lookahead tokens, these
> +tokens are shown as a list in the label of a single reduction edge for the
> address@hidden version, but they are shown as one edge per token in the XSLT
> +version).
> 
> The textual file is generated when the options @option{-x} or
> @option{--xml[=FILE]} are specified, see @ref{Invocation,,Invoking Bison}.  If
> diff --git a/src/graphviz.c b/src/graphviz.c
> index 3ae0b54..a3a0542 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",
> @@ -119,21 +119,22 @@ conclude_red (struct obstack *out, int source, 
> rule_number ruleno,
>       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));
> +        fprintf (fout, "label=\"[%s]\", ", obstack_finish0 (out));
> 
>       /* 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);

The indentation will not resist the next automatic reindentation.
Prefer
  fprintf (fout,
           "\"….

>     }
> }
> 
> @@ -199,11 +200,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);
> }
> 
> void
> diff --git a/src/print_graph.c b/src/print_graph.c
> index d5ec5fb..54e05e0 100644
> --- a/src/print_graph.c
> +++ b/src/print_graph.c
> @@ -77,7 +77,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;
> @@ -143,9 +143,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;
> 
> @@ -168,6 +165,9 @@ 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);
> +
> }

Useless empty line.

> 
> 
> diff --git a/tests/output.at b/tests/output.at
> index 37d2c3d..657903a 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"]

Can't you put the label before the style?

> -  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])
> -- 
> 1.7.11.4
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]