{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Context-free grammars"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tock import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Creating CFGs\n",
    "\n",
    "You can create a CFG either by reading from a file (using `Grammar.from_file`) or a list of strings (using `Grammar.from_lines`). The first rule's left-hand side is assumed to be the start symbol."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "nonterminals: {S,T}<br>\n",
       "start: S<br>\n",
       "S &rarr; a T b<br>\n",
       "S &rarr; b<br>\n",
       "T &rarr; T a<br>\n",
       "T &rarr; ε"
      ],
      "text/plain": [
       "<tock.grammars.Grammar at 0x1043dceb0>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g = Grammar.from_lines([\"S -> a T b\",\n",
    "                        \"S -> b\",\n",
    "                        \"T -> T a\",\n",
    "                        \"T -> &\"])\n",
    "g"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'S', 'T'}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.nonterminals"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A `Grammar` can be any unrestricted (type-0) grammar, but currently the grammar-reading functions can only read CFGs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.is_contextfree()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Like `RegularExpression` objects, there isn't a lot you can do with `Grammar` objects other than convert them to automata.\n",
    "\n",
    "## From CFGs to PDAs\n",
    "\n",
    "To convert to a PDA using a top-down construction, use the `from_grammar` function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"403pt\" height=\"133pt\" viewBox=\"0.00 0.00 403.00 133.00\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 129)\">\n",
       "<title>%3</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-129 399,-129 399,4 -4,4\"/>\n",
       "<!-- _START -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>_START</title>\n",
       "</g>\n",
       "<!-- 0 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M71.33,-21C71.33,-21 43.67,-21 43.67,-21 40.83,-21 38,-18.17 38,-15.33 38,-15.33 38,-9.67 38,-9.67 38,-6.83 40.83,-4 43.67,-4 43.67,-4 71.33,-4 71.33,-4 74.17,-4 77,-6.83 77,-9.67 77,-9.67 77,-15.33 77,-15.33 77,-18.17 74.17,-21 71.33,-21\"/>\n",
       "<text text-anchor=\"start\" x=\"42\" y=\"-10\" font-family=\"Courier,monospace\" font-size=\"10.00\">start</text>\n",
       "</g>\n",
       "<!-- _START&#45;&gt;0 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>_START-&gt;0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1.16,-12.5C2.89,-12.5 18.46,-12.5 32.64,-12.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"37.78,-12.5 32.78,-14.75 35.28,-12.5 32.78,-12.5 32.78,-12.5 32.78,-12.5 35.28,-12.5 32.78,-10.25 37.78,-12.5 37.78,-12.5\"/>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M230.83,-21C230.83,-21 209.17,-21 209.17,-21 206.33,-21 203.5,-18.17 203.5,-15.33 203.5,-15.33 203.5,-9.67 203.5,-9.67 203.5,-6.83 206.33,-4 209.17,-4 209.17,-4 230.83,-4 230.83,-4 233.67,-4 236.5,-6.83 236.5,-9.67 236.5,-9.67 236.5,-15.33 236.5,-15.33 236.5,-18.17 233.67,-21 230.83,-21\"/>\n",
       "<text text-anchor=\"start\" x=\"207.5\" y=\"-10\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;2 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>0-&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M77.23,-12.5C107.4,-12.5 166.57,-12.5 198.09,-12.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"203.27,-12.5 198.27,-14.75 200.77,-12.5 198.27,-12.5 198.27,-12.5 198.27,-12.5 200.77,-12.5 198.27,-10.25 203.27,-12.5 203.27,-12.5\"/>\n",
       "<text text-anchor=\"start\" x=\"98\" y=\"-18.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,ε → [S] $</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M385.33,-21C385.33,-21 351.67,-21 351.67,-21 348.83,-21 346,-18.17 346,-15.33 346,-15.33 346,-9.67 346,-9.67 346,-6.83 348.83,-4 351.67,-4 351.67,-4 385.33,-4 385.33,-4 388.17,-4 391,-6.83 391,-9.67 391,-9.67 391,-15.33 391,-15.33 391,-18.17 388.17,-21 385.33,-21\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M386.67,-25C386.67,-25 350.33,-25 350.33,-25 346.17,-25 342,-20.83 342,-16.67 342,-16.67 342,-8.33 342,-8.33 342,-4.17 346.17,0 350.33,0 350.33,0 386.67,0 386.67,0 390.83,0 395,-4.17 395,-8.33 395,-8.33 395,-16.67 395,-16.67 395,-20.83 390.83,-25 386.67,-25\"/>\n",
       "<text text-anchor=\"start\" x=\"350\" y=\"-10\" font-family=\"Courier,monospace\" font-size=\"10.00\">accept</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;1 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>2-&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M236.68,-12.5C260.47,-12.5 306.16,-12.5 336.74,-12.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"341.89,-12.5 336.89,-14.75 339.39,-12.5 336.89,-12.5 336.89,-12.5 336.89,-12.5 339.39,-12.5 336.89,-10.25 341.89,-12.5 341.89,-12.5\"/>\n",
       "<text text-anchor=\"start\" x=\"284.5\" y=\"-18.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,$ → ε</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;2 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>2-&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M207.78,-21.19C201.03,-29.67 205.11,-39 220,-39 232.33,-39 237.25,-32.6 234.74,-25.59\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"232.22,-21.19 236.66,-24.41 233.46,-23.35 234.7,-25.52 234.7,-25.52 234.7,-25.52 233.46,-23.35 232.75,-26.64 232.22,-21.19 232.22,-21.19\"/>\n",
       "<text text-anchor=\"start\" x=\"186\" y=\"-114.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,S → [a] T b</text>\n",
       "<text text-anchor=\"start\" x=\"202\" y=\"-100.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,S → b</text>\n",
       "<text text-anchor=\"start\" x=\"191.5\" y=\"-86.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,T → [T] a</text>\n",
       "<text text-anchor=\"start\" x=\"202\" y=\"-72.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,T → ε</text>\n",
       "<text text-anchor=\"start\" x=\"202\" y=\"-58.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">b,b → ε</text>\n",
       "<text text-anchor=\"start\" x=\"202\" y=\"-44.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">a,a → ε</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "m = from_grammar(g)\n",
    "to_graph(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"558pt\" height=\"622pt\" viewBox=\"0.00 0.00 558.00 621.50\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 617.5)\">\n",
       "<title>%3</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-617.5 554,-617.5 554,4 -4,4\"/>\n",
       "<!-- _START -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>_START</title>\n",
       "</g>\n",
       "<!-- 0 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M104.33,-571C104.33,-571 64.67,-571 64.67,-571 61.83,-571 59,-568.17 59,-565.33 59,-565.33 59,-559.67 59,-559.67 59,-556.83 61.83,-554 64.67,-554 64.67,-554 104.33,-554 104.33,-554 107.17,-554 110,-556.83 110,-559.67 110,-559.67 110,-565.33 110,-565.33 110,-568.17 107.17,-571 104.33,-571\"/>\n",
       "<text text-anchor=\"start\" x=\"63\" y=\"-560\" font-family=\"Courier,monospace\" font-size=\"10.00\">start,ε</text>\n",
       "</g>\n",
       "<!-- _START&#45;&gt;0 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>_START-&gt;0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1.06,-562.5C2.53,-562.5 30.8,-562.5 53.84,-562.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"58.96,-562.5 53.96,-564.75 56.46,-562.5 53.96,-562.5 53.96,-562.5 53.96,-562.5 56.46,-562.5 53.96,-560.25 58.96,-562.5 58.96,-562.5\"/>\n",
       "</g>\n",
       "<!-- 23 -->\n",
       "<g id=\"node25\" class=\"node\">\n",
       "<title>23</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M113.33,-518C113.33,-518 55.67,-518 55.67,-518 52.83,-518 50,-515.17 50,-512.33 50,-512.33 50,-506.67 50,-506.67 50,-503.83 52.83,-501 55.67,-501 55.67,-501 113.33,-501 113.33,-501 116.17,-501 119,-503.83 119,-506.67 119,-506.67 119,-512.33 119,-512.33 119,-515.17 116.17,-518 113.33,-518\"/>\n",
       "<text text-anchor=\"start\" x=\"54\" y=\"-507\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[S] $</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;23 -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>0-&gt;23</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M84.5,-553.85C84.5,-543.63 84.5,-533.42 84.5,-523.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"84.5,-518.2 86.75,-523.2 84.5,-520.7 84.5,-523.2 84.5,-523.2 84.5,-523.2 84.5,-520.7 82.25,-523.2 84.5,-518.2 84.5,-518.2\"/>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>1</title>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>2</title>\n",
       "</g>\n",
       "<!-- 1&#45;&gt;2 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>1-&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"white\" d=\"M104.16,-597.5C130.37,-597.5 178.09,-597.5 206.78,-597.5\"/>\n",
       "<polygon fill=\"white\" stroke=\"white\" points=\"211.91,-597.5 206.91,-599.75 209.41,-597.5 206.91,-597.5 206.91,-597.5 206.91,-597.5 209.41,-597.5 206.91,-595.25 211.91,-597.5 211.91,-597.5\"/>\n",
       "<text text-anchor=\"start\" x=\"152\" y=\"-603.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">a</text>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>3</title>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;3 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>2-&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"white\" d=\"M251.02,-597.5C278.41,-597.5 329.74,-597.5 359.83,-597.5\"/>\n",
       "<polygon fill=\"white\" stroke=\"white\" points=\"364.83,-597.5 359.83,-599.75 362.33,-597.5 359.83,-597.5 359.83,-597.5 359.83,-597.5 362.33,-597.5 359.83,-595.25 364.83,-597.5 364.83,-597.5\"/>\n",
       "<text text-anchor=\"start\" x=\"305\" y=\"-603.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">a</text>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>4</title>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;4 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>3-&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"white\" d=\"M404.27,-597.5C427.52,-597.5 467.16,-597.5 492.57,-597.5\"/>\n",
       "<polygon fill=\"white\" stroke=\"white\" points=\"497.77,-597.5 492.77,-599.75 495.27,-597.5 492.77,-597.5 492.77,-597.5 492.77,-597.5 495.27,-597.5 492.77,-595.25 497.77,-597.5 497.77,-597.5\"/>\n",
       "<text text-anchor=\"start\" x=\"458\" y=\"-603.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">b</text>\n",
       "</g>\n",
       "<!-- 5 -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M125.33,-430C125.33,-430 43.67,-430 43.67,-430 40.83,-430 38,-427.17 38,-424.33 38,-424.33 38,-418.67 38,-418.67 38,-415.83 40.83,-413 43.67,-413 43.67,-413 125.33,-413 125.33,-413 128.17,-413 131,-415.83 131,-418.67 131,-418.67 131,-424.33 131,-424.33 131,-427.17 128.17,-430 125.33,-430\"/>\n",
       "<text text-anchor=\"start\" x=\"42\" y=\"-419\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] T b $</text>\n",
       "</g>\n",
       "<!-- 7 -->\n",
       "<g id=\"node9\" class=\"node\">\n",
       "<title>7</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M266.33,-430C266.33,-430 196.67,-430 196.67,-430 193.83,-430 191,-427.17 191,-424.33 191,-424.33 191,-418.67 191,-418.67 191,-415.83 193.83,-413 196.67,-413 196.67,-413 266.33,-413 266.33,-413 269.17,-413 272,-415.83 272,-418.67 272,-418.67 272,-424.33 272,-424.33 272,-427.17 269.17,-430 266.33,-430\"/>\n",
       "<text text-anchor=\"start\" x=\"195\" y=\"-419\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] b $</text>\n",
       "</g>\n",
       "<!-- 5&#45;&gt;7 -->\n",
       "<g id=\"edge8\" class=\"edge\">\n",
       "<title>5-&gt;7</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M131.38,-421.5C148.67,-421.5 168.31,-421.5 185.52,-421.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"190.78,-421.5 185.78,-423.75 188.28,-421.5 185.78,-421.5 185.78,-421.5 185.78,-421.5 188.28,-421.5 185.78,-419.25 190.78,-421.5 190.78,-421.5\"/>\n",
       "</g>\n",
       "<!-- 6 -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M113.33,-465C113.33,-465 55.67,-465 55.67,-465 52.83,-465 50,-462.17 50,-459.33 50,-459.33 50,-453.67 50,-453.67 50,-450.83 52.83,-448 55.67,-448 55.67,-448 113.33,-448 113.33,-448 116.17,-448 119,-450.83 119,-453.67 119,-453.67 119,-459.33 119,-459.33 119,-462.17 116.17,-465 113.33,-465\"/>\n",
       "<text text-anchor=\"start\" x=\"54\" y=\"-454\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[b] $</text>\n",
       "</g>\n",
       "<!-- 8 -->\n",
       "<g id=\"node10\" class=\"node\">\n",
       "<title>8</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M272.33,-377C272.33,-377 190.67,-377 190.67,-377 187.83,-377 185,-374.17 185,-371.33 185,-371.33 185,-365.67 185,-365.67 185,-362.83 187.83,-360 190.67,-360 190.67,-360 272.33,-360 272.33,-360 275.17,-360 278,-362.83 278,-365.67 278,-365.67 278,-371.33 278,-371.33 278,-374.17 275.17,-377 272.33,-377\"/>\n",
       "<text text-anchor=\"start\" x=\"189\" y=\"-366\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] a b $</text>\n",
       "</g>\n",
       "<!-- 7&#45;&gt;8 -->\n",
       "<g id=\"edge9\" class=\"edge\">\n",
       "<title>7-&gt;8</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M231.5,-412.85C231.5,-402.63 231.5,-392.42 231.5,-382.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"231.5,-377.2 233.75,-382.2 231.5,-379.7 231.5,-382.2 231.5,-382.2 231.5,-382.2 231.5,-379.7 229.25,-382.2 231.5,-377.2 231.5,-377.2\"/>\n",
       "</g>\n",
       "<!-- 9 -->\n",
       "<g id=\"node11\" class=\"node\">\n",
       "<title>9</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M260.33,-342C260.33,-342 202.67,-342 202.67,-342 199.83,-342 197,-339.17 197,-336.33 197,-336.33 197,-330.67 197,-330.67 197,-327.83 199.83,-325 202.67,-325 202.67,-325 260.33,-325 260.33,-325 263.17,-325 266,-327.83 266,-330.67 266,-330.67 266,-336.33 266,-336.33 266,-339.17 263.17,-342 260.33,-342\"/>\n",
       "<text text-anchor=\"start\" x=\"201\" y=\"-331\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[b] $</text>\n",
       "</g>\n",
       "<!-- 7&#45;&gt;9 -->\n",
       "<g id=\"edge10\" class=\"edge\">\n",
       "<title>7-&gt;9</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M204.8,-412.93C176.7,-402.43 138.64,-383.11 155,-359.5 163.4,-347.38 177.79,-340.83 191.85,-337.32\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"197,-336.16 192.61,-339.45 194.56,-336.71 192.12,-337.26 192.12,-337.26 192.12,-337.26 194.56,-336.71 191.62,-335.06 197,-336.16 197,-336.16\"/>\n",
       "</g>\n",
       "<!-- 10 -->\n",
       "<g id=\"node12\" class=\"node\">\n",
       "<title>10</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M266.33,-78C266.33,-78 196.67,-78 196.67,-78 193.83,-78 191,-75.17 191,-72.33 191,-72.33 191,-66.67 191,-66.67 191,-63.83 193.83,-61 196.67,-61 196.67,-61 266.33,-61 266.33,-61 269.17,-61 272,-63.83 272,-66.67 272,-66.67 272,-72.33 272,-72.33 272,-75.17 269.17,-78 266.33,-78\"/>\n",
       "<text text-anchor=\"start\" x=\"195\" y=\"-67\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] b $</text>\n",
       "</g>\n",
       "<!-- 8&#45;&gt;10 -->\n",
       "<g id=\"edge11\" class=\"edge\">\n",
       "<title>8-&gt;10</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M184.63,-361.9C173.05,-357.92 161.98,-351.57 155,-341.5 123.86,-296.57 123.86,-140.43 155,-95.5 162.13,-85.21 173.59,-78.93 185.49,-75.13\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"190.6,-73.64 186.43,-77.19 188.2,-74.34 185.8,-75.03 185.8,-75.03 185.8,-75.03 188.2,-74.34 185.17,-72.87 190.6,-73.64 190.6,-73.64\"/>\n",
       "</g>\n",
       "<!-- 11 -->\n",
       "<g id=\"node13\" class=\"node\">\n",
       "<title>11</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M278.33,-307C278.33,-307 184.67,-307 184.67,-307 181.83,-307 179,-304.17 179,-301.33 179,-301.33 179,-295.67 179,-295.67 179,-292.83 181.83,-290 184.67,-290 184.67,-290 278.33,-290 278.33,-290 281.17,-290 284,-292.83 284,-295.67 284,-295.67 284,-301.33 284,-301.33 284,-304.17 281.17,-307 278.33,-307\"/>\n",
       "<text text-anchor=\"start\" x=\"183\" y=\"-296\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] a a b …</text>\n",
       "</g>\n",
       "<!-- 8&#45;&gt;11 -->\n",
       "<g id=\"edge12\" class=\"edge\">\n",
       "<title>8-&gt;11</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M189.27,-359.92C165.63,-353.06 143.09,-341.69 155,-324.5 159.76,-317.63 166.46,-312.54 173.93,-308.79\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"178.67,-306.62 175.06,-310.75 176.39,-307.66 174.12,-308.7 174.12,-308.7 174.12,-308.7 176.39,-307.66 173.18,-306.66 178.67,-306.62 178.67,-306.62\"/>\n",
       "</g>\n",
       "<!-- 12 -->\n",
       "<g id=\"node14\" class=\"node\">\n",
       "<title>12</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M413.33,-78C413.33,-78 355.67,-78 355.67,-78 352.83,-78 350,-75.17 350,-72.33 350,-72.33 350,-66.67 350,-66.67 350,-63.83 352.83,-61 355.67,-61 355.67,-61 413.33,-61 413.33,-61 416.17,-61 419,-63.83 419,-66.67 419,-66.67 419,-72.33 419,-72.33 419,-75.17 416.17,-78 413.33,-78\"/>\n",
       "<text text-anchor=\"start\" x=\"354\" y=\"-67\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[b] $</text>\n",
       "</g>\n",
       "<!-- 10&#45;&gt;12 -->\n",
       "<g id=\"edge13\" class=\"edge\">\n",
       "<title>10-&gt;12</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M272.17,-69.5C294.5,-69.5 322.27,-69.5 344.49,-69.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"349.72,-69.5 344.72,-71.75 347.22,-69.5 344.72,-69.5 344.72,-69.5 344.72,-69.5 347.22,-69.5 344.72,-67.25 349.72,-69.5 349.72,-69.5\"/>\n",
       "</g>\n",
       "<!-- 14 -->\n",
       "<g id=\"node16\" class=\"node\">\n",
       "<title>14</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M278.33,-201C278.33,-201 184.67,-201 184.67,-201 181.83,-201 179,-198.17 179,-195.33 179,-195.33 179,-189.67 179,-189.67 179,-186.83 181.83,-184 184.67,-184 184.67,-184 278.33,-184 278.33,-184 281.17,-184 284,-186.83 284,-189.67 284,-189.67 284,-195.33 284,-195.33 284,-198.17 281.17,-201 278.33,-201\"/>\n",
       "<text text-anchor=\"start\" x=\"183\" y=\"-190\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] a a a …</text>\n",
       "</g>\n",
       "<!-- 11&#45;&gt;14 -->\n",
       "<g id=\"edge15\" class=\"edge\">\n",
       "<title>11-&gt;14</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M204.02,-289.82C176.74,-279.61 140.88,-260.92 155,-236.5 164.18,-220.63 181.48,-209.99 197.31,-203.15\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"202.17,-201.15 198.41,-205.13 199.86,-202.1 197.55,-203.05 197.55,-203.05 197.55,-203.05 199.86,-202.1 196.69,-200.97 202.17,-201.15 202.17,-201.15\"/>\n",
       "</g>\n",
       "<!-- 15 -->\n",
       "<g id=\"node17\" class=\"node\">\n",
       "<title>15</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M272.33,-254C272.33,-254 190.67,-254 190.67,-254 187.83,-254 185,-251.17 185,-248.33 185,-248.33 185,-242.67 185,-242.67 185,-239.83 187.83,-237 190.67,-237 190.67,-237 272.33,-237 272.33,-237 275.17,-237 278,-239.83 278,-242.67 278,-242.67 278,-248.33 278,-248.33 278,-251.17 275.17,-254 272.33,-254\"/>\n",
       "<text text-anchor=\"start\" x=\"189\" y=\"-243\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] a b $</text>\n",
       "</g>\n",
       "<!-- 11&#45;&gt;15 -->\n",
       "<g id=\"edge16\" class=\"edge\">\n",
       "<title>11-&gt;15</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M231.5,-289.85C231.5,-279.63 231.5,-269.42 231.5,-259.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"231.5,-254.2 233.75,-259.2 231.5,-256.7 231.5,-259.2 231.5,-259.2 231.5,-259.2 231.5,-256.7 229.25,-259.2 231.5,-254.2 231.5,-254.2\"/>\n",
       "</g>\n",
       "<!-- 13 -->\n",
       "<g id=\"node15\" class=\"node\">\n",
       "<title>13</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M534.33,-78C534.33,-78 500.67,-78 500.67,-78 497.83,-78 495,-75.17 495,-72.33 495,-72.33 495,-66.67 495,-66.67 495,-63.83 497.83,-61 500.67,-61 500.67,-61 534.33,-61 534.33,-61 537.17,-61 540,-63.83 540,-66.67 540,-66.67 540,-72.33 540,-72.33 540,-75.17 537.17,-78 534.33,-78\"/>\n",
       "<text text-anchor=\"start\" x=\"499\" y=\"-67\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,$</text>\n",
       "</g>\n",
       "<!-- 12&#45;&gt;13 -->\n",
       "<g id=\"edge14\" class=\"edge\">\n",
       "<title>12-&gt;13</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M419.24,-69.5C441.18,-69.5 469.4,-69.5 489.79,-69.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"494.79,-69.5 489.79,-71.75 492.29,-69.5 489.79,-69.5 489.79,-69.5 489.79,-69.5 492.29,-69.5 489.79,-67.25 494.79,-69.5 494.79,-69.5\"/>\n",
       "</g>\n",
       "<!-- 16 -->\n",
       "<g id=\"node18\" class=\"node\">\n",
       "<title>16</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M540.33,-21C540.33,-21 494.67,-21 494.67,-21 491.83,-21 489,-18.17 489,-15.33 489,-15.33 489,-9.67 489,-9.67 489,-6.83 491.83,-4 494.67,-4 494.67,-4 540.33,-4 540.33,-4 543.17,-4 546,-6.83 546,-9.67 546,-9.67 546,-15.33 546,-15.33 546,-18.17 543.17,-21 540.33,-21\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M541.67,-25C541.67,-25 493.33,-25 493.33,-25 489.17,-25 485,-20.83 485,-16.67 485,-16.67 485,-8.33 485,-8.33 485,-4.17 489.17,0 493.33,0 493.33,0 541.67,0 541.67,0 545.83,0 550,-4.17 550,-8.33 550,-8.33 550,-16.67 550,-16.67 550,-20.83 545.83,-25 541.67,-25\"/>\n",
       "<text text-anchor=\"start\" x=\"493\" y=\"-10\" font-family=\"Courier,monospace\" font-size=\"10.00\">accept,ε</text>\n",
       "</g>\n",
       "<!-- 13&#45;&gt;16 -->\n",
       "<g id=\"edge20\" class=\"edge\">\n",
       "<title>13-&gt;16</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M517.5,-60.89C517.5,-50.82 517.5,-40.75 517.5,-30.68\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"517.5,-25.41 519.75,-30.41 517.5,-27.91 517.5,-30.41 517.5,-30.41 517.5,-30.41 517.5,-27.91 515.25,-30.41 517.5,-25.41 517.5,-25.41\"/>\n",
       "</g>\n",
       "<!-- 14&#45;&gt;14 -->\n",
       "<g id=\"edge17\" class=\"edge\">\n",
       "<title>14-&gt;14</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M220.18,-201.19C213.92,-209.67 217.7,-219 231.5,-219 242.72,-219 247.31,-212.84 245.28,-205.98\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"242.82,-201.19 247.11,-204.61 243.97,-203.41 245.11,-205.63 245.11,-205.63 245.11,-205.63 243.97,-203.41 243.1,-206.66 242.82,-201.19 242.82,-201.19\"/>\n",
       "</g>\n",
       "<!-- 18 -->\n",
       "<g id=\"node20\" class=\"node\">\n",
       "<title>18</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M278.33,-113C278.33,-113 184.67,-113 184.67,-113 181.83,-113 179,-110.17 179,-107.33 179,-107.33 179,-101.67 179,-101.67 179,-98.83 181.83,-96 184.67,-96 184.67,-96 278.33,-96 278.33,-96 281.17,-96 284,-98.83 284,-101.67 284,-101.67 284,-107.33 284,-107.33 284,-110.17 281.17,-113 278.33,-113\"/>\n",
       "<text text-anchor=\"start\" x=\"183\" y=\"-102\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] a a b …</text>\n",
       "</g>\n",
       "<!-- 14&#45;&gt;18 -->\n",
       "<g id=\"edge18\" class=\"edge\">\n",
       "<title>14-&gt;18</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M204.8,-183.93C176.7,-173.43 138.64,-154.11 155,-130.5 159.76,-123.63 166.46,-118.54 173.93,-114.79\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"178.67,-112.62 175.06,-116.75 176.39,-113.66 174.12,-114.7 174.12,-114.7 174.12,-114.7 176.39,-113.66 173.18,-112.66 178.67,-112.62 178.67,-112.62\"/>\n",
       "</g>\n",
       "<!-- 19 -->\n",
       "<g id=\"node21\" class=\"node\">\n",
       "<title>19</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M278.33,-148C278.33,-148 184.67,-148 184.67,-148 181.83,-148 179,-145.17 179,-142.33 179,-142.33 179,-136.67 179,-136.67 179,-133.83 181.83,-131 184.67,-131 184.67,-131 278.33,-131 278.33,-131 281.17,-131 284,-133.83 284,-136.67 284,-136.67 284,-142.33 284,-142.33 284,-145.17 281.17,-148 278.33,-148\"/>\n",
       "<text text-anchor=\"start\" x=\"183\" y=\"-137\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] a a a …</text>\n",
       "</g>\n",
       "<!-- 14&#45;&gt;19 -->\n",
       "<g id=\"edge19\" class=\"edge\">\n",
       "<title>14-&gt;19</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M231.5,-183.85C231.5,-173.63 231.5,-163.42 231.5,-153.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"231.5,-148.2 233.75,-153.2 231.5,-150.7 231.5,-153.2 231.5,-153.2 231.5,-153.2 231.5,-150.7 229.25,-153.2 231.5,-148.2 231.5,-148.2\"/>\n",
       "</g>\n",
       "<!-- 17 -->\n",
       "<g id=\"node19\" class=\"node\">\n",
       "<title>17</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M419.33,-254C419.33,-254 349.67,-254 349.67,-254 346.83,-254 344,-251.17 344,-248.33 344,-248.33 344,-242.67 344,-242.67 344,-239.83 346.83,-237 349.67,-237 349.67,-237 419.33,-237 419.33,-237 422.17,-237 425,-239.83 425,-242.67 425,-242.67 425,-248.33 425,-248.33 425,-251.17 422.17,-254 419.33,-254\"/>\n",
       "<text text-anchor=\"start\" x=\"348\" y=\"-243\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] b $</text>\n",
       "</g>\n",
       "<!-- 15&#45;&gt;17 -->\n",
       "<g id=\"edge21\" class=\"edge\">\n",
       "<title>15-&gt;17</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M278.21,-245.5C297.26,-245.5 319.31,-245.5 338.3,-245.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"343.57,-245.5 338.57,-247.75 341.07,-245.5 338.57,-245.5 338.57,-245.5 338.57,-245.5 341.07,-245.5 338.57,-243.25 343.57,-245.5 343.57,-245.5\"/>\n",
       "</g>\n",
       "<!-- 20 -->\n",
       "<g id=\"node22\" class=\"node\">\n",
       "<title>20</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M425.33,-113C425.33,-113 343.67,-113 343.67,-113 340.83,-113 338,-110.17 338,-107.33 338,-107.33 338,-101.67 338,-101.67 338,-98.83 340.83,-96 343.67,-96 343.67,-96 425.33,-96 425.33,-96 428.17,-96 431,-98.83 431,-101.67 431,-101.67 431,-107.33 431,-107.33 431,-110.17 428.17,-113 425.33,-113\"/>\n",
       "<text text-anchor=\"start\" x=\"342\" y=\"-102\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] a b $</text>\n",
       "</g>\n",
       "<!-- 18&#45;&gt;20 -->\n",
       "<g id=\"edge22\" class=\"edge\">\n",
       "<title>18-&gt;20</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M284.04,-104.5C299.7,-104.5 316.89,-104.5 332.52,-104.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"337.75,-104.5 332.75,-106.75 335.25,-104.5 332.75,-104.5 332.75,-104.5 332.75,-104.5 335.25,-104.5 332.75,-102.25 337.75,-104.5 337.75,-104.5\"/>\n",
       "</g>\n",
       "<!-- 21 -->\n",
       "<g id=\"node23\" class=\"node\">\n",
       "<title>21</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M431.33,-183C431.33,-183 337.67,-183 337.67,-183 334.83,-183 332,-180.17 332,-177.33 332,-177.33 332,-171.67 332,-171.67 332,-168.83 334.83,-166 337.67,-166 337.67,-166 431.33,-166 431.33,-166 434.17,-166 437,-168.83 437,-171.67 437,-171.67 437,-177.33 437,-177.33 437,-180.17 434.17,-183 431.33,-183\"/>\n",
       "<text text-anchor=\"start\" x=\"336\" y=\"-172\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] a a a …</text>\n",
       "</g>\n",
       "<!-- 19&#45;&gt;21 -->\n",
       "<g id=\"edge23\" class=\"edge\">\n",
       "<title>19-&gt;21</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M269.44,-148.06C291.27,-153.12 318.99,-159.55 341.64,-164.8\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"346.68,-165.97 341.3,-167.03 344.25,-165.4 341.81,-164.84 341.81,-164.84 341.81,-164.84 344.25,-165.4 342.32,-162.64 346.68,-165.97 346.68,-165.97\"/>\n",
       "</g>\n",
       "<!-- 22 -->\n",
       "<g id=\"node24\" class=\"node\">\n",
       "<title>22</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M431.33,-148C431.33,-148 337.67,-148 337.67,-148 334.83,-148 332,-145.17 332,-142.33 332,-142.33 332,-136.67 332,-136.67 332,-133.83 334.83,-131 337.67,-131 337.67,-131 431.33,-131 431.33,-131 434.17,-131 437,-133.83 437,-136.67 437,-136.67 437,-142.33 437,-142.33 437,-145.17 434.17,-148 431.33,-148\"/>\n",
       "<text text-anchor=\"start\" x=\"336\" y=\"-137\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] a a b …</text>\n",
       "</g>\n",
       "<!-- 19&#45;&gt;22 -->\n",
       "<g id=\"edge24\" class=\"edge\">\n",
       "<title>19-&gt;22</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M284.04,-139.5C297.82,-139.5 312.78,-139.5 326.81,-139.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"331.93,-139.5 326.93,-141.75 329.43,-139.5 326.93,-139.5 326.93,-139.5 326.93,-139.5 329.43,-139.5 326.93,-137.25 331.93,-139.5 331.93,-139.5\"/>\n",
       "</g>\n",
       "<!-- 23&#45;&gt;5 -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>23-&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M62.66,-500.82C38.72,-489.94 5.44,-469.98 19.5,-447.5 23.59,-440.97 29.63,-436.08 36.42,-432.42\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"41.22,-430.07 37.71,-434.29 38.97,-431.17 36.72,-432.27 36.72,-432.27 36.72,-432.27 38.97,-431.17 35.74,-430.25 41.22,-430.07 41.22,-430.07\"/>\n",
       "</g>\n",
       "<!-- 23&#45;&gt;6 -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>23-&gt;6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M84.5,-500.85C84.5,-490.63 84.5,-480.42 84.5,-470.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"84.5,-465.2 86.75,-470.2 84.5,-467.7 84.5,-470.2 84.5,-470.2 84.5,-470.2 84.5,-467.7 82.25,-470.2 84.5,-465.2 84.5,-465.2\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "run(m, \"a a b\", show_stack=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This diagram is a little hard to read, but one thing to note is the cycle between `loop` and `3.1`. This is caused by the left-recursive rule `T -> T a`, which the automaton applies an unbounded number of times.\n",
    "\n",
    "### Shift-reduce parsing\n",
    "\n",
    "There's also a bottom-up version:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"403pt\" height=\"133pt\" viewBox=\"0.00 0.00 403.00 133.00\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 129)\">\n",
       "<title>%3</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-129 399,-129 399,4 -4,4\"/>\n",
       "<!-- _START -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>_START</title>\n",
       "</g>\n",
       "<!-- 0 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M71.33,-21C71.33,-21 43.67,-21 43.67,-21 40.83,-21 38,-18.17 38,-15.33 38,-15.33 38,-9.67 38,-9.67 38,-6.83 40.83,-4 43.67,-4 43.67,-4 71.33,-4 71.33,-4 74.17,-4 77,-6.83 77,-9.67 77,-9.67 77,-15.33 77,-15.33 77,-18.17 74.17,-21 71.33,-21\"/>\n",
       "<text text-anchor=\"start\" x=\"42\" y=\"-10\" font-family=\"Courier,monospace\" font-size=\"10.00\">start</text>\n",
       "</g>\n",
       "<!-- _START&#45;&gt;0 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>_START-&gt;0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1.16,-12.5C2.89,-12.5 18.46,-12.5 32.64,-12.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"37.78,-12.5 32.78,-14.75 35.28,-12.5 32.78,-12.5 32.78,-12.5 32.78,-12.5 35.28,-12.5 32.78,-10.25 37.78,-12.5 37.78,-12.5\"/>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M209.83,-21C209.83,-21 188.17,-21 188.17,-21 185.33,-21 182.5,-18.17 182.5,-15.33 182.5,-15.33 182.5,-9.67 182.5,-9.67 182.5,-6.83 185.33,-4 188.17,-4 188.17,-4 209.83,-4 209.83,-4 212.67,-4 215.5,-6.83 215.5,-9.67 215.5,-9.67 215.5,-15.33 215.5,-15.33 215.5,-18.17 212.67,-21 209.83,-21\"/>\n",
       "<text text-anchor=\"start\" x=\"186.5\" y=\"-10\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;2 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>0-&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M77.02,-12.5C103.01,-12.5 150.14,-12.5 177.27,-12.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"182.41,-12.5 177.41,-14.75 179.91,-12.5 177.41,-12.5 177.41,-12.5 177.41,-12.5 179.91,-12.5 177.41,-10.25 182.41,-12.5 182.41,-12.5\"/>\n",
       "<text text-anchor=\"start\" x=\"98.5\" y=\"-18.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,ε → $</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M385.33,-21C385.33,-21 351.67,-21 351.67,-21 348.83,-21 346,-18.17 346,-15.33 346,-15.33 346,-9.67 346,-9.67 346,-6.83 348.83,-4 351.67,-4 351.67,-4 385.33,-4 385.33,-4 388.17,-4 391,-6.83 391,-9.67 391,-9.67 391,-15.33 391,-15.33 391,-18.17 388.17,-21 385.33,-21\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M386.67,-25C386.67,-25 350.33,-25 350.33,-25 346.17,-25 342,-20.83 342,-16.67 342,-16.67 342,-8.33 342,-8.33 342,-4.17 346.17,0 350.33,0 350.33,0 386.67,0 386.67,0 390.83,0 395,-4.17 395,-8.33 395,-8.33 395,-16.67 395,-16.67 395,-20.83 390.83,-25 386.67,-25\"/>\n",
       "<text text-anchor=\"start\" x=\"350\" y=\"-10\" font-family=\"Courier,monospace\" font-size=\"10.00\">accept</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;1 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>2-&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M215.76,-12.5C243.39,-12.5 301.04,-12.5 336.79,-12.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"341.9,-12.5 336.9,-14.75 339.4,-12.5 336.9,-12.5 336.9,-12.5 336.9,-12.5 339.4,-12.5 336.9,-10.25 341.9,-12.5 341.9,-12.5\"/>\n",
       "<text text-anchor=\"start\" x=\"263\" y=\"-18.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,[S] $ → ε</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;2 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>2-&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M186.78,-21.19C180.03,-29.67 184.11,-39 199,-39 211.33,-39 216.25,-32.6 213.74,-25.59\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"211.22,-21.19 215.66,-24.41 212.46,-23.35 213.7,-25.52 213.7,-25.52 213.7,-25.52 212.46,-23.35 211.75,-26.64 211.22,-21.19 211.22,-21.19\"/>\n",
       "<text text-anchor=\"start\" x=\"165\" y=\"-114.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,[b] T a → S</text>\n",
       "<text text-anchor=\"start\" x=\"181\" y=\"-100.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,b → S</text>\n",
       "<text text-anchor=\"start\" x=\"170.5\" y=\"-86.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,[a] T → T</text>\n",
       "<text text-anchor=\"start\" x=\"181\" y=\"-72.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,ε → T</text>\n",
       "<text text-anchor=\"start\" x=\"181\" y=\"-58.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">b,ε → b</text>\n",
       "<text text-anchor=\"start\" x=\"181\" y=\"-44.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">a,ε → a</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "m = from_grammar(g, mode=\"bottomup\")\n",
    "to_graph(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"562pt\" height=\"1023pt\" viewBox=\"0.00 0.00 562.00 1022.50\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 1018.5)\">\n",
       "<title>%3</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-1018.5 558,-1018.5 558,4 -4,4\"/>\n",
       "<!-- _START -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>_START</title>\n",
       "</g>\n",
       "<!-- 14 -->\n",
       "<g id=\"node16\" class=\"node\">\n",
       "<title>14</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M104.33,-972C104.33,-972 64.67,-972 64.67,-972 61.83,-972 59,-969.17 59,-966.33 59,-966.33 59,-960.67 59,-960.67 59,-957.83 61.83,-955 64.67,-955 64.67,-955 104.33,-955 104.33,-955 107.17,-955 110,-957.83 110,-960.67 110,-960.67 110,-966.33 110,-966.33 110,-969.17 107.17,-972 104.33,-972\"/>\n",
       "<text text-anchor=\"start\" x=\"63\" y=\"-961\" font-family=\"Courier,monospace\" font-size=\"10.00\">start,ε</text>\n",
       "</g>\n",
       "<!-- _START&#45;&gt;14 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>_START-&gt;14</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1.06,-963.5C2.53,-963.5 30.8,-963.5 53.84,-963.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"58.96,-963.5 53.96,-965.75 56.46,-963.5 53.96,-963.5 53.96,-963.5 53.96,-963.5 56.46,-963.5 53.96,-961.25 58.96,-963.5 58.96,-963.5\"/>\n",
       "</g>\n",
       "<!-- 0 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-229C548.33,-229 466.67,-229 466.67,-229 463.83,-229 461,-226.17 461,-223.33 461,-223.33 461,-217.67 461,-217.67 461,-214.83 463.83,-212 466.67,-212 466.67,-212 548.33,-212 548.33,-212 551.17,-212 554,-214.83 554,-217.67 554,-217.67 554,-223.33 554,-223.33 554,-226.17 551.17,-229 548.33,-229\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-218\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] T S …</text>\n",
       "</g>\n",
       "<!-- 19 -->\n",
       "<g id=\"node21\" class=\"node\">\n",
       "<title>19</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-17C548.33,-17 466.67,-17 466.67,-17 463.83,-17 461,-14.17 461,-11.33 461,-11.33 461,-5.67 461,-5.67 461,-2.83 463.83,0 466.67,0 466.67,0 548.33,0 548.33,0 551.17,0 554,-2.83 554,-5.67 554,-5.67 554,-11.33 554,-11.33 554,-14.17 551.17,-17 548.33,-17\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-6\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] T T …</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;19 -->\n",
       "<g id=\"edge94\" class=\"edge\">\n",
       "<title>0-&gt;19</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M461.41,-211.86C451.83,-207.87 442.87,-202.03 437,-193.5 406.02,-148.46 414.47,-120.31 437,-70.5 447.13,-48.1 469.79,-30.58 486.71,-19.95\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"491.31,-17.14 488.21,-21.67 489.18,-18.45 487.04,-19.75 487.04,-19.75 487.04,-19.75 489.18,-18.45 485.87,-17.83 491.31,-17.14 491.31,-17.14\"/>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M542.33,-352C542.33,-352 472.67,-352 472.67,-352 469.83,-352 467,-349.17 467,-346.33 467,-346.33 467,-340.67 467,-340.67 467,-337.83 469.83,-335 472.67,-335 472.67,-335 542.33,-335 542.33,-335 545.17,-335 548,-337.83 548,-340.67 548,-340.67 548,-346.33 548,-346.33 548,-349.17 545.17,-352 542.33,-352\"/>\n",
       "<text text-anchor=\"start\" x=\"471\" y=\"-341\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[S] a $</text>\n",
       "</g>\n",
       "<!-- 5 -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-282C548.33,-282 466.67,-282 466.67,-282 463.83,-282 461,-279.17 461,-276.33 461,-276.33 461,-270.67 461,-270.67 461,-267.83 463.83,-265 466.67,-265 466.67,-265 548.33,-265 548.33,-265 551.17,-265 554,-267.83 554,-270.67 554,-270.67 554,-276.33 554,-276.33 554,-279.17 551.17,-282 548.33,-282\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-271\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] S a …</text>\n",
       "</g>\n",
       "<!-- 1&#45;&gt;5 -->\n",
       "<g id=\"edge76\" class=\"edge\">\n",
       "<title>1-&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M470.59,-334.96C447.98,-327.87 425.41,-316.22 437,-299.5 441.74,-292.66 448.49,-287.62 455.96,-283.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"460.69,-281.75 457.07,-285.87 458.41,-282.78 456.14,-283.82 456.14,-283.82 456.14,-283.82 458.41,-282.78 455.21,-281.77 460.69,-281.75 460.69,-281.75\"/>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-676C548.33,-676 466.67,-676 466.67,-676 463.83,-676 461,-673.17 461,-670.33 461,-670.33 461,-664.67 461,-664.67 461,-661.83 463.83,-659 466.67,-659 466.67,-659 548.33,-659 548.33,-659 551.17,-659 554,-661.83 554,-664.67 554,-664.67 554,-670.33 554,-670.33 554,-673.17 551.17,-676 548.33,-676\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-665\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[S] T T …</text>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-553C548.33,-553 466.67,-553 466.67,-553 463.83,-553 461,-550.17 461,-547.33 461,-547.33 461,-541.67 461,-541.67 461,-538.83 463.83,-536 466.67,-536 466.67,-536 548.33,-536 548.33,-536 551.17,-536 554,-538.83 554,-541.67 554,-541.67 554,-547.33 554,-547.33 554,-550.17 551.17,-553 548.33,-553\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-542\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] S T …</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;3 -->\n",
       "<g id=\"edge87\" class=\"edge\">\n",
       "<title>2-&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M461.41,-658.86C451.83,-654.87 442.87,-649.03 437,-640.5 423.9,-621.46 425.79,-608.71 437,-588.5 445.63,-572.95 462.29,-562.17 477.25,-555.18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"481.82,-553.13 478.18,-557.23 479.54,-554.15 477.26,-555.17 477.26,-555.17 477.26,-555.17 479.54,-554.15 476.34,-553.12 481.82,-553.13 481.82,-553.13\"/>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;0 -->\n",
       "<g id=\"edge92\" class=\"edge\">\n",
       "<title>3-&gt;0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M461.41,-535.86C451.83,-531.87 442.87,-526.03 437,-517.5 405.14,-471.18 409.73,-313.67 437,-264.5 445.63,-248.95 462.29,-238.17 477.25,-231.18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"481.82,-229.13 478.18,-233.23 479.54,-230.15 477.26,-231.17 477.26,-231.17 477.26,-231.17 479.54,-230.15 476.34,-229.12 481.82,-229.13 481.82,-229.13\"/>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-641C548.33,-641 466.67,-641 466.67,-641 463.83,-641 461,-638.17 461,-635.33 461,-635.33 461,-629.67 461,-629.67 461,-626.83 463.83,-624 466.67,-624 466.67,-624 548.33,-624 548.33,-624 551.17,-624 554,-626.83 554,-629.67 554,-629.67 554,-635.33 554,-635.33 554,-638.17 551.17,-641 548.33,-641\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-630\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[S] T a …</text>\n",
       "</g>\n",
       "<!-- 4&#45;&gt;3 -->\n",
       "<g id=\"edge89\" class=\"edge\">\n",
       "<title>4-&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M461.41,-623.86C451.83,-619.87 442.87,-614.03 437,-605.5 422.41,-584.28 453.18,-565.88 478.57,-554.98\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"483.24,-553.04 479.49,-557.04 480.93,-554 478.62,-554.96 478.62,-554.96 478.62,-554.96 480.93,-554 477.76,-552.89 483.24,-553.04 483.24,-553.04\"/>\n",
       "</g>\n",
       "<!-- 5&#45;&gt;0 -->\n",
       "<g id=\"edge90\" class=\"edge\">\n",
       "<title>5-&gt;0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M507.5,-264.85C507.5,-254.63 507.5,-244.42 507.5,-234.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"507.5,-229.2 509.75,-234.2 507.5,-231.7 507.5,-234.2 507.5,-234.2 507.5,-234.2 507.5,-231.7 505.25,-234.2 507.5,-229.2 507.5,-229.2\"/>\n",
       "</g>\n",
       "<!-- 6 -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-88C548.33,-88 466.67,-88 466.67,-88 463.83,-88 461,-85.17 461,-82.33 461,-82.33 461,-76.67 461,-76.67 461,-73.83 463.83,-71 466.67,-71 466.67,-71 548.33,-71 548.33,-71 551.17,-71 554,-73.83 554,-76.67 554,-76.67 554,-82.33 554,-82.33 554,-85.17 551.17,-88 548.33,-88\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-77\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] T b …</text>\n",
       "</g>\n",
       "<!-- 6&#45;&gt;19 -->\n",
       "<g id=\"edge95\" class=\"edge\">\n",
       "<title>6-&gt;19</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M507.5,-70.72C507.5,-54.52 507.5,-38.33 507.5,-22.13\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"507.5,-17.1 509.75,-22.1 507.5,-19.6 507.5,-22.1 507.5,-22.1 507.5,-22.1 507.5,-19.6 505.25,-22.1 507.5,-17.1 507.5,-17.1\"/>\n",
       "</g>\n",
       "<!-- 7 -->\n",
       "<g id=\"node9\" class=\"node\">\n",
       "<title>7</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-141C548.33,-141 466.67,-141 466.67,-141 463.83,-141 461,-138.17 461,-135.33 461,-135.33 461,-129.67 461,-129.67 461,-126.83 463.83,-124 466.67,-124 466.67,-124 548.33,-124 548.33,-124 551.17,-124 554,-126.83 554,-129.67 554,-129.67 554,-135.33 554,-135.33 554,-138.17 551.17,-141 548.33,-141\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-130\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] b T …</text>\n",
       "</g>\n",
       "<!-- 7&#45;&gt;6 -->\n",
       "<g id=\"edge85\" class=\"edge\">\n",
       "<title>7-&gt;6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M507.5,-123.85C507.5,-113.63 507.5,-103.42 507.5,-93.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"507.5,-88.2 509.75,-93.2 507.5,-90.7 507.5,-93.2 507.5,-93.2 507.5,-93.2 507.5,-90.7 505.25,-93.2 507.5,-88.2 507.5,-88.2\"/>\n",
       "</g>\n",
       "<!-- 8 -->\n",
       "<g id=\"node10\" class=\"node\">\n",
       "<title>8</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M407.33,-396C407.33,-396 325.67,-396 325.67,-396 322.83,-396 320,-393.17 320,-390.33 320,-390.33 320,-384.67 320,-384.67 320,-381.83 322.83,-379 325.67,-379 325.67,-379 407.33,-379 407.33,-379 410.17,-379 413,-381.83 413,-384.67 413,-384.67 413,-390.33 413,-390.33 413,-393.17 410.17,-396 407.33,-396\"/>\n",
       "<text text-anchor=\"start\" x=\"324\" y=\"-385\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] T T …</text>\n",
       "</g>\n",
       "<!-- 8&#45;&gt;8 -->\n",
       "<g id=\"edge81\" class=\"edge\">\n",
       "<title>8-&gt;8</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M356.07,-396.19C350.31,-404.67 353.79,-414 366.5,-414 376.83,-414 381.06,-407.84 379.2,-400.98\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"376.93,-396.19 381.1,-399.74 378,-398.45 379.07,-400.71 379.07,-400.71 379.07,-400.71 378,-398.45 377.03,-401.67 376.93,-396.19 376.93,-396.19\"/>\n",
       "</g>\n",
       "<!-- 9 -->\n",
       "<g id=\"node11\" class=\"node\">\n",
       "<title>9</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-194C548.33,-194 466.67,-194 466.67,-194 463.83,-194 461,-191.17 461,-188.33 461,-188.33 461,-182.67 461,-182.67 461,-179.83 463.83,-177 466.67,-177 466.67,-177 548.33,-177 548.33,-177 551.17,-177 554,-179.83 554,-182.67 554,-182.67 554,-188.33 554,-188.33 554,-191.17 551.17,-194 548.33,-194\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-183\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[b] T T …</text>\n",
       "</g>\n",
       "<!-- 8&#45;&gt;9 -->\n",
       "<g id=\"edge82\" class=\"edge\">\n",
       "<title>8-&gt;9</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M369.49,-378.76C376.59,-349.52 403.35,-254.11 461,-202.5 463.47,-200.29 466.26,-198.35 469.21,-196.66\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"473.96,-194.2 470.55,-198.5 471.74,-195.35 469.52,-196.5 469.52,-196.5 469.52,-196.5 471.74,-195.35 468.48,-194.5 473.96,-194.2 473.96,-194.2\"/>\n",
       "</g>\n",
       "<!-- 9&#45;&gt;2 -->\n",
       "<g id=\"edge84\" class=\"edge\">\n",
       "<title>9-&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M460.69,-193.75C451.38,-197.6 442.72,-203.24 437,-211.5 409.85,-250.68 409.99,-601.23 437,-640.5 441.86,-647.56 448.84,-652.78 456.54,-656.63\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"461.41,-658.86 455.93,-658.83 459.14,-657.82 456.86,-656.78 456.86,-656.78 456.86,-656.78 459.14,-657.82 457.8,-654.74 461.41,-658.86 461.41,-658.86\"/>\n",
       "</g>\n",
       "<!-- 9&#45;&gt;7 -->\n",
       "<g id=\"edge83\" class=\"edge\">\n",
       "<title>9-&gt;7</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M507.5,-176.85C507.5,-166.63 507.5,-156.42 507.5,-146.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"507.5,-141.2 509.75,-146.2 507.5,-143.7 507.5,-146.2 507.5,-146.2 507.5,-146.2 507.5,-143.7 505.25,-146.2 507.5,-141.2 507.5,-141.2\"/>\n",
       "</g>\n",
       "<!-- 10 -->\n",
       "<g id=\"node12\" class=\"node\">\n",
       "<title>10</title>\n",
       "</g>\n",
       "<!-- 13 -->\n",
       "<g id=\"node15\" class=\"node\">\n",
       "<title>13</title>\n",
       "</g>\n",
       "<!-- 10&#45;&gt;13 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>10-&gt;13</title>\n",
       "<path fill=\"none\" stroke=\"white\" d=\"M386.25,-998.5C411.12,-998.5 455.05,-998.5 482.38,-998.5\"/>\n",
       "<polygon fill=\"white\" stroke=\"white\" points=\"487.61,-998.5 482.61,-1000.75 485.11,-998.5 482.61,-998.5 482.61,-998.5 482.61,-998.5 485.11,-998.5 482.61,-996.25 487.61,-998.5 487.61,-998.5\"/>\n",
       "<text text-anchor=\"start\" x=\"434\" y=\"-1004.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">b</text>\n",
       "</g>\n",
       "<!-- 11 -->\n",
       "<g id=\"node13\" class=\"node\">\n",
       "<title>11</title>\n",
       "</g>\n",
       "<!-- 11&#45;&gt;10 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>11-&gt;10</title>\n",
       "<path fill=\"none\" stroke=\"white\" d=\"M245.25,-998.5C270.12,-998.5 314.05,-998.5 341.38,-998.5\"/>\n",
       "<polygon fill=\"white\" stroke=\"white\" points=\"346.61,-998.5 341.61,-1000.75 344.11,-998.5 341.61,-998.5 341.61,-998.5 341.61,-998.5 344.11,-998.5 341.61,-996.25 346.61,-998.5 346.61,-998.5\"/>\n",
       "<text text-anchor=\"start\" x=\"293\" y=\"-1004.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">a</text>\n",
       "</g>\n",
       "<!-- 12 -->\n",
       "<g id=\"node14\" class=\"node\">\n",
       "<title>12</title>\n",
       "</g>\n",
       "<!-- 12&#45;&gt;11 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>12-&gt;11</title>\n",
       "<path fill=\"none\" stroke=\"white\" d=\"M104.25,-998.5C129.12,-998.5 173.05,-998.5 200.38,-998.5\"/>\n",
       "<polygon fill=\"white\" stroke=\"white\" points=\"205.61,-998.5 200.61,-1000.75 203.11,-998.5 200.61,-998.5 200.61,-998.5 200.61,-998.5 203.11,-998.5 200.61,-996.25 205.61,-998.5 205.61,-998.5\"/>\n",
       "<text text-anchor=\"start\" x=\"152\" y=\"-1004.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">a</text>\n",
       "</g>\n",
       "<!-- 15 -->\n",
       "<g id=\"node17\" class=\"node\">\n",
       "<title>15</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M101.33,-919C101.33,-919 67.67,-919 67.67,-919 64.83,-919 62,-916.17 62,-913.33 62,-913.33 62,-907.67 62,-907.67 62,-904.83 64.83,-902 67.67,-902 67.67,-902 101.33,-902 101.33,-902 104.17,-902 107,-904.83 107,-907.67 107,-907.67 107,-913.33 107,-913.33 107,-916.17 104.17,-919 101.33,-919\"/>\n",
       "<text text-anchor=\"start\" x=\"66\" y=\"-908\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,$</text>\n",
       "</g>\n",
       "<!-- 14&#45;&gt;15 -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>14-&gt;15</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M84.5,-954.85C84.5,-944.63 84.5,-934.42 84.5,-924.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"84.5,-919.2 86.75,-924.2 84.5,-921.7 84.5,-924.2 84.5,-924.2 84.5,-924.2 84.5,-921.7 82.25,-924.2 84.5,-919.2 84.5,-919.2\"/>\n",
       "</g>\n",
       "<!-- 16 -->\n",
       "<g id=\"node18\" class=\"node\">\n",
       "<title>16</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M113.33,-866C113.33,-866 55.67,-866 55.67,-866 52.83,-866 50,-863.17 50,-860.33 50,-860.33 50,-854.67 50,-854.67 50,-851.83 52.83,-849 55.67,-849 55.67,-849 113.33,-849 113.33,-849 116.17,-849 119,-851.83 119,-854.67 119,-854.67 119,-860.33 119,-860.33 119,-863.17 116.17,-866 113.33,-866\"/>\n",
       "<text text-anchor=\"start\" x=\"54\" y=\"-855\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] $</text>\n",
       "</g>\n",
       "<!-- 15&#45;&gt;16 -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>15-&gt;16</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M84.5,-901.85C84.5,-891.63 84.5,-881.42 84.5,-871.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"84.5,-866.2 86.75,-871.2 84.5,-868.7 84.5,-871.2 84.5,-871.2 84.5,-871.2 84.5,-868.7 82.25,-871.2 84.5,-866.2 84.5,-866.2\"/>\n",
       "</g>\n",
       "<!-- 21 -->\n",
       "<g id=\"node23\" class=\"node\">\n",
       "<title>21</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M254.33,-887C254.33,-887 196.67,-887 196.67,-887 193.83,-887 191,-884.17 191,-881.33 191,-881.33 191,-875.67 191,-875.67 191,-872.83 193.83,-870 196.67,-870 196.67,-870 254.33,-870 254.33,-870 257.17,-870 260,-872.83 260,-875.67 260,-875.67 260,-881.33 260,-881.33 260,-884.17 257.17,-887 254.33,-887\"/>\n",
       "<text text-anchor=\"start\" x=\"195\" y=\"-876\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] $</text>\n",
       "</g>\n",
       "<!-- 15&#45;&gt;21 -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>15-&gt;21</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M107.22,-905.5C128.19,-900.67 160.42,-893.25 185.79,-887.41\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"190.76,-886.27 186.4,-889.58 188.33,-886.83 185.89,-887.39 185.89,-887.39 185.89,-887.39 188.33,-886.83 185.39,-885.2 190.76,-886.27 190.76,-886.27\"/>\n",
       "</g>\n",
       "<!-- 22 -->\n",
       "<g id=\"node24\" class=\"node\">\n",
       "<title>22</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M119.33,-813C119.33,-813 49.67,-813 49.67,-813 46.83,-813 44,-810.17 44,-807.33 44,-807.33 44,-801.67 44,-801.67 44,-798.83 46.83,-796 49.67,-796 49.67,-796 119.33,-796 119.33,-796 122.17,-796 125,-798.83 125,-801.67 125,-801.67 125,-807.33 125,-807.33 125,-810.17 122.17,-813 119.33,-813\"/>\n",
       "<text text-anchor=\"start\" x=\"48\" y=\"-802\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] T $</text>\n",
       "</g>\n",
       "<!-- 16&#45;&gt;22 -->\n",
       "<g id=\"edge8\" class=\"edge\">\n",
       "<title>16-&gt;22</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M84.5,-848.85C84.5,-838.63 84.5,-828.42 84.5,-818.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"84.5,-813.2 86.75,-818.2 84.5,-815.7 84.5,-818.2 84.5,-818.2 84.5,-818.2 84.5,-815.7 82.25,-818.2 84.5,-813.2 84.5,-813.2\"/>\n",
       "</g>\n",
       "<!-- 23 -->\n",
       "<g id=\"node25\" class=\"node\">\n",
       "<title>23</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M260.33,-852C260.33,-852 190.67,-852 190.67,-852 187.83,-852 185,-849.17 185,-846.33 185,-846.33 185,-840.67 185,-840.67 185,-837.83 187.83,-835 190.67,-835 190.67,-835 260.33,-835 260.33,-835 263.17,-835 266,-837.83 266,-840.67 266,-840.67 266,-846.33 266,-846.33 266,-849.17 263.17,-852 260.33,-852\"/>\n",
       "<text text-anchor=\"start\" x=\"189\" y=\"-841\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] T $</text>\n",
       "</g>\n",
       "<!-- 16&#45;&gt;23 -->\n",
       "<g id=\"edge9\" class=\"edge\">\n",
       "<title>16-&gt;23</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M119.15,-854.11C137.37,-852.28 160.11,-849.99 179.8,-848\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"185,-847.48 180.25,-850.22 182.51,-847.73 180.02,-847.98 180.02,-847.98 180.02,-847.98 182.51,-847.73 179.8,-845.74 185,-847.48 185,-847.48\"/>\n",
       "</g>\n",
       "<!-- 17 -->\n",
       "<g id=\"node19\" class=\"node\">\n",
       "<title>17</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M536.33,-317C536.33,-317 478.67,-317 478.67,-317 475.83,-317 473,-314.17 473,-311.33 473,-311.33 473,-305.67 473,-305.67 473,-302.83 475.83,-300 478.67,-300 478.67,-300 536.33,-300 536.33,-300 539.17,-300 542,-302.83 542,-305.67 542,-305.67 542,-311.33 542,-311.33 542,-314.17 539.17,-317 536.33,-317\"/>\n",
       "<text text-anchor=\"start\" x=\"477\" y=\"-306\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[S] $</text>\n",
       "</g>\n",
       "<!-- 18 -->\n",
       "<g id=\"node20\" class=\"node\">\n",
       "<title>18</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M530.33,-391C530.33,-391 484.67,-391 484.67,-391 481.83,-391 479,-388.17 479,-385.33 479,-385.33 479,-379.67 479,-379.67 479,-376.83 481.83,-374 484.67,-374 484.67,-374 530.33,-374 530.33,-374 533.17,-374 536,-376.83 536,-379.67 536,-379.67 536,-385.33 536,-385.33 536,-388.17 533.17,-391 530.33,-391\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M531.67,-395C531.67,-395 483.33,-395 483.33,-395 479.17,-395 475,-390.83 475,-386.67 475,-386.67 475,-378.33 475,-378.33 475,-374.17 479.17,-370 483.33,-370 483.33,-370 531.67,-370 531.67,-370 535.83,-370 540,-374.17 540,-378.33 540,-378.33 540,-386.67 540,-386.67 540,-390.83 535.83,-395 531.67,-395\"/>\n",
       "<text text-anchor=\"start\" x=\"483\" y=\"-380\" font-family=\"Courier,monospace\" font-size=\"10.00\">accept,ε</text>\n",
       "</g>\n",
       "<!-- 17&#45;&gt;18 -->\n",
       "<g id=\"edge97\" class=\"edge\">\n",
       "<title>17-&gt;18</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M472.84,-312.72C459.34,-316.25 445.17,-322.71 437,-334.5 425.19,-351.54 447.4,-364.3 469.94,-372.37\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"474.74,-374.02 469.28,-374.52 472.38,-373.2 470.01,-372.39 470.01,-372.39 470.01,-372.39 472.38,-373.2 470.74,-370.26 474.74,-374.02 474.74,-374.02\"/>\n",
       "</g>\n",
       "<!-- 20 -->\n",
       "<g id=\"node22\" class=\"node\">\n",
       "<title>20</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M542.33,-430C542.33,-430 472.67,-430 472.67,-430 469.83,-430 467,-427.17 467,-424.33 467,-424.33 467,-418.67 467,-418.67 467,-415.83 469.83,-413 472.67,-413 472.67,-413 542.33,-413 542.33,-413 545.17,-413 548,-415.83 548,-418.67 548,-418.67 548,-424.33 548,-424.33 548,-427.17 545.17,-430 542.33,-430\"/>\n",
       "<text text-anchor=\"start\" x=\"471\" y=\"-419\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] S $</text>\n",
       "</g>\n",
       "<!-- 17&#45;&gt;20 -->\n",
       "<g id=\"edge96\" class=\"edge\">\n",
       "<title>17-&gt;20</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M472.84,-312.72C459.34,-316.25 445.17,-322.71 437,-334.5 421.81,-356.42 421.89,-372.53 437,-394.5 443,-403.22 452.23,-409.13 462.06,-413.13\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"466.92,-414.94 461.45,-415.3 464.58,-414.07 462.24,-413.19 462.24,-413.19 462.24,-413.19 464.58,-414.07 463.03,-411.09 466.92,-414.94 466.92,-414.94\"/>\n",
       "</g>\n",
       "<!-- 19&#45;&gt;19 -->\n",
       "<g id=\"edge93\" class=\"edge\">\n",
       "<title>19-&gt;19</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M497.07,-17.19C491.31,-25.67 494.79,-35 507.5,-35 517.83,-35 522.06,-28.84 520.2,-21.98\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"517.93,-17.19 522.1,-20.74 519,-19.45 520.07,-21.71 520.07,-21.71 520.07,-21.71 519,-19.45 518.03,-22.67 517.93,-17.19 517.93,-17.19\"/>\n",
       "</g>\n",
       "<!-- 20&#45;&gt;0 -->\n",
       "<g id=\"edge91\" class=\"edge\">\n",
       "<title>20-&gt;0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M466.92,-414.94C455.34,-410.99 443.98,-404.65 437,-394.5 404.26,-346.9 408.98,-315.03 437,-264.5 445.63,-248.95 462.29,-238.17 477.25,-231.18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"481.82,-229.13 478.18,-233.23 479.54,-230.15 477.26,-231.17 477.26,-231.17 477.26,-231.17 479.54,-230.15 476.34,-229.12 481.82,-229.13 481.82,-229.13\"/>\n",
       "</g>\n",
       "<!-- 24 -->\n",
       "<g id=\"node26\" class=\"node\">\n",
       "<title>24</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M260.33,-747C260.33,-747 190.67,-747 190.67,-747 187.83,-747 185,-744.17 185,-741.33 185,-741.33 185,-735.67 185,-735.67 185,-732.83 187.83,-730 190.67,-730 190.67,-730 260.33,-730 260.33,-730 263.17,-730 266,-732.83 266,-735.67 266,-735.67 266,-741.33 266,-741.33 266,-744.17 263.17,-747 260.33,-747\"/>\n",
       "<text text-anchor=\"start\" x=\"189\" y=\"-736\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] a $</text>\n",
       "</g>\n",
       "<!-- 21&#45;&gt;24 -->\n",
       "<g id=\"edge10\" class=\"edge\">\n",
       "<title>21-&gt;24</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M190.84,-873.76C177.34,-870.03 163.17,-863.38 155,-851.5 133.09,-819.64 132.98,-796.28 155,-764.5 161,-755.84 170.24,-750.05 180.07,-746.19\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"184.93,-744.45 180.98,-748.26 182.57,-745.29 180.22,-746.14 180.22,-746.14 180.22,-746.14 182.57,-745.29 179.46,-744.02 184.93,-744.45 184.93,-744.45\"/>\n",
       "</g>\n",
       "<!-- 25 -->\n",
       "<g id=\"node27\" class=\"node\">\n",
       "<title>25</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M401.33,-887C401.33,-887 331.67,-887 331.67,-887 328.83,-887 326,-884.17 326,-881.33 326,-881.33 326,-875.67 326,-875.67 326,-872.83 328.83,-870 331.67,-870 331.67,-870 401.33,-870 401.33,-870 404.17,-870 407,-872.83 407,-875.67 407,-875.67 407,-881.33 407,-881.33 407,-884.17 404.17,-887 401.33,-887\"/>\n",
       "<text text-anchor=\"start\" x=\"330\" y=\"-876\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] a $</text>\n",
       "</g>\n",
       "<!-- 21&#45;&gt;25 -->\n",
       "<g id=\"edge11\" class=\"edge\">\n",
       "<title>21-&gt;25</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M260.15,-878.5C278.37,-878.5 301.11,-878.5 320.8,-878.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"326,-878.5 321,-880.75 323.5,-878.5 321,-878.5 321,-878.5 321,-878.5 323.5,-878.5 321,-876.25 326,-878.5 326,-878.5\"/>\n",
       "</g>\n",
       "<!-- 27 -->\n",
       "<g id=\"node29\" class=\"node\">\n",
       "<title>27</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M125.33,-742C125.33,-742 43.67,-742 43.67,-742 40.83,-742 38,-739.17 38,-736.33 38,-736.33 38,-730.67 38,-730.67 38,-727.83 40.83,-725 43.67,-725 43.67,-725 125.33,-725 125.33,-725 128.17,-725 131,-727.83 131,-730.67 131,-730.67 131,-736.33 131,-736.33 131,-739.17 128.17,-742 125.33,-742\"/>\n",
       "<text text-anchor=\"start\" x=\"42\" y=\"-731\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] T T …</text>\n",
       "</g>\n",
       "<!-- 22&#45;&gt;27 -->\n",
       "<g id=\"edge17\" class=\"edge\">\n",
       "<title>22-&gt;27</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M84.5,-795.72C84.5,-779.52 84.5,-763.33 84.5,-747.13\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"84.5,-742.1 86.75,-747.1 84.5,-744.6 84.5,-747.1 84.5,-747.1 84.5,-747.1 84.5,-744.6 82.25,-747.1 84.5,-742.1 84.5,-742.1\"/>\n",
       "</g>\n",
       "<!-- 28 -->\n",
       "<g id=\"node30\" class=\"node\">\n",
       "<title>28</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M266.33,-817C266.33,-817 184.67,-817 184.67,-817 181.83,-817 179,-814.17 179,-811.33 179,-811.33 179,-805.67 179,-805.67 179,-802.83 181.83,-800 184.67,-800 184.67,-800 266.33,-800 266.33,-800 269.17,-800 272,-802.83 272,-805.67 272,-805.67 272,-811.33 272,-811.33 272,-814.17 269.17,-817 266.33,-817\"/>\n",
       "<text text-anchor=\"start\" x=\"183\" y=\"-806\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] T T …</text>\n",
       "</g>\n",
       "<!-- 22&#45;&gt;28 -->\n",
       "<g id=\"edge18\" class=\"edge\">\n",
       "<title>22-&gt;28</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M125.33,-805.65C140.32,-806.08 157.58,-806.57 173.46,-807.03\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"178.78,-807.18 173.72,-809.29 176.28,-807.11 173.78,-807.04 173.78,-807.04 173.78,-807.04 176.28,-807.11 173.85,-804.79 178.78,-807.18 178.78,-807.18\"/>\n",
       "</g>\n",
       "<!-- 26 -->\n",
       "<g id=\"node28\" class=\"node\">\n",
       "<title>26</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M254.33,-782C254.33,-782 196.67,-782 196.67,-782 193.83,-782 191,-779.17 191,-776.33 191,-776.33 191,-770.67 191,-770.67 191,-767.83 193.83,-765 196.67,-765 196.67,-765 254.33,-765 254.33,-765 257.17,-765 260,-767.83 260,-770.67 260,-770.67 260,-776.33 260,-776.33 260,-779.17 257.17,-782 254.33,-782\"/>\n",
       "<text text-anchor=\"start\" x=\"195\" y=\"-771\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] $</text>\n",
       "</g>\n",
       "<!-- 23&#45;&gt;26 -->\n",
       "<g id=\"edge12\" class=\"edge\">\n",
       "<title>23-&gt;26</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M188.59,-834.96C165.98,-827.87 143.41,-816.22 155,-799.5 162.15,-789.18 173.89,-782.94 185.76,-779.18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"190.84,-777.72 186.66,-781.26 188.44,-778.41 186.04,-779.1 186.04,-779.1 186.04,-779.1 188.44,-778.41 185.41,-776.94 190.84,-777.72 190.84,-777.72\"/>\n",
       "</g>\n",
       "<!-- 31 -->\n",
       "<g id=\"node33\" class=\"node\">\n",
       "<title>31</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M266.33,-712C266.33,-712 184.67,-712 184.67,-712 181.83,-712 179,-709.17 179,-706.33 179,-706.33 179,-700.67 179,-700.67 179,-697.83 181.83,-695 184.67,-695 184.67,-695 266.33,-695 266.33,-695 269.17,-695 272,-697.83 272,-700.67 272,-700.67 272,-706.33 272,-706.33 272,-709.17 269.17,-712 266.33,-712\"/>\n",
       "<text text-anchor=\"start\" x=\"183\" y=\"-701\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] a T …</text>\n",
       "</g>\n",
       "<!-- 23&#45;&gt;31 -->\n",
       "<g id=\"edge13\" class=\"edge\">\n",
       "<title>23-&gt;31</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M184.92,-836.94C173.34,-832.99 161.98,-826.65 155,-816.5 133.09,-784.64 132.98,-761.28 155,-729.5 159.74,-722.66 166.49,-717.62 173.96,-713.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"178.69,-711.75 175.07,-715.87 176.41,-712.78 174.14,-713.82 174.14,-713.82 174.14,-713.82 176.41,-712.78 173.21,-711.77 178.69,-711.75 178.69,-711.75\"/>\n",
       "</g>\n",
       "<!-- 32 -->\n",
       "<g id=\"node34\" class=\"node\">\n",
       "<title>32</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M407.33,-838C407.33,-838 325.67,-838 325.67,-838 322.83,-838 320,-835.17 320,-832.33 320,-832.33 320,-826.67 320,-826.67 320,-823.83 322.83,-821 325.67,-821 325.67,-821 407.33,-821 407.33,-821 410.17,-821 413,-823.83 413,-826.67 413,-826.67 413,-832.33 413,-832.33 413,-835.17 410.17,-838 407.33,-838\"/>\n",
       "<text text-anchor=\"start\" x=\"324\" y=\"-827\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] a T …</text>\n",
       "</g>\n",
       "<!-- 23&#45;&gt;32 -->\n",
       "<g id=\"edge14\" class=\"edge\">\n",
       "<title>23-&gt;32</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M266.33,-839.49C281.32,-837.98 298.58,-836.24 314.46,-834.64\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"319.78,-834.1 315.03,-836.84 317.29,-834.36 314.81,-834.61 314.81,-834.61 314.81,-834.61 317.29,-834.36 314.58,-832.37 319.78,-834.1 319.78,-834.1\"/>\n",
       "</g>\n",
       "<!-- 33 -->\n",
       "<g id=\"node35\" class=\"node\">\n",
       "<title>33</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M266.33,-659C266.33,-659 184.67,-659 184.67,-659 181.83,-659 179,-656.17 179,-653.33 179,-653.33 179,-647.67 179,-647.67 179,-644.83 181.83,-642 184.67,-642 184.67,-642 266.33,-642 266.33,-642 269.17,-642 272,-644.83 272,-647.67 272,-647.67 272,-653.33 272,-653.33 272,-656.17 269.17,-659 266.33,-659\"/>\n",
       "<text text-anchor=\"start\" x=\"183\" y=\"-648\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] T a …</text>\n",
       "</g>\n",
       "<!-- 24&#45;&gt;33 -->\n",
       "<g id=\"edge25\" class=\"edge\">\n",
       "<title>24-&gt;33</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M184.92,-731.94C173.34,-727.99 161.98,-721.65 155,-711.5 140.41,-690.28 171.18,-671.88 196.57,-660.98\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"201.24,-659.04 197.49,-663.04 198.93,-660 196.62,-660.96 196.62,-660.96 196.62,-660.96 198.93,-660 195.76,-658.89 201.24,-659.04 201.24,-659.04\"/>\n",
       "</g>\n",
       "<!-- 34 -->\n",
       "<g id=\"node36\" class=\"node\">\n",
       "<title>34</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M407.33,-712C407.33,-712 325.67,-712 325.67,-712 322.83,-712 320,-709.17 320,-706.33 320,-706.33 320,-700.67 320,-700.67 320,-697.83 322.83,-695 325.67,-695 325.67,-695 407.33,-695 407.33,-695 410.17,-695 413,-697.83 413,-700.67 413,-700.67 413,-706.33 413,-706.33 413,-709.17 410.17,-712 407.33,-712\"/>\n",
       "<text text-anchor=\"start\" x=\"324\" y=\"-701\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] T a …</text>\n",
       "</g>\n",
       "<!-- 24&#45;&gt;34 -->\n",
       "<g id=\"edge26\" class=\"edge\">\n",
       "<title>24-&gt;34</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M260.5,-729.94C280.44,-724.92 305.72,-718.55 326.47,-713.33\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"331.37,-712.09 327.07,-715.5 328.94,-712.71 326.52,-713.32 326.52,-713.32 326.52,-713.32 328.94,-712.71 325.97,-711.13 331.37,-712.09 331.37,-712.09\"/>\n",
       "</g>\n",
       "<!-- 35 -->\n",
       "<g id=\"node37\" class=\"node\">\n",
       "<title>35</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M407.33,-537C407.33,-537 325.67,-537 325.67,-537 322.83,-537 320,-534.17 320,-531.33 320,-531.33 320,-525.67 320,-525.67 320,-522.83 322.83,-520 325.67,-520 325.67,-520 407.33,-520 407.33,-520 410.17,-520 413,-522.83 413,-525.67 413,-525.67 413,-531.33 413,-531.33 413,-534.17 410.17,-537 407.33,-537\"/>\n",
       "<text text-anchor=\"start\" x=\"324\" y=\"-526\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] a a …</text>\n",
       "</g>\n",
       "<!-- 25&#45;&gt;35 -->\n",
       "<g id=\"edge29\" class=\"edge\">\n",
       "<title>25-&gt;35</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M338.39,-869.93C322.94,-863.62 305.11,-853.33 296,-837.5 280.32,-810.24 278.09,-580.34 296,-554.5 300.74,-547.66 307.49,-542.62 314.96,-538.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"319.69,-536.75 316.07,-540.87 317.41,-537.78 315.14,-538.82 315.14,-538.82 315.14,-538.82 317.41,-537.78 314.21,-536.77 319.69,-536.75 319.69,-536.75\"/>\n",
       "</g>\n",
       "<!-- 36 -->\n",
       "<g id=\"node38\" class=\"node\">\n",
       "<title>36</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-887C548.33,-887 466.67,-887 466.67,-887 463.83,-887 461,-884.17 461,-881.33 461,-881.33 461,-875.67 461,-875.67 461,-872.83 463.83,-870 466.67,-870 466.67,-870 548.33,-870 548.33,-870 551.17,-870 554,-872.83 554,-875.67 554,-875.67 554,-881.33 554,-881.33 554,-884.17 551.17,-887 548.33,-887\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-876\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[b] a a …</text>\n",
       "</g>\n",
       "<!-- 25&#45;&gt;36 -->\n",
       "<g id=\"edge30\" class=\"edge\">\n",
       "<title>25-&gt;36</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M407.33,-878.5C422.32,-878.5 439.58,-878.5 455.46,-878.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"460.78,-878.5 455.78,-880.75 458.28,-878.5 455.78,-878.5 455.78,-878.5 455.78,-878.5 458.28,-878.5 455.78,-876.25 460.78,-878.5 460.78,-878.5\"/>\n",
       "</g>\n",
       "<!-- 29 -->\n",
       "<g id=\"node31\" class=\"node\">\n",
       "<title>29</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M260.33,-624C260.33,-624 190.67,-624 190.67,-624 187.83,-624 185,-621.17 185,-618.33 185,-618.33 185,-612.67 185,-612.67 185,-609.83 187.83,-607 190.67,-607 190.67,-607 260.33,-607 260.33,-607 263.17,-607 266,-609.83 266,-612.67 266,-612.67 266,-618.33 266,-618.33 266,-621.17 263.17,-624 260.33,-624\"/>\n",
       "<text text-anchor=\"start\" x=\"189\" y=\"-613\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] T $</text>\n",
       "</g>\n",
       "<!-- 26&#45;&gt;29 -->\n",
       "<g id=\"edge19\" class=\"edge\">\n",
       "<title>26-&gt;29</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M190.84,-768.76C177.34,-765.03 163.17,-758.38 155,-746.5 128.55,-708.05 128.42,-679.86 155,-641.5 161,-632.84 170.24,-627.05 180.07,-623.19\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"184.93,-621.45 180.98,-625.26 182.57,-622.29 180.22,-623.14 180.22,-623.14 180.22,-623.14 182.57,-622.29 179.46,-621.02 184.93,-621.45 184.93,-621.45\"/>\n",
       "</g>\n",
       "<!-- 30 -->\n",
       "<g id=\"node32\" class=\"node\">\n",
       "<title>30</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M401.33,-764C401.33,-764 331.67,-764 331.67,-764 328.83,-764 326,-761.17 326,-758.33 326,-758.33 326,-752.67 326,-752.67 326,-749.83 328.83,-747 331.67,-747 331.67,-747 401.33,-747 401.33,-747 404.17,-747 407,-749.83 407,-752.67 407,-752.67 407,-758.33 407,-758.33 407,-761.17 404.17,-764 401.33,-764\"/>\n",
       "<text text-anchor=\"start\" x=\"330\" y=\"-753\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] T $</text>\n",
       "</g>\n",
       "<!-- 26&#45;&gt;30 -->\n",
       "<g id=\"edge20\" class=\"edge\">\n",
       "<title>26-&gt;30</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M260.15,-769.14C278.37,-766.78 301.11,-763.84 320.8,-761.29\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"326,-760.62 321.33,-763.49 323.52,-760.94 321.04,-761.26 321.04,-761.26 321.04,-761.26 323.52,-760.94 320.75,-759.03 326,-760.62 326,-760.62\"/>\n",
       "</g>\n",
       "<!-- 27&#45;&gt;27 -->\n",
       "<g id=\"edge15\" class=\"edge\">\n",
       "<title>27-&gt;27</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M74.96,-742.19C69.7,-750.67 72.88,-760 84.5,-760 93.95,-760 97.81,-753.84 96.11,-746.98\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"94.04,-742.19 98.08,-745.88 95.03,-744.48 96.02,-746.78 96.02,-746.78 96.02,-746.78 95.03,-744.48 93.95,-747.67 94.04,-742.19 94.04,-742.19\"/>\n",
       "</g>\n",
       "<!-- 27&#45;&gt;28 -->\n",
       "<g id=\"edge16\" class=\"edge\">\n",
       "<title>27-&gt;28</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M98.11,-742.15C115.71,-753.99 148.88,-775.5 179,-790.5 184.35,-793.16 190.19,-795.72 195.85,-798.03\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"200.55,-799.91 195.07,-800.14 198.23,-798.98 195.91,-798.05 195.91,-798.05 195.91,-798.05 198.23,-798.98 196.74,-795.96 200.55,-799.91 200.55,-799.91\"/>\n",
       "</g>\n",
       "<!-- 28&#45;&gt;29 -->\n",
       "<g id=\"edge21\" class=\"edge\">\n",
       "<title>28-&gt;29</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M179.41,-799.86C169.83,-795.87 160.87,-790.03 155,-781.5 137.37,-755.87 137.28,-667.07 155,-641.5 161,-632.84 170.24,-627.05 180.07,-623.19\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"184.93,-621.45 180.98,-625.26 182.57,-622.29 180.22,-623.14 180.22,-623.14 180.22,-623.14 182.57,-622.29 179.46,-621.02 184.93,-621.45 184.93,-621.45\"/>\n",
       "</g>\n",
       "<!-- 28&#45;&gt;31 -->\n",
       "<g id=\"edge22\" class=\"edge\">\n",
       "<title>28-&gt;31</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M179.41,-799.86C169.83,-795.87 160.87,-790.03 155,-781.5 141.9,-762.46 141.84,-748.5 155,-729.5 159.74,-722.66 166.49,-717.62 173.96,-713.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"178.69,-711.75 175.07,-715.87 176.41,-712.78 174.14,-713.82 174.14,-713.82 174.14,-713.82 176.41,-712.78 173.21,-711.77 178.69,-711.75 178.69,-711.75\"/>\n",
       "</g>\n",
       "<!-- 28&#45;&gt;32 -->\n",
       "<g id=\"edge23\" class=\"edge\">\n",
       "<title>28-&gt;32</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M272.01,-815.38C285.69,-817.44 300.79,-819.72 314.78,-821.84\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"319.88,-822.61 314.6,-824.09 317.41,-822.23 314.94,-821.86 314.94,-821.86 314.94,-821.86 317.41,-822.23 315.28,-819.64 319.88,-822.61 319.88,-822.61\"/>\n",
       "</g>\n",
       "<!-- 39 -->\n",
       "<g id=\"node41\" class=\"node\">\n",
       "<title>39</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M266.33,-553C266.33,-553 184.67,-553 184.67,-553 181.83,-553 179,-550.17 179,-547.33 179,-547.33 179,-541.67 179,-541.67 179,-538.83 181.83,-536 184.67,-536 184.67,-536 266.33,-536 266.33,-536 269.17,-536 272,-538.83 272,-541.67 272,-541.67 272,-547.33 272,-547.33 272,-550.17 269.17,-553 266.33,-553\"/>\n",
       "<text text-anchor=\"start\" x=\"183\" y=\"-542\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] T T …</text>\n",
       "</g>\n",
       "<!-- 28&#45;&gt;39 -->\n",
       "<g id=\"edge24\" class=\"edge\">\n",
       "<title>28-&gt;39</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M179.41,-799.86C169.83,-795.87 160.87,-790.03 155,-781.5 132.96,-749.46 138.97,-641.93 155,-606.5 165.13,-584.1 187.79,-566.58 204.71,-555.95\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"209.31,-553.14 206.21,-557.67 207.18,-554.45 205.04,-555.75 205.04,-555.75 205.04,-555.75 207.18,-554.45 203.87,-553.83 209.31,-553.14 209.31,-553.14\"/>\n",
       "</g>\n",
       "<!-- 29&#45;&gt;39 -->\n",
       "<g id=\"edge42\" class=\"edge\">\n",
       "<title>29-&gt;39</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M225.5,-606.72C225.5,-590.52 225.5,-574.33 225.5,-558.13\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"225.5,-553.1 227.75,-558.1 225.5,-555.6 225.5,-558.1 225.5,-558.1 225.5,-558.1 225.5,-555.6 223.25,-558.1 225.5,-553.1 225.5,-553.1\"/>\n",
       "</g>\n",
       "<!-- 40 -->\n",
       "<g id=\"node42\" class=\"node\">\n",
       "<title>40</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M407.33,-677C407.33,-677 325.67,-677 325.67,-677 322.83,-677 320,-674.17 320,-671.33 320,-671.33 320,-665.67 320,-665.67 320,-662.83 322.83,-660 325.67,-660 325.67,-660 407.33,-660 407.33,-660 410.17,-660 413,-662.83 413,-665.67 413,-665.67 413,-671.33 413,-671.33 413,-674.17 410.17,-677 407.33,-677\"/>\n",
       "<text text-anchor=\"start\" x=\"324\" y=\"-666\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[a] T T …</text>\n",
       "</g>\n",
       "<!-- 29&#45;&gt;40 -->\n",
       "<g id=\"edge43\" class=\"edge\">\n",
       "<title>29-&gt;40</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M249.66,-624.1C256.83,-626.78 264.75,-629.75 272,-632.5 294.3,-640.96 319.53,-650.68 338.16,-657.89\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"343.23,-659.85 337.76,-660.15 340.9,-658.95 338.57,-658.05 338.57,-658.05 338.57,-658.05 340.9,-658.95 339.38,-655.95 343.23,-659.85 343.23,-659.85\"/>\n",
       "</g>\n",
       "<!-- 37 -->\n",
       "<g id=\"node39\" class=\"node\">\n",
       "<title>37</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M395.33,-642C395.33,-642 337.67,-642 337.67,-642 334.83,-642 332,-639.17 332,-636.33 332,-636.33 332,-630.67 332,-630.67 332,-627.83 334.83,-625 337.67,-625 337.67,-625 395.33,-625 395.33,-625 398.17,-625 401,-627.83 401,-630.67 401,-630.67 401,-636.33 401,-636.33 401,-639.17 398.17,-642 395.33,-642\"/>\n",
       "<text text-anchor=\"start\" x=\"336\" y=\"-631\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] $</text>\n",
       "</g>\n",
       "<!-- 30&#45;&gt;37 -->\n",
       "<g id=\"edge33\" class=\"edge\">\n",
       "<title>30-&gt;37</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M340.82,-746.87C324.82,-740 305.52,-728.66 296,-711.5 284.79,-691.29 282.84,-678.5 296,-659.5 303.15,-649.18 314.89,-642.94 326.76,-639.18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"331.84,-637.72 327.66,-641.26 329.44,-638.41 327.04,-639.1 327.04,-639.1 327.04,-639.1 329.44,-638.41 326.41,-636.94 331.84,-637.72 331.84,-637.72\"/>\n",
       "</g>\n",
       "<!-- 44 -->\n",
       "<g id=\"node46\" class=\"node\">\n",
       "<title>44</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M407.33,-607C407.33,-607 325.67,-607 325.67,-607 322.83,-607 320,-604.17 320,-601.33 320,-601.33 320,-595.67 320,-595.67 320,-592.83 322.83,-590 325.67,-590 325.67,-590 407.33,-590 407.33,-590 410.17,-590 413,-592.83 413,-595.67 413,-595.67 413,-601.33 413,-601.33 413,-604.17 410.17,-607 407.33,-607\"/>\n",
       "<text text-anchor=\"start\" x=\"324\" y=\"-596\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] a T …</text>\n",
       "</g>\n",
       "<!-- 30&#45;&gt;44 -->\n",
       "<g id=\"edge34\" class=\"edge\">\n",
       "<title>30-&gt;44</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M340.82,-746.87C324.82,-740 305.52,-728.66 296,-711.5 277.24,-677.69 273.98,-656.28 296,-624.5 300.74,-617.66 307.49,-612.62 314.96,-608.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"319.69,-606.75 316.07,-610.87 317.41,-607.78 315.14,-608.82 315.14,-608.82 315.14,-608.82 317.41,-607.78 314.21,-606.77 319.69,-606.75 319.69,-606.75\"/>\n",
       "</g>\n",
       "<!-- 45 -->\n",
       "<g id=\"node47\" class=\"node\">\n",
       "<title>45</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-799C548.33,-799 466.67,-799 466.67,-799 463.83,-799 461,-796.17 461,-793.33 461,-793.33 461,-787.67 461,-787.67 461,-784.83 463.83,-782 466.67,-782 466.67,-782 548.33,-782 548.33,-782 551.17,-782 554,-784.83 554,-787.67 554,-787.67 554,-793.33 554,-793.33 554,-796.17 551.17,-799 548.33,-799\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-788\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[b] a T …</text>\n",
       "</g>\n",
       "<!-- 30&#45;&gt;45 -->\n",
       "<g id=\"edge35\" class=\"edge\">\n",
       "<title>30-&gt;45</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M396.49,-764.08C407.29,-767.18 419.67,-770.62 431,-773.5 440.96,-776.03 451.71,-778.57 461.88,-780.88\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"466.83,-782 461.45,-783.09 464.39,-781.44 461.95,-780.89 461.95,-780.89 461.95,-780.89 464.39,-781.44 462.45,-778.7 466.83,-782 466.83,-782\"/>\n",
       "</g>\n",
       "<!-- 31&#45;&gt;33 -->\n",
       "<g id=\"edge27\" class=\"edge\">\n",
       "<title>31-&gt;33</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M225.5,-694.85C225.5,-684.63 225.5,-674.42 225.5,-664.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"225.5,-659.2 227.75,-664.2 225.5,-661.7 225.5,-664.2 225.5,-664.2 225.5,-664.2 225.5,-661.7 223.25,-664.2 225.5,-659.2 225.5,-659.2\"/>\n",
       "</g>\n",
       "<!-- 31&#45;&gt;34 -->\n",
       "<g id=\"edge28\" class=\"edge\">\n",
       "<title>31-&gt;34</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M272.01,-703.5C285.69,-703.5 300.79,-703.5 314.78,-703.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"319.88,-703.5 314.88,-705.75 317.38,-703.5 314.88,-703.5 314.88,-703.5 314.88,-703.5 317.38,-703.5 314.88,-701.25 319.88,-703.5 319.88,-703.5\"/>\n",
       "</g>\n",
       "<!-- 32&#45;&gt;35 -->\n",
       "<g id=\"edge31\" class=\"edge\">\n",
       "<title>32-&gt;35</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M351.51,-820.82C334.39,-809.93 307.27,-789.5 296,-763.5 277.52,-720.89 269.55,-592.67 296,-554.5 300.74,-547.66 307.49,-542.62 314.96,-538.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"319.69,-536.75 316.07,-540.87 317.41,-537.78 315.14,-538.82 315.14,-538.82 315.14,-538.82 317.41,-537.78 314.21,-536.77 319.69,-536.75 319.69,-536.75\"/>\n",
       "</g>\n",
       "<!-- 32&#45;&gt;36 -->\n",
       "<g id=\"edge32\" class=\"edge\">\n",
       "<title>32-&gt;36</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M391.71,-838.04C415.48,-846.42 451.78,-859.21 477.17,-868.16\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"482.1,-869.9 476.64,-870.36 479.74,-869.07 477.38,-868.24 477.38,-868.24 477.38,-868.24 479.74,-869.07 478.13,-866.11 482.1,-869.9 482.1,-869.9\"/>\n",
       "</g>\n",
       "<!-- 33&#45;&gt;39 -->\n",
       "<g id=\"edge40\" class=\"edge\">\n",
       "<title>33-&gt;39</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M179.41,-641.86C169.83,-637.87 160.87,-632.03 155,-623.5 136.88,-597.16 175.93,-570.14 202.83,-555.53\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"207.36,-553.12 204,-557.45 205.15,-554.29 202.94,-555.47 202.94,-555.47 202.94,-555.47 205.15,-554.29 201.89,-553.48 207.36,-553.12 207.36,-553.12\"/>\n",
       "</g>\n",
       "<!-- 33&#45;&gt;40 -->\n",
       "<g id=\"edge41\" class=\"edge\">\n",
       "<title>33-&gt;40</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M272.01,-656.39C285.69,-658.17 300.79,-660.12 314.78,-661.93\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"319.88,-662.59 314.64,-664.18 317.4,-662.27 314.93,-661.95 314.93,-661.95 314.93,-661.95 317.4,-662.27 315.21,-659.72 319.88,-662.59 319.88,-662.59\"/>\n",
       "</g>\n",
       "<!-- 41 -->\n",
       "<g id=\"node43\" class=\"node\">\n",
       "<title>41</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M401.33,-572C401.33,-572 331.67,-572 331.67,-572 328.83,-572 326,-569.17 326,-566.33 326,-566.33 326,-560.67 326,-560.67 326,-557.83 328.83,-555 331.67,-555 331.67,-555 401.33,-555 401.33,-555 404.17,-555 407,-557.83 407,-560.67 407,-560.67 407,-566.33 407,-566.33 407,-569.17 404.17,-572 401.33,-572\"/>\n",
       "<text text-anchor=\"start\" x=\"330\" y=\"-561\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] a $</text>\n",
       "</g>\n",
       "<!-- 34&#45;&gt;41 -->\n",
       "<g id=\"edge53\" class=\"edge\">\n",
       "<title>34-&gt;41</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M320.41,-694.86C310.83,-690.87 301.87,-685.03 296,-676.5 274.09,-644.64 273.98,-621.28 296,-589.5 302,-580.84 311.24,-575.05 321.07,-571.19\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"325.93,-569.45 321.98,-573.26 323.57,-570.29 321.22,-571.14 321.22,-571.14 321.22,-571.14 323.57,-570.29 320.46,-569.02 325.93,-569.45 325.93,-569.45\"/>\n",
       "</g>\n",
       "<!-- 34&#45;&gt;44 -->\n",
       "<g id=\"edge51\" class=\"edge\">\n",
       "<title>34-&gt;44</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M320.41,-694.86C310.83,-690.87 301.87,-685.03 296,-676.5 282.9,-657.46 282.84,-643.5 296,-624.5 300.74,-617.66 307.49,-612.62 314.96,-608.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"319.69,-606.75 316.07,-610.87 317.41,-607.78 315.14,-608.82 315.14,-608.82 315.14,-608.82 317.41,-607.78 314.21,-606.77 319.69,-606.75 319.69,-606.75\"/>\n",
       "</g>\n",
       "<!-- 34&#45;&gt;45 -->\n",
       "<g id=\"edge52\" class=\"edge\">\n",
       "<title>34-&gt;45</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M381.08,-712C406.24,-727.75 460.1,-761.46 488.35,-779.14\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"492.66,-781.84 487.23,-781.09 490.54,-780.51 488.42,-779.18 488.42,-779.18 488.42,-779.18 490.54,-780.51 489.61,-777.28 492.66,-781.84 492.66,-781.84\"/>\n",
       "</g>\n",
       "<!-- 46 -->\n",
       "<g id=\"node48\" class=\"node\">\n",
       "<title>46</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M407.33,-467C407.33,-467 325.67,-467 325.67,-467 322.83,-467 320,-464.17 320,-461.33 320,-461.33 320,-455.67 320,-455.67 320,-452.83 322.83,-450 325.67,-450 325.67,-450 407.33,-450 407.33,-450 410.17,-450 413,-452.83 413,-455.67 413,-455.67 413,-461.33 413,-461.33 413,-464.17 410.17,-467 407.33,-467\"/>\n",
       "<text text-anchor=\"start\" x=\"324\" y=\"-456\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] T a …</text>\n",
       "</g>\n",
       "<!-- 35&#45;&gt;46 -->\n",
       "<g id=\"edge56\" class=\"edge\">\n",
       "<title>35-&gt;46</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M329.59,-519.96C306.98,-512.87 284.41,-501.22 296,-484.5 300.74,-477.66 307.49,-472.62 314.96,-468.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"319.69,-466.75 316.07,-470.87 317.41,-467.78 315.14,-468.82 315.14,-468.82 315.14,-468.82 317.41,-467.78 314.21,-466.77 319.69,-466.75 319.69,-466.75\"/>\n",
       "</g>\n",
       "<!-- 47 -->\n",
       "<g id=\"node49\" class=\"node\">\n",
       "<title>47</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-518C548.33,-518 466.67,-518 466.67,-518 463.83,-518 461,-515.17 461,-512.33 461,-512.33 461,-506.67 461,-506.67 461,-503.83 463.83,-501 466.67,-501 466.67,-501 548.33,-501 548.33,-501 551.17,-501 554,-503.83 554,-506.67 554,-506.67 554,-512.33 554,-512.33 554,-515.17 551.17,-518 548.33,-518\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-507\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[b] T a …</text>\n",
       "</g>\n",
       "<!-- 35&#45;&gt;47 -->\n",
       "<g id=\"edge57\" class=\"edge\">\n",
       "<title>35-&gt;47</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M413.01,-522.28C426.69,-520.41 441.79,-518.35 455.78,-516.43\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"460.88,-515.74 456.23,-518.64 458.41,-516.07 455.93,-516.41 455.93,-516.41 455.93,-516.41 458.41,-516.07 455.63,-514.18 460.88,-515.74 460.88,-515.74\"/>\n",
       "</g>\n",
       "<!-- 38 -->\n",
       "<g id=\"node40\" class=\"node\">\n",
       "<title>38</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-834C548.33,-834 466.67,-834 466.67,-834 463.83,-834 461,-831.17 461,-828.33 461,-828.33 461,-822.67 461,-822.67 461,-819.83 463.83,-817 466.67,-817 466.67,-817 548.33,-817 548.33,-817 551.17,-817 554,-819.83 554,-822.67 554,-822.67 554,-828.33 554,-828.33 554,-831.17 551.17,-834 548.33,-834\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-823\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[S] a a …</text>\n",
       "</g>\n",
       "<!-- 36&#45;&gt;38 -->\n",
       "<g id=\"edge36\" class=\"edge\">\n",
       "<title>36-&gt;38</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M507.5,-869.85C507.5,-859.63 507.5,-849.42 507.5,-839.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"507.5,-834.2 509.75,-839.2 507.5,-836.7 507.5,-839.2 507.5,-839.2 507.5,-839.2 507.5,-836.7 505.25,-839.2 507.5,-834.2 507.5,-834.2\"/>\n",
       "</g>\n",
       "<!-- 48 -->\n",
       "<g id=\"node50\" class=\"node\">\n",
       "<title>48</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-746C548.33,-746 466.67,-746 466.67,-746 463.83,-746 461,-743.17 461,-740.33 461,-740.33 461,-734.67 461,-734.67 461,-731.83 463.83,-729 466.67,-729 466.67,-729 548.33,-729 548.33,-729 551.17,-729 554,-731.83 554,-734.67 554,-734.67 554,-740.33 554,-740.33 554,-743.17 551.17,-746 548.33,-746\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-735\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] b a …</text>\n",
       "</g>\n",
       "<!-- 36&#45;&gt;48 -->\n",
       "<g id=\"edge37\" class=\"edge\">\n",
       "<title>36-&gt;48</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M482.86,-869.98C466.65,-862.95 446.7,-851.2 437,-833.5 425.89,-813.23 425.79,-801.71 437,-781.5 445.63,-765.95 462.29,-755.17 477.25,-748.18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"481.82,-746.13 478.18,-750.23 479.54,-747.15 477.26,-748.17 477.26,-748.17 477.26,-748.17 479.54,-747.15 476.34,-746.12 481.82,-746.13 481.82,-746.13\"/>\n",
       "</g>\n",
       "<!-- 42 -->\n",
       "<g id=\"node44\" class=\"node\">\n",
       "<title>42</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M401.33,-502C401.33,-502 331.67,-502 331.67,-502 328.83,-502 326,-499.17 326,-496.33 326,-496.33 326,-490.67 326,-490.67 326,-487.83 328.83,-485 331.67,-485 331.67,-485 401.33,-485 401.33,-485 404.17,-485 407,-487.83 407,-490.67 407,-490.67 407,-496.33 407,-496.33 407,-499.17 404.17,-502 401.33,-502\"/>\n",
       "<text text-anchor=\"start\" x=\"330\" y=\"-491\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[T] T $</text>\n",
       "</g>\n",
       "<!-- 37&#45;&gt;42 -->\n",
       "<g id=\"edge44\" class=\"edge\">\n",
       "<title>37-&gt;42</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M331.84,-628.76C318.34,-625.03 304.17,-618.38 296,-606.5 274.09,-574.64 273.98,-551.28 296,-519.5 302,-510.84 311.24,-505.05 321.07,-501.19\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"325.93,-499.45 321.98,-503.26 323.57,-500.29 321.22,-501.14 321.22,-501.14 321.22,-501.14 323.57,-500.29 320.46,-499.02 325.93,-499.45 325.93,-499.45\"/>\n",
       "</g>\n",
       "<!-- 43 -->\n",
       "<g id=\"node45\" class=\"node\">\n",
       "<title>43</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M542.33,-711C542.33,-711 472.67,-711 472.67,-711 469.83,-711 467,-708.17 467,-705.33 467,-705.33 467,-699.67 467,-699.67 467,-696.83 469.83,-694 472.67,-694 472.67,-694 542.33,-694 542.33,-694 545.17,-694 548,-696.83 548,-699.67 548,-699.67 548,-705.33 548,-705.33 548,-708.17 545.17,-711 542.33,-711\"/>\n",
       "<text text-anchor=\"start\" x=\"471\" y=\"-700\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[b] T $</text>\n",
       "</g>\n",
       "<!-- 37&#45;&gt;43 -->\n",
       "<g id=\"edge45\" class=\"edge\">\n",
       "<title>37-&gt;43</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M398.12,-642.18C403.36,-644.42 408.54,-647.17 413,-650.5 423.68,-658.49 420.32,-666.52 431,-674.5 441.38,-682.25 454.15,-688.06 466.21,-692.32\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"470.96,-693.93 465.5,-694.46 468.6,-693.13 466.23,-692.33 466.23,-692.33 466.23,-692.33 468.6,-693.13 466.95,-690.19 470.96,-693.93 470.96,-693.93\"/>\n",
       "</g>\n",
       "<!-- 38&#45;&gt;5 -->\n",
       "<g id=\"edge74\" class=\"edge\">\n",
       "<title>38-&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M461.41,-816.86C451.83,-812.87 442.87,-807.03 437,-798.5 405.58,-752.82 405.42,-345.07 437,-299.5 441.74,-292.66 448.49,-287.62 455.96,-283.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"460.69,-281.75 457.07,-285.87 458.41,-282.78 456.14,-283.82 456.14,-283.82 456.14,-283.82 458.41,-282.78 455.21,-281.77 460.69,-281.75 460.69,-281.75\"/>\n",
       "</g>\n",
       "<!-- 39&#45;&gt;39 -->\n",
       "<g id=\"edge38\" class=\"edge\">\n",
       "<title>39-&gt;39</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M215.07,-553.19C209.31,-561.67 212.79,-571 225.5,-571 235.83,-571 240.06,-564.84 238.2,-557.98\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"235.93,-553.19 240.1,-556.74 237,-555.45 238.07,-557.71 238.07,-557.71 238.07,-557.71 237,-555.45 236.03,-558.67 235.93,-553.19 235.93,-553.19\"/>\n",
       "</g>\n",
       "<!-- 39&#45;&gt;40 -->\n",
       "<g id=\"edge39\" class=\"edge\">\n",
       "<title>39-&gt;40</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M233.96,-553.18C255.19,-577.84 314.73,-646.8 320,-650.5 323.88,-653.23 328.23,-655.62 332.66,-657.69\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"337.49,-659.82 332,-659.86 335.2,-658.81 332.91,-657.8 332.91,-657.8 332.91,-657.8 335.2,-658.81 333.82,-655.74 337.49,-659.82 337.49,-659.82\"/>\n",
       "</g>\n",
       "<!-- 40&#45;&gt;8 -->\n",
       "<g id=\"edge50\" class=\"edge\">\n",
       "<title>40-&gt;8</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M320.41,-659.86C310.83,-655.87 301.87,-650.03 296,-641.5 271.82,-606.35 278.42,-488.38 296,-449.5 306.13,-427.1 328.79,-409.58 345.71,-398.95\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"350.31,-396.14 347.21,-400.67 348.18,-397.45 346.04,-398.75 346.04,-398.75 346.04,-398.75 348.18,-397.45 344.87,-396.83 350.31,-396.14 350.31,-396.14\"/>\n",
       "</g>\n",
       "<!-- 40&#45;&gt;42 -->\n",
       "<g id=\"edge46\" class=\"edge\">\n",
       "<title>40-&gt;42</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M320.41,-659.86C310.83,-655.87 301.87,-650.03 296,-641.5 265.27,-596.83 265.12,-564.07 296,-519.5 302,-510.84 311.24,-505.05 321.07,-501.19\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"325.93,-499.45 321.98,-503.26 323.57,-500.29 321.22,-501.14 321.22,-501.14 321.22,-501.14 323.57,-500.29 320.46,-499.02 325.93,-499.45 325.93,-499.45\"/>\n",
       "</g>\n",
       "<!-- 40&#45;&gt;44 -->\n",
       "<g id=\"edge47\" class=\"edge\">\n",
       "<title>40-&gt;44</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M329.59,-659.96C306.98,-652.87 284.41,-641.22 296,-624.5 300.74,-617.66 307.49,-612.62 314.96,-608.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"319.69,-606.75 316.07,-610.87 317.41,-607.78 315.14,-608.82 315.14,-608.82 315.14,-608.82 317.41,-607.78 314.21,-606.77 319.69,-606.75 319.69,-606.75\"/>\n",
       "</g>\n",
       "<!-- 40&#45;&gt;45 -->\n",
       "<g id=\"edge48\" class=\"edge\">\n",
       "<title>40-&gt;45</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M398.22,-677.05C403.45,-679.3 408.6,-682.09 413,-685.5 442.51,-708.41 435.41,-727.28 461,-754.5 469.54,-763.58 480.45,-772.3 489.45,-778.87\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"493.7,-781.93 488.33,-780.83 491.67,-780.47 489.64,-779.01 489.64,-779.01 489.64,-779.01 491.67,-780.47 490.95,-777.18 493.7,-781.93 493.7,-781.93\"/>\n",
       "</g>\n",
       "<!-- 40&#45;&gt;46 -->\n",
       "<g id=\"edge49\" class=\"edge\">\n",
       "<title>40-&gt;46</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M320.41,-659.86C310.83,-655.87 301.87,-650.03 296,-641.5 276.23,-612.75 276.13,-513.18 296,-484.5 300.74,-477.66 307.49,-472.62 314.96,-468.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"319.69,-466.75 316.07,-470.87 317.41,-467.78 315.14,-468.82 315.14,-468.82 315.14,-468.82 317.41,-467.78 314.21,-466.77 319.69,-466.75 319.69,-466.75\"/>\n",
       "</g>\n",
       "<!-- 41&#45;&gt;46 -->\n",
       "<g id=\"edge54\" class=\"edge\">\n",
       "<title>41-&gt;46</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M325.92,-556.94C314.34,-552.99 302.98,-546.65 296,-536.5 282.9,-517.46 282.84,-503.5 296,-484.5 300.74,-477.66 307.49,-472.62 314.96,-468.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"319.69,-466.75 316.07,-470.87 317.41,-467.78 315.14,-468.82 315.14,-468.82 315.14,-468.82 317.41,-467.78 314.21,-466.77 319.69,-466.75 319.69,-466.75\"/>\n",
       "</g>\n",
       "<!-- 41&#45;&gt;47 -->\n",
       "<g id=\"edge55\" class=\"edge\">\n",
       "<title>41-&gt;47</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M389.39,-554.83C416.74,-544.01 460.11,-526.84 461,-526.5 466.66,-524.32 472.72,-522.03 478.52,-519.86\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"483.32,-518.06 479.43,-521.92 480.98,-518.94 478.64,-519.81 478.64,-519.81 478.64,-519.81 480.98,-518.94 477.85,-517.71 483.32,-518.06 483.32,-518.06\"/>\n",
       "</g>\n",
       "<!-- 42&#45;&gt;8 -->\n",
       "<g id=\"edge77\" class=\"edge\">\n",
       "<title>42-&gt;8</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M325.92,-486.94C314.34,-482.99 302.98,-476.65 296,-466.5 277.88,-440.16 316.93,-413.14 343.83,-398.53\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"348.36,-396.12 345,-400.45 346.15,-397.29 343.94,-398.47 343.94,-398.47 343.94,-398.47 346.15,-397.29 342.89,-396.48 348.36,-396.12 348.36,-396.12\"/>\n",
       "</g>\n",
       "<!-- 42&#45;&gt;9 -->\n",
       "<g id=\"edge78\" class=\"edge\">\n",
       "<title>42-&gt;9</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M400.99,-484.93C405.55,-482.52 409.77,-479.44 413,-475.5 460.27,-417.87 430.21,-383.93 443,-310.5 451.35,-262.56 430.06,-240.06 461,-202.5 462.66,-200.49 464.57,-198.72 466.67,-197.16\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"471.18,-194.23 468.21,-198.84 469.08,-195.59 466.98,-196.95 466.98,-196.95 466.98,-196.95 469.08,-195.59 465.76,-195.06 471.18,-194.23 471.18,-194.23\"/>\n",
       "</g>\n",
       "<!-- 43&#45;&gt;7 -->\n",
       "<g id=\"edge73\" class=\"edge\">\n",
       "<title>43-&gt;7</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M466.92,-695.94C455.34,-691.99 443.98,-685.65 437,-675.5 405.58,-629.82 410.11,-224.99 437,-176.5 445.63,-160.95 462.29,-150.17 477.25,-143.18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"481.82,-141.13 478.18,-145.23 479.54,-142.15 477.26,-143.17 477.26,-143.17 477.26,-143.17 479.54,-142.15 476.34,-141.12 481.82,-141.13 481.82,-141.13\"/>\n",
       "</g>\n",
       "<!-- 49 -->\n",
       "<g id=\"node51\" class=\"node\">\n",
       "<title>49</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M542.33,-606C542.33,-606 472.67,-606 472.67,-606 469.83,-606 467,-603.17 467,-600.33 467,-600.33 467,-594.67 467,-594.67 467,-591.83 469.83,-589 472.67,-589 472.67,-589 542.33,-589 542.33,-589 545.17,-589 548,-591.83 548,-594.67 548,-594.67 548,-600.33 548,-600.33 548,-603.17 545.17,-606 542.33,-606\"/>\n",
       "<text text-anchor=\"start\" x=\"471\" y=\"-595\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[S] T $</text>\n",
       "</g>\n",
       "<!-- 43&#45;&gt;49 -->\n",
       "<g id=\"edge72\" class=\"edge\">\n",
       "<title>43-&gt;49</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M466.92,-695.94C455.34,-691.99 443.98,-685.65 437,-675.5 423.9,-656.46 423.84,-642.5 437,-623.5 443,-614.84 452.24,-609.05 462.07,-605.19\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"466.93,-603.45 462.98,-607.26 464.57,-604.29 462.22,-605.14 462.22,-605.14 462.22,-605.14 464.57,-604.29 461.46,-603.02 466.93,-603.45 466.93,-603.45\"/>\n",
       "</g>\n",
       "<!-- 44&#45;&gt;2 -->\n",
       "<g id=\"edge62\" class=\"edge\">\n",
       "<title>44-&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M394.57,-607.08C400.79,-609.46 407.26,-612.29 413,-615.5 421.85,-620.44 422.78,-623.57 431,-629.5 444,-638.87 446.8,-642.07 461,-649.5 466.07,-652.15 471.62,-654.66 477.05,-656.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"481.99,-658.9 476.51,-659.12 479.67,-657.96 477.35,-657.03 477.35,-657.03 477.35,-657.03 479.67,-657.96 478.19,-654.94 481.99,-658.9 481.99,-658.9\"/>\n",
       "</g>\n",
       "<!-- 44&#45;&gt;4 -->\n",
       "<g id=\"edge61\" class=\"edge\">\n",
       "<title>44-&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M402.58,-607.08C422,-611.83 446.23,-617.76 466.4,-622.69\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"471.44,-623.92 466.04,-624.92 469.01,-623.33 466.58,-622.74 466.58,-622.74 466.58,-622.74 469.01,-623.33 467.11,-620.55 471.44,-623.92 471.44,-623.92\"/>\n",
       "</g>\n",
       "<!-- 44&#45;&gt;46 -->\n",
       "<g id=\"edge58\" class=\"edge\">\n",
       "<title>44-&gt;46</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M320.41,-589.86C310.83,-585.87 301.87,-580.03 296,-571.5 274.09,-539.64 273.98,-516.28 296,-484.5 300.74,-477.66 307.49,-472.62 314.96,-468.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"319.69,-466.75 316.07,-470.87 317.41,-467.78 315.14,-468.82 315.14,-468.82 315.14,-468.82 317.41,-467.78 314.21,-466.77 319.69,-466.75 319.69,-466.75\"/>\n",
       "</g>\n",
       "<!-- 44&#45;&gt;47 -->\n",
       "<g id=\"edge59\" class=\"edge\">\n",
       "<title>44-&gt;47</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M394.39,-589.96C400.75,-587.39 407.32,-584.23 413,-580.5 428.76,-570.15 430.65,-564.74 443,-550.5 451.74,-540.43 450.32,-534.49 461,-526.5 464.06,-524.21 467.47,-522.19 471,-520.43\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"475.88,-518.18 472.28,-522.32 473.61,-519.23 471.34,-520.28 471.34,-520.28 471.34,-520.28 473.61,-519.23 470.39,-518.23 475.88,-518.18 475.88,-518.18\"/>\n",
       "</g>\n",
       "<!-- 44&#45;&gt;49 -->\n",
       "<g id=\"edge60\" class=\"edge\">\n",
       "<title>44-&gt;49</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M413.01,-598.17C428.66,-598.06 446.16,-597.93 461.75,-597.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"466.96,-597.78 461.98,-600.07 464.46,-597.8 461.96,-597.82 461.96,-597.82 461.96,-597.82 464.46,-597.8 461.94,-595.57 466.96,-597.78 466.96,-597.78\"/>\n",
       "</g>\n",
       "<!-- 45&#45;&gt;48 -->\n",
       "<g id=\"edge63\" class=\"edge\">\n",
       "<title>45-&gt;48</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M507.5,-781.85C507.5,-771.63 507.5,-761.42 507.5,-751.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"507.5,-746.2 509.75,-751.2 507.5,-748.7 507.5,-751.2 507.5,-751.2 507.5,-751.2 507.5,-748.7 505.25,-751.2 507.5,-746.2 507.5,-746.2\"/>\n",
       "</g>\n",
       "<!-- 50 -->\n",
       "<g id=\"node52\" class=\"node\">\n",
       "<title>50</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M548.33,-465C548.33,-465 466.67,-465 466.67,-465 463.83,-465 461,-462.17 461,-459.33 461,-459.33 461,-453.67 461,-453.67 461,-450.83 463.83,-448 466.67,-448 466.67,-448 548.33,-448 548.33,-448 551.17,-448 554,-450.83 554,-453.67 554,-453.67 554,-459.33 554,-459.33 554,-462.17 551.17,-465 548.33,-465\"/>\n",
       "<text text-anchor=\"start\" x=\"465\" y=\"-454\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop,[S] a T …</text>\n",
       "</g>\n",
       "<!-- 45&#45;&gt;50 -->\n",
       "<g id=\"edge64\" class=\"edge\">\n",
       "<title>45-&gt;50</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M482.86,-781.98C466.65,-774.95 446.7,-763.2 437,-745.5 410.83,-697.76 410.59,-548.11 437,-500.5 445.63,-484.95 462.29,-474.17 477.25,-467.18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"481.82,-465.13 478.18,-469.23 479.54,-466.15 477.26,-467.17 477.26,-467.17 477.26,-467.17 479.54,-466.15 476.34,-465.12 481.82,-465.13 481.82,-465.13\"/>\n",
       "</g>\n",
       "<!-- 46&#45;&gt;8 -->\n",
       "<g id=\"edge79\" class=\"edge\">\n",
       "<title>46-&gt;8</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M366.5,-449.72C366.5,-433.52 366.5,-417.33 366.5,-401.13\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"366.5,-396.1 368.75,-401.1 366.5,-398.6 366.5,-401.1 366.5,-401.1 366.5,-401.1 366.5,-398.6 364.25,-401.1 366.5,-396.1 366.5,-396.1\"/>\n",
       "</g>\n",
       "<!-- 46&#45;&gt;9 -->\n",
       "<g id=\"edge80\" class=\"edge\">\n",
       "<title>46-&gt;9</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M383.34,-449.85C393.36,-443.55 405.75,-434.12 413,-422.5 439.5,-380.05 428.23,-240.32 461,-202.5 462.86,-200.35 465.03,-198.47 467.38,-196.83\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"471.79,-194.12 468.7,-198.65 469.66,-195.43 467.53,-196.74 467.53,-196.74 467.53,-196.74 469.66,-195.43 466.35,-194.82 471.79,-194.12 471.79,-194.12\"/>\n",
       "</g>\n",
       "<!-- 47&#45;&gt;1 -->\n",
       "<g id=\"edge70\" class=\"edge\">\n",
       "<title>47-&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M482.86,-500.98C466.65,-493.95 446.7,-482.2 437,-464.5 416.71,-427.47 412.95,-404.2 437,-369.5 443,-360.84 452.24,-355.05 462.07,-351.19\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"466.93,-349.45 462.98,-353.26 464.57,-350.29 462.22,-351.14 462.22,-351.14 462.22,-351.14 464.57,-350.29 461.46,-349.02 466.93,-349.45 466.93,-349.45\"/>\n",
       "</g>\n",
       "<!-- 47&#45;&gt;2 -->\n",
       "<g id=\"edge69\" class=\"edge\">\n",
       "<title>47-&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M460.69,-517.75C451.38,-521.6 442.72,-527.24 437,-535.5 410.42,-573.86 410.55,-602.05 437,-640.5 441.86,-647.56 448.84,-652.78 456.54,-656.63\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"461.41,-658.86 455.93,-658.83 459.14,-657.82 456.86,-656.78 456.86,-656.78 456.86,-656.78 459.14,-657.82 457.8,-654.74 461.41,-658.86 461.41,-658.86\"/>\n",
       "</g>\n",
       "<!-- 47&#45;&gt;4 -->\n",
       "<g id=\"edge67\" class=\"edge\">\n",
       "<title>47-&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M460.69,-517.75C451.38,-521.6 442.72,-527.24 437,-535.5 419.28,-561.07 419.37,-579.87 437,-605.5 441.86,-612.56 448.84,-617.78 456.54,-621.63\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"461.41,-623.86 455.93,-623.83 459.14,-622.82 456.86,-621.78 456.86,-621.78 456.86,-621.78 459.14,-622.82 457.8,-619.74 461.41,-623.86 461.41,-623.86\"/>\n",
       "</g>\n",
       "<!-- 47&#45;&gt;7 -->\n",
       "<g id=\"edge68\" class=\"edge\">\n",
       "<title>47-&gt;7</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M482.86,-500.98C466.65,-493.95 446.7,-482.2 437,-464.5 406.24,-408.38 405.96,-232.47 437,-176.5 445.63,-160.95 462.29,-150.17 477.25,-143.18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"481.82,-141.13 478.18,-145.23 479.54,-142.15 477.26,-143.17 477.26,-143.17 477.26,-143.17 479.54,-142.15 476.34,-141.12 481.82,-141.13 481.82,-141.13\"/>\n",
       "</g>\n",
       "<!-- 47&#45;&gt;17 -->\n",
       "<g id=\"edge71\" class=\"edge\">\n",
       "<title>47-&gt;17</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M482.86,-500.98C466.65,-493.95 446.7,-482.2 437,-464.5 409.23,-413.83 404.09,-381.99 437,-334.5 444.15,-324.18 455.89,-317.94 467.76,-314.18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"472.84,-312.72 468.66,-316.26 470.44,-313.41 468.04,-314.1 468.04,-314.1 468.04,-314.1 470.44,-313.41 467.41,-311.94 472.84,-312.72 472.84,-312.72\"/>\n",
       "</g>\n",
       "<!-- 47&#45;&gt;49 -->\n",
       "<g id=\"edge65\" class=\"edge\">\n",
       "<title>47-&gt;49</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M460.69,-517.75C451.38,-521.6 442.72,-527.24 437,-535.5 422.14,-556.94 453.41,-575.8 478.95,-586.93\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"483.63,-588.92 478.15,-589.04 481.33,-587.95 479.03,-586.97 479.03,-586.97 479.03,-586.97 481.33,-587.95 479.91,-584.9 483.63,-588.92 483.63,-588.92\"/>\n",
       "</g>\n",
       "<!-- 47&#45;&gt;50 -->\n",
       "<g id=\"edge66\" class=\"edge\">\n",
       "<title>47-&gt;50</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M507.5,-500.85C507.5,-490.63 507.5,-480.42 507.5,-470.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"507.5,-465.2 509.75,-470.2 507.5,-467.7 507.5,-470.2 507.5,-470.2 507.5,-470.2 507.5,-467.7 505.25,-470.2 507.5,-465.2 507.5,-465.2\"/>\n",
       "</g>\n",
       "<!-- 48&#45;&gt;6 -->\n",
       "<g id=\"edge86\" class=\"edge\">\n",
       "<title>48-&gt;6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M461.41,-728.86C451.83,-724.87 442.87,-719.03 437,-710.5 418.52,-683.63 421.18,-152.02 437,-123.5 445.63,-107.95 462.29,-97.17 477.25,-90.18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"481.82,-88.13 478.18,-92.23 479.54,-89.15 477.26,-90.17 477.26,-90.17 477.26,-90.17 479.54,-89.15 476.34,-88.12 481.82,-88.13 481.82,-88.13\"/>\n",
       "</g>\n",
       "<!-- 49&#45;&gt;3 -->\n",
       "<g id=\"edge88\" class=\"edge\">\n",
       "<title>49-&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M507.5,-588.85C507.5,-578.63 507.5,-568.42 507.5,-558.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"507.5,-553.2 509.75,-558.2 507.5,-555.7 507.5,-558.2 507.5,-558.2 507.5,-558.2 507.5,-555.7 505.25,-558.2 507.5,-553.2 507.5,-553.2\"/>\n",
       "</g>\n",
       "<!-- 50&#45;&gt;5 -->\n",
       "<g id=\"edge75\" class=\"edge\">\n",
       "<title>50-&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M461.41,-447.86C451.83,-443.87 442.87,-438.03 437,-429.5 420.63,-405.7 420.55,-323.24 437,-299.5 441.74,-292.66 448.49,-287.62 455.96,-283.9\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"460.69,-281.75 457.07,-285.87 458.41,-282.78 456.14,-283.82 456.14,-283.82 456.14,-283.82 458.41,-282.78 455.21,-281.77 460.69,-281.75 460.69,-281.75\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "run(m, \"a a b\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### LL(1) parsing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"459pt\" height=\"312pt\" viewBox=\"0.00 0.00 459.00 312.00\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 308)\">\n",
       "<title>%3</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-308 455,-308 455,4 -4,4\"/>\n",
       "<!-- _START -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>_START</title>\n",
       "</g>\n",
       "<!-- 0 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M71.33,-153C71.33,-153 43.67,-153 43.67,-153 40.83,-153 38,-150.17 38,-147.33 38,-147.33 38,-141.67 38,-141.67 38,-138.83 40.83,-136 43.67,-136 43.67,-136 71.33,-136 71.33,-136 74.17,-136 77,-138.83 77,-141.67 77,-141.67 77,-147.33 77,-147.33 77,-150.17 74.17,-153 71.33,-153\"/>\n",
       "<text text-anchor=\"start\" x=\"42\" y=\"-142\" font-family=\"Courier,monospace\" font-size=\"10.00\">start</text>\n",
       "</g>\n",
       "<!-- _START&#45;&gt;0 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>_START-&gt;0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1.16,-144.5C2.89,-144.5 18.46,-144.5 32.64,-144.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"37.78,-144.5 32.78,-146.75 35.28,-144.5 32.78,-144.5 32.78,-144.5 32.78,-144.5 35.28,-144.5 32.78,-142.25 37.78,-144.5 37.78,-144.5\"/>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M204.33,-153C204.33,-153 182.67,-153 182.67,-153 179.83,-153 177,-150.17 177,-147.33 177,-147.33 177,-141.67 177,-141.67 177,-138.83 179.83,-136 182.67,-136 182.67,-136 204.33,-136 204.33,-136 207.17,-136 210,-138.83 210,-141.67 210,-141.67 210,-147.33 210,-147.33 210,-150.17 207.17,-153 204.33,-153\"/>\n",
       "<text text-anchor=\"start\" x=\"181\" y=\"-142\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;2 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>0-&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M77.13,-144.5C101.97,-144.5 145.81,-144.5 171.7,-144.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"176.94,-144.5 171.94,-146.75 174.44,-144.5 171.94,-144.5 171.94,-144.5 171.94,-144.5 174.44,-144.5 171.94,-142.25 176.94,-144.5 176.94,-144.5\"/>\n",
       "<text text-anchor=\"start\" x=\"98\" y=\"-150.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,ε → [S] $</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M441.33,-21C441.33,-21 407.67,-21 407.67,-21 404.83,-21 402,-18.17 402,-15.33 402,-15.33 402,-9.67 402,-9.67 402,-6.83 404.83,-4 407.67,-4 407.67,-4 441.33,-4 441.33,-4 444.17,-4 447,-6.83 447,-9.67 447,-9.67 447,-15.33 447,-15.33 447,-18.17 444.17,-21 441.33,-21\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M442.67,-25C442.67,-25 406.33,-25 406.33,-25 402.17,-25 398,-20.83 398,-16.67 398,-16.67 398,-8.33 398,-8.33 398,-4.17 402.17,0 406.33,0 406.33,0 442.67,0 442.67,0 446.83,0 451,-4.17 451,-8.33 451,-8.33 451,-16.67 451,-16.67 451,-20.83 446.83,-25 442.67,-25\"/>\n",
       "<text text-anchor=\"start\" x=\"406\" y=\"-10\" font-family=\"Courier,monospace\" font-size=\"10.00\">accept</text>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M306.5,-270C306.5,-270 301.5,-270 301.5,-270 299,-270 296.5,-267.5 296.5,-265 296.5,-265 296.5,-258 296.5,-258 296.5,-255.5 299,-253 301.5,-253 301.5,-253 306.5,-253 306.5,-253 309,-253 311.5,-255.5 311.5,-258 311.5,-258 311.5,-265 311.5,-265 311.5,-267.5 309,-270 306.5,-270\"/>\n",
       "<text text-anchor=\"start\" x=\"300.5\" y=\"-259\" font-family=\"Courier,monospace\" font-size=\"10.00\">a</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;3 -->\n",
       "<g id=\"edge13\" class=\"edge\">\n",
       "<title>2-&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M195.01,-153.25C196.57,-171.88 202.87,-215.68 228,-239.5 245.37,-255.96 274.4,-260.18 290.78,-261.22\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"296.2,-261.47 291.1,-263.48 293.7,-261.35 291.2,-261.24 291.2,-261.24 291.2,-261.24 293.7,-261.35 291.31,-258.99 296.2,-261.47 296.2,-261.47\"/>\n",
       "<text text-anchor=\"start\" x=\"231.5\" y=\"-263.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">a,ε → ε</text>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M306.5,-187C306.5,-187 301.5,-187 301.5,-187 299,-187 296.5,-184.5 296.5,-182 296.5,-182 296.5,-175 296.5,-175 296.5,-172.5 299,-170 301.5,-170 301.5,-170 306.5,-170 306.5,-170 309,-170 311.5,-172.5 311.5,-175 311.5,-175 311.5,-182 311.5,-182 311.5,-184.5 309,-187 306.5,-187\"/>\n",
       "<text text-anchor=\"start\" x=\"300.5\" y=\"-176\" font-family=\"Courier,monospace\" font-size=\"10.00\">b</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;4 -->\n",
       "<g id=\"edge11\" class=\"edge\">\n",
       "<title>2-&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M209.49,-153.1C215.15,-156.08 221.74,-159.24 228,-161.5 249.7,-169.33 276.27,-174.33 291.26,-176.76\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"296.22,-177.54 290.93,-178.99 293.75,-177.15 291.28,-176.76 291.28,-176.76 291.28,-176.76 293.75,-177.15 291.63,-174.54 296.22,-177.54 296.22,-177.54\"/>\n",
       "<text text-anchor=\"start\" x=\"231.5\" y=\"-178.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">b,ε → ε</text>\n",
       "</g>\n",
       "<!-- 5 -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M306.5,-104C306.5,-104 301.5,-104 301.5,-104 299,-104 296.5,-101.5 296.5,-99 296.5,-99 296.5,-92 296.5,-92 296.5,-89.5 299,-87 301.5,-87 301.5,-87 306.5,-87 306.5,-87 309,-87 311.5,-89.5 311.5,-92 311.5,-92 311.5,-99 311.5,-99 311.5,-101.5 309,-104 306.5,-104\"/>\n",
       "<text text-anchor=\"start\" x=\"300.5\" y=\"-93\" font-family=\"Courier,monospace\" font-size=\"10.00\">c</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;5 -->\n",
       "<g id=\"edge12\" class=\"edge\">\n",
       "<title>2-&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M203.82,-135.76C210.21,-130.16 219.11,-123.11 228,-118.5 249.1,-107.55 276.3,-100.84 291.47,-97.68\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"296.48,-96.67 292.02,-99.86 294.02,-97.16 291.57,-97.65 291.57,-97.65 291.57,-97.65 294.02,-97.16 291.13,-95.45 296.48,-96.67 296.48,-96.67\"/>\n",
       "<text text-anchor=\"start\" x=\"231.5\" y=\"-124.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">c,ε → ε</text>\n",
       "</g>\n",
       "<!-- 6 -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M306.67,-21C306.67,-21 301.33,-21 301.33,-21 298.67,-21 296,-18.33 296,-15.67 296,-15.67 296,-9.33 296,-9.33 296,-6.67 298.67,-4 301.33,-4 301.33,-4 306.67,-4 306.67,-4 309.33,-4 312,-6.67 312,-9.33 312,-9.33 312,-15.67 312,-15.67 312,-18.33 309.33,-21 306.67,-21\"/>\n",
       "<text text-anchor=\"start\" x=\"300\" y=\"-10\" font-family=\"Courier,monospace\" font-size=\"10.00\">⊣</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;6 -->\n",
       "<g id=\"edge14\" class=\"edge\">\n",
       "<title>2-&gt;6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M194.83,-135.98C196.03,-116.46 201.66,-68.07 228,-40.5 244.91,-22.8 274.04,-16.2 290.58,-13.81\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"295.67,-13.15 291,-16.02 293.19,-13.47 290.71,-13.79 290.71,-13.79 290.71,-13.79 293.19,-13.47 290.42,-11.56 295.67,-13.15 295.67,-13.15\"/>\n",
       "<text text-anchor=\"start\" x=\"231.5\" y=\"-46.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">␣,ε → ε</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;2 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>3-&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M296.39,-253.44C287.86,-243.07 273.78,-226.08 271,-223.5 253.73,-207.48 244.53,-209.29 228,-192.5 217.61,-181.95 208.2,-167.86 202.01,-157.68\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"199.41,-153.3 203.9,-156.45 200.69,-155.45 201.97,-157.6 201.97,-157.6 201.97,-157.6 200.69,-155.45 200.03,-158.75 199.41,-153.3 199.41,-153.3\"/>\n",
       "<text text-anchor=\"start\" x=\"231.5\" y=\"-229.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,a → ε</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;3 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>3-&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M296.41,-269.37C291.34,-278.06 293.88,-288 304,-288 312.23,-288 315.44,-281.44 313.64,-274.32\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"311.59,-269.37 315.58,-273.13 312.55,-271.68 313.5,-273.99 313.5,-273.99 313.5,-273.99 312.55,-271.68 311.43,-274.85 311.59,-269.37 311.59,-269.37\"/>\n",
       "<text text-anchor=\"start\" x=\"270\" y=\"-293.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,S → [a] S c</text>\n",
       "</g>\n",
       "<!-- 4&#45;&gt;2 -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>4-&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M296.44,-170.42C289.01,-161.54 277.16,-148.15 271,-145.5 253.36,-137.9 231.23,-138.57 215.32,-140.59\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"210.17,-141.31 214.81,-138.39 212.65,-140.96 215.12,-140.61 215.12,-140.61 215.12,-140.61 212.65,-140.96 215.44,-142.84 210.17,-141.31 210.17,-141.31\"/>\n",
       "<text text-anchor=\"start\" x=\"231.5\" y=\"-151.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,b → ε</text>\n",
       "</g>\n",
       "<!-- 4&#45;&gt;4 -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>4-&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M296.41,-186.37C291.34,-195.06 293.88,-205 304,-205 312.23,-205 315.44,-198.44 313.64,-191.32\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"311.59,-186.37 315.58,-190.13 312.55,-188.68 313.5,-190.99 313.5,-190.99 313.5,-190.99 312.55,-188.68 311.43,-191.85 311.59,-186.37 311.59,-186.37\"/>\n",
       "<text text-anchor=\"start\" x=\"285.5\" y=\"-224.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,S → T</text>\n",
       "<text text-anchor=\"start\" x=\"275\" y=\"-210.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,T → [b] T</text>\n",
       "</g>\n",
       "<!-- 5&#45;&gt;2 -->\n",
       "<g id=\"edge8\" class=\"edge\">\n",
       "<title>5-&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M296.42,-87.08C290.57,-80.34 281.37,-71.39 271,-67.5 253.11,-60.78 243.98,-57.02 228,-67.5 206.56,-81.55 198.77,-112.62 195.99,-130.7\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"195.28,-135.87 193.73,-130.61 195.62,-133.39 195.96,-130.91 195.96,-130.91 195.96,-130.91 195.62,-133.39 198.19,-131.22 195.28,-135.87 195.28,-135.87\"/>\n",
       "<text text-anchor=\"start\" x=\"231.5\" y=\"-73.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,c → ε</text>\n",
       "</g>\n",
       "<!-- 5&#45;&gt;5 -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>5-&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M296.41,-103.37C291.34,-112.06 293.88,-122 304,-122 312.23,-122 315.44,-115.44 313.64,-108.32\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"311.59,-103.37 315.58,-107.13 312.55,-105.68 313.5,-107.99 313.5,-107.99 313.5,-107.99 312.55,-105.68 311.43,-108.85 311.59,-103.37 311.59,-103.37\"/>\n",
       "<text text-anchor=\"start\" x=\"286\" y=\"-141.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,S → T</text>\n",
       "<text text-anchor=\"start\" x=\"286\" y=\"-127.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,T → ε</text>\n",
       "</g>\n",
       "<!-- 6&#45;&gt;1 -->\n",
       "<g id=\"edge10\" class=\"edge\">\n",
       "<title>6-&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M312.06,-12.5C327.57,-12.5 365.4,-12.5 392.69,-12.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"398,-12.5 393,-14.75 395.5,-12.5 393,-12.5 393,-12.5 393,-12.5 395.5,-12.5 393,-10.25 398,-12.5 398,-12.5\"/>\n",
       "<text text-anchor=\"start\" x=\"340.5\" y=\"-18.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,$ → ε</text>\n",
       "</g>\n",
       "<!-- 6&#45;&gt;6 -->\n",
       "<g id=\"edge9\" class=\"edge\">\n",
       "<title>6-&gt;6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M295.95,-21.19C291.51,-29.67 294.19,-39 304,-39 311.97,-39 315.23,-32.84 313.79,-25.98\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"312.05,-21.19 315.87,-25.11 312.9,-23.53 313.76,-25.88 313.76,-25.88 313.76,-25.88 312.9,-23.53 311.64,-26.65 312.05,-21.19 312.05,-21.19\"/>\n",
       "<text text-anchor=\"start\" x=\"286\" y=\"-58.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,S → T</text>\n",
       "<text text-anchor=\"start\" x=\"286\" y=\"-44.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,T → ε</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "g = Grammar.from_lines([\"S -> a S c\",\n",
    "                        \"S -> T\",\n",
    "                        \"T -> b T\",\n",
    "                        \"T -> &\"])\n",
    "\n",
    "m = from_grammar(g, mode='ll1')\n",
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.is_deterministic()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table style=\"font-family: Courier, monospace;\">\n",
       "  <tr><td style=\"text-align: left\">start</td><td style=\"text-align: left\">[a] a b c c</td><td style=\"text-align: left\">ε</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[a] a b c c</td><td style=\"text-align: left\">[S] $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">a</td><td style=\"text-align: left\">[a] b c c</td><td style=\"text-align: left\">[S] $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">a</td><td style=\"text-align: left\">[a] b c c</td><td style=\"text-align: left\">[a] S c $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[a] b c c</td><td style=\"text-align: left\">[S] c $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">a</td><td style=\"text-align: left\">[b] c c</td><td style=\"text-align: left\">[S] c $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">a</td><td style=\"text-align: left\">[b] c c</td><td style=\"text-align: left\">[a] S c c $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[b] c c</td><td style=\"text-align: left\">[S] c c $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">b</td><td style=\"text-align: left\">[c] c</td><td style=\"text-align: left\">[S] c c $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">b</td><td style=\"text-align: left\">[c] c</td><td style=\"text-align: left\">[T] c c $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">b</td><td style=\"text-align: left\">[c] c</td><td style=\"text-align: left\">[b] T c c $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[c] c</td><td style=\"text-align: left\">[T] c c $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">c</td><td style=\"text-align: left\">c</td><td style=\"text-align: left\">[T] c c $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">c</td><td style=\"text-align: left\">c</td><td style=\"text-align: left\">[c] c $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">c</td><td style=\"text-align: left\">[c] $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">c</td><td style=\"text-align: left\">ε</td><td style=\"text-align: left\">[c] $</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">ε</td><td style=\"text-align: left\">$</td></tr>\n",
       "  <tr><td style=\"text-align: left\">⊣</td><td style=\"text-align: left\">ε</td><td style=\"text-align: left\">$</td></tr>\n",
       "  <tr><td style=\"text-align: left\">accept</td><td style=\"text-align: left\">ε</td><td style=\"text-align: left\">ε</td></tr>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<tock.machines.Path at 0x1045aa130>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "run(m, \"a a b c c\", show_stack=5).only_path()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### LR parsing"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Construction of an LR parser involves building the *LR automaton*:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"633pt\" height=\"175pt\" viewBox=\"0.00 0.00 633.00 175.00\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 171)\">\n",
       "<title>%3</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-171 629,-171 629,4 -4,4\"/>\n",
       "<!-- _START -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>_START</title>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M77.33,-21C77.33,-21 43.67,-21 43.67,-21 40.83,-21 38,-18.17 38,-15.33 38,-15.33 38,-9.67 38,-9.67 38,-6.83 40.83,-4 43.67,-4 43.67,-4 77.33,-4 77.33,-4 80.17,-4 83,-6.83 83,-9.67 83,-9.67 83,-15.33 83,-15.33 83,-18.17 80.17,-21 77.33,-21\"/>\n",
       "<text text-anchor=\"start\" x=\"42\" y=\"-10\" font-family=\"Courier,monospace\" font-size=\"10.00\">start'</text>\n",
       "</g>\n",
       "<!-- _START&#45;&gt;2 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>_START-&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1.17,-12.5C2.92,-12.5 18.14,-12.5 32.59,-12.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"37.85,-12.5 32.85,-14.75 35.35,-12.5 32.85,-12.5 32.85,-12.5 32.85,-12.5 35.35,-12.5 32.85,-10.25 37.85,-12.5 37.85,-12.5\"/>\n",
       "</g>\n",
       "<!-- 0 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M195.33,-21C195.33,-21 167.67,-21 167.67,-21 164.83,-21 162,-18.17 162,-15.33 162,-15.33 162,-9.67 162,-9.67 162,-6.83 164.83,-4 167.67,-4 167.67,-4 195.33,-4 195.33,-4 198.17,-4 201,-6.83 201,-9.67 201,-9.67 201,-15.33 201,-15.33 201,-18.17 198.17,-21 195.33,-21\"/>\n",
       "<text text-anchor=\"start\" x=\"166\" y=\"-10\" font-family=\"Courier,monospace\" font-size=\"10.00\">start</text>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M386.83,-21C386.83,-21 365.17,-21 365.17,-21 362.33,-21 359.5,-18.17 359.5,-15.33 359.5,-15.33 359.5,-9.67 359.5,-9.67 359.5,-6.83 362.33,-4 365.17,-4 365.17,-4 386.83,-4 386.83,-4 389.67,-4 392.5,-6.83 392.5,-9.67 392.5,-9.67 392.5,-15.33 392.5,-15.33 392.5,-18.17 389.67,-21 386.83,-21\"/>\n",
       "<text text-anchor=\"start\" x=\"363.5\" y=\"-10\" font-family=\"Courier,monospace\" font-size=\"10.00\">loop</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;3 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>0-&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M201.31,-12.5C237.47,-12.5 316.43,-12.5 354.14,-12.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"359.4,-12.5 354.4,-14.75 356.9,-12.5 354.4,-12.5 354.4,-12.5 354.4,-12.5 356.9,-12.5 354.4,-10.25 359.4,-12.5 359.4,-12.5\"/>\n",
       "<text text-anchor=\"start\" x=\"222.5\" y=\"-18.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,2 → [3] $ 2</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M615.33,-21C615.33,-21 581.67,-21 581.67,-21 578.83,-21 576,-18.17 576,-15.33 576,-15.33 576,-9.67 576,-9.67 576,-6.83 578.83,-4 581.67,-4 581.67,-4 615.33,-4 615.33,-4 618.17,-4 621,-6.83 621,-9.67 621,-9.67 621,-15.33 621,-15.33 621,-18.17 618.17,-21 615.33,-21\"/>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M616.67,-25C616.67,-25 580.33,-25 580.33,-25 576.17,-25 572,-20.83 572,-16.67 572,-16.67 572,-8.33 572,-8.33 572,-4.17 576.17,0 580.33,0 580.33,0 616.67,0 616.67,0 620.83,0 625,-4.17 625,-8.33 625,-8.33 625,-16.67 625,-16.67 625,-20.83 620.83,-25 616.67,-25\"/>\n",
       "<text text-anchor=\"start\" x=\"580\" y=\"-10\" font-family=\"Courier,monospace\" font-size=\"10.00\">accept</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;0 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>2-&gt;0</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M83.05,-12.5C103.8,-12.5 135.11,-12.5 156.61,-12.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"161.85,-12.5 156.85,-14.75 159.35,-12.5 156.85,-12.5 156.85,-12.5 156.85,-12.5 159.35,-12.5 156.85,-10.25 161.85,-12.5 161.85,-12.5\"/>\n",
       "<text text-anchor=\"start\" x=\"104.5\" y=\"-18.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,ε → 2</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;1 -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>3-&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M392.51,-12.5C428.64,-12.5 518.98,-12.5 566.76,-12.5\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"571.81,-12.5 566.81,-14.75 569.31,-12.5 566.81,-12.5 566.81,-12.5 566.81,-12.5 569.31,-12.5 566.81,-10.25 571.81,-12.5 571.81,-12.5\"/>\n",
       "<text text-anchor=\"start\" x=\"461\" y=\"-18.3\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,[8] S 3 $ 2 → 2</text>\n",
       "</g>\n",
       "<!-- 3&#45;&gt;3 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>3-&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M359.41,-20.37C348.34,-29.06 353.88,-39 376,-39 395.01,-39 401.77,-31.66 396.28,-24.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"392.59,-20.37 397.71,-22.33 394.35,-22.14 396.12,-23.92 396.12,-23.92 396.12,-23.92 394.35,-22.14 394.52,-25.5 392.59,-20.37 392.59,-20.37\"/>\n",
       "<text text-anchor=\"start\" x=\"316\" y=\"-156.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,[6] ⊣ 7 T 3 → [8] S 3</text>\n",
       "<text text-anchor=\"start\" x=\"295\" y=\"-142.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,[5] r 4 T 1 l 4 T 1 → [4] T 1</text>\n",
       "<text text-anchor=\"start\" x=\"295\" y=\"-128.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,[5] r 4 T 1 l 7 T 3 → [7] T 3</text>\n",
       "<text text-anchor=\"start\" x=\"342\" y=\"-114.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,1 → [4] T 1</text>\n",
       "<text text-anchor=\"start\" x=\"342\" y=\"-100.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">ε,3 → [7] T 3</text>\n",
       "<text text-anchor=\"start\" x=\"342\" y=\"-86.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">r,4 → [5] r 4</text>\n",
       "<text text-anchor=\"start\" x=\"342\" y=\"-72.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">l,4 → [1] l 4</text>\n",
       "<text text-anchor=\"start\" x=\"342\" y=\"-58.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">l,7 → [1] l 7</text>\n",
       "<text text-anchor=\"start\" x=\"341.5\" y=\"-44.8\" font-family=\"Courier,monospace\" font-size=\"9.00\">⊣,7 → [6] ⊣ 7</text>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "g = Grammar.from_lines([\n",
    "    'S -> T -|',\n",
    "    'T -> T l T r',\n",
    "    'T -> &'\n",
    "])\n",
    "\n",
    "m = from_grammar(g, mode='lr0')\n",
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.is_deterministic()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table style=\"font-family: Courier, monospace;\">\n",
       "  <tr><td style=\"text-align: left\">start'</td><td style=\"text-align: left\">[l] l r l r r ⊣</td><td style=\"text-align: left\">ε</td></tr>\n",
       "  <tr><td style=\"text-align: left\">start</td><td style=\"text-align: left\">[l] l r l r r ⊣</td><td style=\"text-align: left\">2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[l] l r l r r ⊣</td><td style=\"text-align: left\">[3] $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[l] l r l r r ⊣</td><td style=\"text-align: left\">[7] T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[l] r l r r ⊣</td><td style=\"text-align: left\">[1] l 7 T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[l] r l r r ⊣</td><td style=\"text-align: left\">[4] T 1 l 7 T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[r] l r r ⊣</td><td style=\"text-align: left\">[1] l 4 T 1 l 7 T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[r] l r r ⊣</td><td style=\"text-align: left\">[4] T 1 l 4 T 1 l 7 T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[l] r r ⊣</td><td style=\"text-align: left\">[5] r 4 T 1 l 4 T 1 l 7 T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[l] r r ⊣</td><td style=\"text-align: left\">[4] T 1 l 7 T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[r] r ⊣</td><td style=\"text-align: left\">[1] l 4 T 1 l 7 T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[r] r ⊣</td><td style=\"text-align: left\">[4] T 1 l 4 T 1 l 7 T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[r] ⊣</td><td style=\"text-align: left\">[5] r 4 T 1 l 4 T 1 l 7 T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">[r] ⊣</td><td style=\"text-align: left\">[4] T 1 l 7 T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">⊣</td><td style=\"text-align: left\">[5] r 4 T 1 l 7 T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">⊣</td><td style=\"text-align: left\">[7] T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">ε</td><td style=\"text-align: left\">[6] ⊣ 7 T 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">loop</td><td style=\"text-align: left\">ε</td><td style=\"text-align: left\">[8] S 3 $ 2</td></tr>\n",
       "  <tr><td style=\"text-align: left\">accept</td><td style=\"text-align: left\">ε</td><td style=\"text-align: left\">2</td></tr>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<tock.machines.Path at 0x1045dff70>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "run(m, 'l l r l r r -|', show_stack=15).only_path()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can visualize the LR automaton using `grammars.lr_automaton`, and you can also build an LR(1) parser using `mode='lr1'`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## From PDAs to CFGs\n",
    "\n",
    "The conversion in the reverse direction, from PDA to CFG, is actually related to the algorithm that Tock uses internally to simulate PDAs. We use the `remove_useless` method to reduce the size of the converted CFG."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "nonterminals: {(q1,q1),(q1,q4),(q2,q2),(q2,q3),(q3,q3),(q4,q4),(start,accept)}<br>\n",
       "start: (start,accept)<br>\n",
       "(q2,q3) &rarr; 0 (q2,q2) 1<br>\n",
       "(q2,q3) &rarr; 0 (q2,q3) 1<br>\n",
       "(q1,q4) &rarr; (q2,q3)<br>\n",
       "(start,accept) &rarr; (q1,q4)<br>\n",
       "(q1,q1) &rarr; (q1,q1) (q1,q1)<br>\n",
       "(q1,q4) &rarr; (q1,q1) (q1,q4)<br>\n",
       "(q1,q4) &rarr; (q1,q4) (q4,q4)<br>\n",
       "(q4,q4) &rarr; (q4,q4) (q4,q4)<br>\n",
       "(q3,q3) &rarr; (q3,q3) (q3,q3)<br>\n",
       "(q2,q3) &rarr; (q2,q3) (q3,q3)<br>\n",
       "(q2,q3) &rarr; (q2,q2) (q2,q3)<br>\n",
       "(q2,q2) &rarr; (q2,q2) (q2,q2)<br>\n",
       "(q1,q1) &rarr; ε<br>\n",
       "(q4,q4) &rarr; ε<br>\n",
       "(q3,q3) &rarr; ε<br>\n",
       "(q2,q2) &rarr; ε"
      ],
      "text/plain": [
       "<tock.grammars.Grammar at 0x1045be9a0>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = read_csv('examples/sipser-2-14.csv')\n",
    "g = to_grammar(m).remove_useless()\n",
    "g"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
