diff options
Diffstat (limited to 'chapter04')
| -rw-r--r-- | chapter04/README.md | 41 | ||||
| -rw-r--r-- | chapter04/docs/lattice.gv | 81 | ||||
| -rw-r--r-- | chapter04/docs/lattice.svg | 260 |
3 files changed, 270 insertions, 112 deletions
diff --git a/chapter04/README.md b/chapter04/README.md index 299d5da9..1b14bf0a 100644 --- a/chapter04/README.md +++ b/chapter04/README.md @@ -184,11 +184,9 @@ lattice. In this chapter we extend the Type hierarchy as follows: ``` -Type -+-- TypeControl (New - represents control token) -+-- TypeInteger (Enhanced - now has Top and Bottom types) -+-- TypeBot -+-- TypeTuple (New - represents multi-valued result) +Type (Enhanced - now has Control, and a global Top and Bottom) ++-- TypeInteger (Enhanced - now has Top and Bottom types) ++-- TypeTuple (New - represents multi-valued result) ``` Our enhanced Lattice looks like this: @@ -197,14 +195,18 @@ Our enhanced Lattice looks like this: In this chapter we introduce the possibility of a program input variable named -`arg`; all we know about this variable is that it is some integer value, but we do not know whether it is a constant or not. +`arg`; all we know about this variable is that it is some integer value, but we +do not know whether it is a constant or not. -To support the requirements for non-constant integer values, we enhance `TypeInteger` to -allow it to represent `IntTop` and `IntBot` integer types in addition to the earlier constant value. +To support the requirements for non-constant integer values, we enhance +`TypeInteger` to allow it to represent `IntTop` and `IntBot` integer types in +addition to the earlier constant value. -Now that integer values may be constants or non-constants, we need to introduce the "meet" operator -in our lattice. The `meet` operator describes rules that define the resulting type when we combine -integer values. +Now that integer values may be constants or non-constants, we need to introduce +the *meet* operator over our lattice. The `meet` operator describes rules that +define the resulting type when we combine integer values. In the lattice +diagram you can start from the two elements being `meet` and follow the +two arrows down the graph to the first point they meet. | | IntBot | Con1 | Con2 | IntTop | |--------|--------|--------|--------|--------| @@ -223,13 +225,26 @@ Currently, all our integer valued nodes are either a constant or a `IntBot` inte When we start optimizing loops, we will start seeing `IntTop` values. +### Tuple Types + +Tuple types need a little more explaination: they are a fixed-size grouping of +types; literally a `Type[]`. Tuples represent a collection of otherwise +unrelated types, and come from `MultiNode`s. `ProjNode`s will take the +appropriate `Type` array element out of a Tuple. The `StartNode` now produces +a 2-element `TypeTuple` with control and the type of `arg`: `[ctrl, TypeInteger.INTBOT]` + +The lattice `meet` operator on Tuples is done element by element; each array +element recursively calls `meet`. Tuples of mixed sizes are a internal +compiler error, and the `meet` uses Bottom for them. + + ## `$ctrl` name binding In previous chapters, we had a hard coded control input edge from Start to Return. In this chapter we no longer have such a hard-wired edge. Instead, we track the current in-scope control node via the name `$ctrl`. This means that -when we need to create an edge to the predecessor control node, we simply -look up this name in the current scope. +when we need to create an edge to the predecessor control node, we simply look +up this name in the current scope. This introduces the idea that the control flow subgraph is a Petri net model.[^1] The control token moves virtually from node to node as execution proceeds. The diff --git a/chapter04/docs/lattice.gv b/chapter04/docs/lattice.gv index 29a53b0a..6efef107 100644 --- a/chapter04/docs/lattice.gv +++ b/chapter04/docs/lattice.gv @@ -1,29 +1,32 @@ digraph Lattice { + compound = true; // Define nodes splines=false; - node [shape=circle, style=filled, fillcolor=lightblue]; + node [shape=circle, style=filled]; nodesep=0.6; - TOP [label="⊤" , fillcolor=black, fontcolor=white]; - BOT [label="⊥", fillcolor=black, fontcolor=white]; + TOP [label=<<B>⊤</B >>, fillcolor=black, fontcolor=white]; + BOT [label=<<B>⊥</B>>, fillcolor=black, fontcolor=white]; - CTRL [label="Ctrl", fillcolor=yellow]; + // ---------------------- + // Control + CTRL [label="ctrl", fillcolor=yellow, shape=oval]; - INT_TOP [label="⊤ :Int"]; - INT_BOT [label="⊥ :Int"]; - - INT_MIN [label="-n"]; - INT_MINDOTS [label="..." shape=none style=none]; - INT_MINUS [label="-1"]; - INT_ZERO [label="0"]; - INT_PLUS [label="1"]; - INT_MAXDOTS [label="..." shape=none style=none]; - INT_MAX [label="+n"]; + TOP -> CTRL; + CTRL -> BOT; - TUPLE [label="TUPLE", fillcolor=pink]; + // ---------------------- + // Integers + INT_TOP [label=<<B>⊤</B >:int>, fillcolor=lightblue, shape=oval]; + INT_BOT [label=<<B>⊥</B>:int>, fillcolor=lightblue, shape=oval]; - // Define edges - edge [arrowhead=none]; + INT_MIN [label="-n" , fillcolor=lightblue]; + INT_MINDOTS [label="...", fillcolor=lightblue shape=oval]; + INT_MINUS [label="-1" , fillcolor=lightblue]; + INT_ZERO [label="0" , fillcolor=lightblue]; + INT_PLUS [label="1" , fillcolor=lightblue]; + INT_MAXDOTS [label="...", fillcolor=lightblue, shape=oval]; + INT_MAX [label="+n" , fillcolor=lightblue]; TOP -> INT_TOP; INT_TOP -> INT_MIN; @@ -43,22 +46,52 @@ digraph Lattice { INT_BOT -> BOT; INT_MIN -> INT_MINDOTS -> INT_MINUS -> INT_ZERO -> INT_PLUS -> INT_MAXDOTS -> INT_MAX [style=invis]; + + // ---------------------- + // Tuples - TOP -> TUPLE; - TUPLE -> BOT; + TUPLE_TOP [label=<<B>⊤</B >:tuple>, fillcolor=pink, shape=oval]; + TUPLE_BOT [label=<<B>⊥</B>:tuple>, fillcolor=pink, shape=oval]; + + TUPLE1 [shape=none, fillcolor=none, label=< + <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> + <TH><TD BGCOLOR="pink">tuple</TD></TH> + <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR> + </TABLE> + >]; + TUPLE2 [shape=none, fillcolor=none, label=< + <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> + <TH><TD BGCOLOR="pink">tuple</TD></TH> + <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR> + <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR> + </TABLE> + >]; + TUPLEN [shape=none, fillcolor=none, label=< + <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> + <TH><TD BGCOLOR="pink">tuple</TD></TH> + <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR> + <TR><TD BGCOLOR="black" ><FONT color="white">...</FONT></TD></TR> + <TR><TD BGCOLOR="black" ><FONT color="white">type</FONT></TD></TR> + </TABLE> + >]; - TOP -> CTRL; - CTRL -> BOT; + TOP -> TUPLE_TOP; + TUPLE_TOP -> TUPLE1; + TUPLE_TOP -> TUPLE2; + TUPLE_TOP -> TUPLEN; + TUPLE1 -> TUPLE_BOT; + TUPLE2 -> TUPLE_BOT; + TUPLEN -> TUPLE_BOT; + TUPLE_BOT -> BOT; // Additional customization {rank=same; TOP} - {rank=same; INT_TOP} + {rank=same; INT_TOP; TUPLE_TOP} {rank=same; CTRL; INT_MIN; INT_MINDOTS; INT_MINUS; INT_ZERO; INT_PLUS; INT_MAXDOTS; INT_MAX; - TUPLE } - {rank=same; INT_BOT} + {rank=same; INT_BOT, TUPLE_BOT} {rank=same; BOT;} } diff --git a/chapter04/docs/lattice.svg b/chapter04/docs/lattice.svg index 1cab7681..35cb9296 100644 --- a/chapter04/docs/lattice.svg +++ b/chapter04/docs/lattice.svg @@ -4,192 +4,302 @@ <!-- Generated by graphviz version 12.2.0 (20241103.1931)
-->
<!-- Title: Lattice Pages: 1 -->
-<svg width="780pt" height="468pt"
- viewBox="0.00 0.00 779.83 467.88" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 463.88)">
+<svg width="952pt" height="406pt"
+ viewBox="0.00 0.00 952.00 406.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 402.5)">
<title>Lattice</title>
-<polygon fill="white" stroke="none" points="-4,4 -4,-463.88 775.83,-463.88 775.83,4 -4,4"/>
+<polygon fill="white" stroke="none" points="-4,4 -4,-402.5 948,-402.5 948,4 -4,4"/>
<!-- TOP -->
<g id="node1" class="node">
<title>TOP</title>
-<ellipse fill="black" stroke="black" cx="370.25" cy="-438.75" rx="21.12" ry="21.12"/>
-<text text-anchor="middle" x="370.25" y="-433.33" font-family="Times New Roman,serif" font-size="14.00" fill="white">⊤</text>
+<ellipse fill="black" stroke="black" cx="374" cy="-377.37" rx="21.12" ry="21.12"/>
+<text text-anchor="start" x="366.12" y="-372.95" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊤</text>
</g>
<!-- CTRL -->
<g id="node3" class="node">
<title>CTRL</title>
-<ellipse fill="yellow" stroke="black" cx="25.25" cy="-229.94" rx="25.25" ry="25.25"/>
-<text text-anchor="middle" x="25.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">Ctrl</text>
+<ellipse fill="yellow" stroke="black" cx="27" cy="-199.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="27" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">ctrl</text>
</g>
<!-- TOP->CTRL -->
-<g id="edge25" class="edge">
+<g id="edge1" class="edge">
<title>TOP->CTRL</title>
-<path fill="none" stroke="black" d="M352.19,-427.82C293.82,-392.49 110.39,-281.47 47.03,-243.12"/>
+<path fill="none" stroke="black" d="M354.85,-367.54C297.95,-338.34 129.51,-251.87 58.81,-215.58"/>
+<polygon fill="black" stroke="black" points="60.56,-212.54 50.07,-211.09 57.36,-218.77 60.56,-212.54"/>
</g>
<!-- INT_TOP -->
<g id="node4" class="node">
<title>INT_TOP</title>
-<ellipse fill="lightblue" stroke="black" cx="370.25" cy="-343.57" rx="38.06" ry="38.06"/>
-<text text-anchor="middle" x="370.25" y="-338.9" font-family="Times New Roman,serif" font-size="14.00">⊤ :Int</text>
+<ellipse fill="lightblue" stroke="black" cx="374" cy="-302.25" rx="33.95" ry="18"/>
+<text text-anchor="start" x="357.12" y="-298.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="372.88" y="-298.2" font-family="Times New Roman,serif" font-size="14.00">:int</text>
</g>
<!-- TOP->INT_TOP -->
-<g id="edge1" class="edge">
+<g id="edge3" class="edge">
<title>TOP->INT_TOP</title>
-<path fill="none" stroke="black" d="M370.25,-417.53C370.25,-407.15 370.25,-394.16 370.25,-382.03"/>
+<path fill="none" stroke="black" d="M374,-356C374,-348.51 374,-339.87 374,-331.79"/>
+<polygon fill="black" stroke="black" points="377.5,-332.05 374,-322.05 370.5,-332.05 377.5,-332.05"/>
</g>
-<!-- TUPLE -->
+<!-- TUPLE_TOP -->
<g id="node13" class="node">
-<title>TUPLE</title>
-<ellipse fill="pink" stroke="black" cx="732.25" cy="-229.94" rx="39.58" ry="39.58"/>
-<text text-anchor="middle" x="732.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">TUPLE</text>
+<title>TUPLE_TOP</title>
+<ellipse fill="pink" stroke="black" cx="771" cy="-302.25" rx="42.65" ry="18"/>
+<text text-anchor="start" x="747.75" y="-298.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊤</text>
+<text text-anchor="start" x="763.5" y="-298.2" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
</g>
-<!-- TOP->TUPLE -->
-<g id="edge23" class="edge">
-<title>TOP->TUPLE</title>
-<path fill="none" stroke="black" d="M388.95,-427.97C446.64,-394.69 622.49,-293.25 697.62,-249.91"/>
+<!-- TOP->TUPLE_TOP -->
+<g id="edge25" class="edge">
+<title>TOP->TUPLE_TOP</title>
+<path fill="none" stroke="black" d="M395.06,-372.49C455.97,-361.27 633.5,-328.57 721.03,-312.45"/>
+<polygon fill="black" stroke="black" points="721.57,-315.91 730.77,-310.66 720.3,-309.03 721.57,-315.91"/>
</g>
<!-- BOT -->
<g id="node2" class="node">
<title>BOT</title>
-<ellipse fill="black" stroke="black" cx="370.25" cy="-21.12" rx="21.12" ry="21.12"/>
-<text text-anchor="middle" x="370.25" y="-15.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">⊥</text>
+<ellipse fill="black" stroke="black" cx="374" cy="-21.12" rx="21.12" ry="21.12"/>
+<text text-anchor="start" x="366.12" y="-16.7" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00" fill="white">⊥</text>
</g>
<!-- CTRL->BOT -->
-<g id="edge26" class="edge">
+<g id="edge2" class="edge">
<title>CTRL->BOT</title>
-<path fill="none" stroke="black" d="M47.09,-216.72C110.49,-178.35 293.71,-67.45 352.13,-32.09"/>
+<path fill="none" stroke="black" d="M48.71,-188.11C108.7,-157.31 276.83,-71 344.87,-36.08"/>
+<polygon fill="black" stroke="black" points="346.26,-39.3 353.55,-31.62 343.06,-33.07 346.26,-39.3"/>
</g>
<!-- INT_MIN -->
<g id="node6" class="node">
<title>INT_MIN</title>
-<ellipse fill="lightblue" stroke="black" cx="112.25" cy="-229.94" rx="18.6" ry="18.6"/>
-<text text-anchor="middle" x="112.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">-n</text>
+<ellipse fill="lightblue" stroke="black" cx="116" cy="-199.25" rx="18.6" ry="18.6"/>
+<text text-anchor="middle" x="116" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">-n</text>
</g>
<!-- INT_TOP->INT_MIN -->
-<g id="edge2" class="edge">
+<g id="edge4" class="edge">
<title>INT_TOP->INT_MIN</title>
-<path fill="none" stroke="black" d="M335.45,-327.52C279.34,-303.24 170.92,-256.32 129.19,-238.27"/>
+<path fill="none" stroke="black" d="M347.36,-290.82C298.27,-271.6 193.98,-230.78 143.94,-211.18"/>
+<polygon fill="black" stroke="black" points="145.28,-207.95 134.69,-207.56 142.73,-214.47 145.28,-207.95"/>
</g>
<!-- INT_MINDOTS -->
<g id="node7" class="node">
<title>INT_MINDOTS</title>
-<text text-anchor="middle" x="201.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">...</text>
+<ellipse fill="lightblue" stroke="black" cx="205" cy="-199.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="205" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
</g>
<!-- INT_TOP->INT_MINDOTS -->
-<g id="edge3" class="edge">
+<g id="edge5" class="edge">
<title>INT_TOP->INT_MINDOTS</title>
-<path fill="none" stroke="black" d="M338.86,-321.84C306.59,-300.53 256.96,-267.74 226.95,-247.91"/>
+<path fill="none" stroke="black" d="M352.25,-288.25C322.2,-270.29 267.88,-237.83 234.28,-217.75"/>
+<polygon fill="black" stroke="black" points="236.25,-214.85 225.87,-212.72 232.66,-220.85 236.25,-214.85"/>
</g>
<!-- INT_MINUS -->
<g id="node8" class="node">
<title>INT_MINUS</title>
-<ellipse fill="lightblue" stroke="black" cx="290.25" cy="-229.94" rx="18.6" ry="18.6"/>
-<text text-anchor="middle" x="290.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">-1</text>
+<ellipse fill="lightblue" stroke="black" cx="294" cy="-199.25" rx="18.6" ry="18.6"/>
+<text text-anchor="middle" x="294" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">-1</text>
</g>
<!-- INT_TOP->INT_MINUS -->
-<g id="edge4" class="edge">
+<g id="edge6" class="edge">
<title>INT_TOP->INT_MINUS</title>
-<path fill="none" stroke="black" d="M348.39,-312.07C332.94,-290.51 312.9,-262.55 300.84,-245.72"/>
+<path fill="none" stroke="black" d="M361.5,-285.47C348.27,-268.76 327.25,-242.23 312.18,-223.21"/>
+<polygon fill="black" stroke="black" points="315.02,-221.14 306.06,-215.48 309.53,-225.49 315.02,-221.14"/>
</g>
<!-- INT_ZERO -->
<g id="node9" class="node">
<title>INT_ZERO</title>
-<ellipse fill="lightblue" stroke="black" cx="370.25" cy="-229.94" rx="18" ry="18"/>
-<text text-anchor="middle" x="370.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">0</text>
+<ellipse fill="lightblue" stroke="black" cx="374" cy="-199.25" rx="18" ry="18"/>
+<text text-anchor="middle" x="374" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">0</text>
</g>
<!-- INT_TOP->INT_ZERO -->
-<g id="edge5" class="edge">
+<g id="edge7" class="edge">
<title>INT_TOP->INT_ZERO</title>
-<path fill="none" stroke="black" d="M370.25,-305.09C370.25,-285.83 370.25,-263.3 370.25,-248.18"/>
+<path fill="none" stroke="black" d="M374,-284.12C374,-269.02 374,-246.74 374,-228.93"/>
+<polygon fill="black" stroke="black" points="377.5,-228.98 374,-218.98 370.5,-228.98 377.5,-228.98"/>
</g>
<!-- INT_PLUS -->
<g id="node10" class="node">
<title>INT_PLUS</title>
-<ellipse fill="lightblue" stroke="black" cx="449.25" cy="-229.94" rx="18" ry="18"/>
-<text text-anchor="middle" x="449.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">1</text>
+<ellipse fill="lightblue" stroke="black" cx="453" cy="-199.25" rx="18" ry="18"/>
+<text text-anchor="middle" x="453" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">1</text>
</g>
<!-- INT_TOP->INT_PLUS -->
-<g id="edge6" class="edge">
+<g id="edge8" class="edge">
<title>INT_TOP->INT_PLUS</title>
-<path fill="none" stroke="black" d="M392.05,-311.77C407.39,-290.09 427.23,-262.05 439.06,-245.34"/>
+<path fill="none" stroke="black" d="M386.34,-285.47C399.49,-268.67 420.4,-241.93 435.3,-222.88"/>
+<polygon fill="black" stroke="black" points="437.93,-225.2 441.33,-215.17 432.41,-220.89 437.93,-225.2"/>
</g>
<!-- INT_MAXDOTS -->
<g id="node11" class="node">
<title>INT_MAXDOTS</title>
-<text text-anchor="middle" x="537.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">...</text>
+<ellipse fill="lightblue" stroke="black" cx="541" cy="-199.25" rx="27" ry="18"/>
+<text text-anchor="middle" x="541" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">...</text>
</g>
<!-- INT_TOP->INT_MAXDOTS -->
-<g id="edge7" class="edge">
+<g id="edge9" class="edge">
<title>INT_TOP->INT_MAXDOTS</title>
-<path fill="none" stroke="black" d="M401.66,-321.58C433.6,-300.23 482.46,-267.57 511.98,-247.83"/>
+<path fill="none" stroke="black" d="M395.83,-288.04C425.56,-270.07 478.84,-237.84 511.93,-217.83"/>
+<polygon fill="black" stroke="black" points="513.46,-221 520.2,-212.83 509.84,-215.01 513.46,-221"/>
</g>
<!-- INT_MAX -->
<g id="node12" class="node">
<title>INT_MAX</title>
-<ellipse fill="lightblue" stroke="black" cx="628.25" cy="-229.94" rx="21.15" ry="21.15"/>
-<text text-anchor="middle" x="628.25" y="-224.89" font-family="Times New Roman,serif" font-size="14.00">+n</text>
+<ellipse fill="lightblue" stroke="black" cx="632" cy="-199.25" rx="21.15" ry="21.15"/>
+<text text-anchor="middle" x="632" y="-194.2" font-family="Times New Roman,serif" font-size="14.00">+n</text>
</g>
<!-- INT_TOP->INT_MAX -->
-<g id="edge8" class="edge">
+<g id="edge10" class="edge">
<title>INT_TOP->INT_MAX</title>
-<path fill="none" stroke="black" d="M405.04,-327.52C460.06,-303.71 565.35,-258.16 608.78,-239.36"/>
+<path fill="none" stroke="black" d="M400.64,-290.82C449,-271.89 550.91,-231.99 601.78,-212.08"/>
+<polygon fill="black" stroke="black" points="602.96,-215.38 610.99,-208.47 600.41,-208.86 602.96,-215.38"/>
</g>
<!-- INT_BOT -->
<g id="node5" class="node">
<title>INT_BOT</title>
-<ellipse fill="lightblue" stroke="black" cx="370.25" cy="-116.3" rx="38.06" ry="38.06"/>
-<text text-anchor="middle" x="370.25" y="-111.63" font-family="Times New Roman,serif" font-size="14.00">⊥ :Int</text>
+<ellipse fill="lightblue" stroke="black" cx="374" cy="-96.25" rx="33.95" ry="18"/>
+<text text-anchor="start" x="357.12" y="-92.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="372.88" y="-92.2" font-family="Times New Roman,serif" font-size="14.00">:int</text>
</g>
<!-- INT_BOT->BOT -->
-<g id="edge16" class="edge">
+<g id="edge18" class="edge">
<title>INT_BOT->BOT</title>
-<path fill="none" stroke="black" d="M370.25,-77.94C370.25,-65.89 370.25,-52.98 370.25,-42.62"/>
+<path fill="none" stroke="black" d="M374,-77.92C374,-70.74 374,-62.18 374,-53.95"/>
+<polygon fill="black" stroke="black" points="377.5,-54.22 374,-44.22 370.5,-54.22 377.5,-54.22"/>
</g>
<!-- INT_MIN->INT_BOT -->
-<g id="edge9" class="edge">
+<g id="edge11" class="edge">
<title>INT_MIN->INT_BOT</title>
-<path fill="none" stroke="black" d="M129.18,-221.61C170.88,-203.57 279.24,-156.68 335.39,-132.39"/>
+<path fill="none" stroke="black" d="M133.33,-191.46C174.74,-175.25 280.22,-133.96 336.8,-111.81"/>
+<polygon fill="black" stroke="black" points="337.98,-115.11 346.02,-108.2 335.43,-108.59 337.98,-115.11"/>
</g>
<!-- INT_MIN->INT_MINDOTS -->
<!-- INT_MINDOTS->INT_BOT -->
-<g id="edge10" class="edge">
+<g id="edge12" class="edge">
<title>INT_MINDOTS->INT_BOT</title>
-<path fill="none" stroke="black" d="M226.92,-211.98C256.83,-192.22 306.29,-159.56 338.57,-138.23"/>
+<path fill="none" stroke="black" d="M224.72,-186.46C253.64,-169.18 307.88,-136.76 342.4,-116.13"/>
+<polygon fill="black" stroke="black" points="343.92,-119.3 350.71,-111.17 340.33,-113.29 343.92,-119.3"/>
</g>
<!-- INT_MINDOTS->INT_MINUS -->
<!-- INT_MINUS->INT_BOT -->
-<g id="edge11" class="edge">
+<g id="edge13" class="edge">
<title>INT_MINUS->INT_BOT</title>
-<path fill="none" stroke="black" d="M300.71,-214.34C312.74,-197.56 332.82,-169.54 348.32,-147.91"/>
+<path fill="none" stroke="black" d="M305.12,-184.2C317.82,-168.18 338.81,-141.67 354.29,-122.13"/>
+<polygon fill="black" stroke="black" points="356.98,-124.37 360.45,-114.35 351.5,-120.02 356.98,-124.37"/>
</g>
<!-- INT_MINUS->INT_ZERO -->
<!-- INT_ZERO->INT_BOT -->
-<g id="edge12" class="edge">
+<g id="edge14" class="edge">
<title>INT_ZERO->INT_BOT</title>
-<path fill="none" stroke="black" d="M370.25,-211.5C370.25,-196.29 370.25,-173.71 370.25,-154.48"/>
+<path fill="none" stroke="black" d="M374,-181.12C374,-166.02 374,-143.74 374,-125.93"/>
+<polygon fill="black" stroke="black" points="377.5,-125.98 374,-115.98 370.5,-125.98 377.5,-125.98"/>
</g>
<!-- INT_ZERO->INT_PLUS -->
<!-- INT_PLUS->INT_BOT -->
-<g id="edge13" class="edge">
+<g id="edge15" class="edge">
<title>INT_PLUS->INT_BOT</title>
-<path fill="none" stroke="black" d="M439.24,-214.8C427.37,-198.02 407.23,-169.57 391.77,-147.71"/>
+<path fill="none" stroke="black" d="M442.35,-184.63C429.9,-168.71 409.04,-142.04 393.63,-122.35"/>
+<polygon fill="black" stroke="black" points="396.42,-120.23 387.5,-114.51 390.9,-124.54 396.42,-120.23"/>
</g>
<!-- INT_PLUS->INT_MAXDOTS -->
<!-- INT_MAXDOTS->INT_BOT -->
-<g id="edge14" class="edge">
+<g id="edge16" class="edge">
<title>INT_MAXDOTS->INT_BOT</title>
-<path fill="none" stroke="black" d="M511.89,-211.98C482.32,-192.22 433.46,-159.56 401.56,-138.23"/>
+<path fill="none" stroke="black" d="M521.52,-186.46C492.93,-169.18 439.34,-136.76 405.22,-116.13"/>
+<polygon fill="black" stroke="black" points="407.39,-113.35 397.03,-111.17 403.77,-119.34 407.39,-113.35"/>
</g>
<!-- INT_MAXDOTS->INT_MAX -->
<!-- INT_MAX->INT_BOT -->
-<g id="edge15" class="edge">
+<g id="edge17" class="edge">
<title>INT_MAX->INT_BOT</title>
-<path fill="none" stroke="black" d="M608.86,-220.55C565.5,-201.79 460.2,-156.22 405.12,-132.39"/>
-</g>
-<!-- TUPLE->BOT -->
-<g id="edge24" class="edge">
-<title>TUPLE->BOT</title>
-<path fill="none" stroke="black" d="M697.54,-209.92C622.33,-166.53 446.47,-65.09 388.87,-31.87"/>
+<path fill="none" stroke="black" d="M612.61,-190.66C569.87,-173.93 466.96,-133.64 411.28,-111.84"/>
+<polygon fill="black" stroke="black" points="412.8,-108.68 402.21,-108.29 410.25,-115.2 412.8,-108.68"/>
+</g>
+<!-- TUPLE1 -->
+<g id="node15" class="node">
+<title>TUPLE1</title>
+<polygon fill="none" stroke="none" points="750,-225.75 696,-225.75 696,-172.75 750,-172.75 750,-225.75"/>
+<polygon fill="pink" stroke="none" points="706.5,-199.25 706.5,-221.75 739.5,-221.75 739.5,-199.25 706.5,-199.25"/>
+<polygon fill="none" stroke="black" points="706.5,-199.25 706.5,-221.75 739.5,-221.75 739.5,-199.25 706.5,-199.25"/>
+<text text-anchor="start" x="709.5" y="-205.45" font-family="Times New Roman,serif" font-size="14.00">tuple</text>
+<polygon fill="black" stroke="none" points="706.5,-176.75 706.5,-199.25 739.5,-199.25 739.5,-176.75 706.5,-176.75"/>
+<polygon fill="none" stroke="black" points="706.5,-176.75 706.5,-199.25 739.5,-199.25 739.5,-176.75 706.5,-176.75"/>
+<text text-anchor="start" x="711.38" y="-182.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP->TUPLE1 -->
+<g id="edge26" class="edge">
+<title>TUPLE_TOP->TUPLE1</title>
+<path fill="none" stroke="black" d="M762.86,-284.12C756.58,-270.91 747.69,-252.2 739.89,-235.8"/>
+<polygon fill="black" stroke="black" points="743.07,-234.33 735.62,-226.8 736.75,-237.34 743.07,-234.33"/>
+</g>
+<!-- TUPLE2 -->
+<g id="node16" class="node">
+<title>TUPLE2</title>
+<polygon fill="none" stroke="none" points="847,-237 793,-237 793,-161.5 847,-161.5 847,-237"/>
+<polygon fill="pink" stroke="none" points="803.5,-210.5 803.5,-233 836.5,-233 836.5,-210.5 803.5,-210.5"/>
+<polygon fill="none" stroke="black" points="803.5,-210.5 803.5,-233 836.5,-233 836.5,-210.5 803.5,-210.5"/>
+<text text-anchor="start" x="806.5" y="-216.7" font-family="Times New Roman,serif" font-size="14.00">tuple</text>
+<polygon fill="black" stroke="none" points="803.5,-188 803.5,-210.5 836.5,-210.5 836.5,-188 803.5,-188"/>
+<polygon fill="none" stroke="black" points="803.5,-188 803.5,-210.5 836.5,-210.5 836.5,-188 803.5,-188"/>
+<text text-anchor="start" x="808.38" y="-194.2" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="black" stroke="none" points="803.5,-165.5 803.5,-188 836.5,-188 836.5,-165.5 803.5,-165.5"/>
+<polygon fill="none" stroke="black" points="803.5,-165.5 803.5,-188 836.5,-188 836.5,-165.5 803.5,-165.5"/>
+<text text-anchor="start" x="808.38" y="-171.7" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP->TUPLE2 -->
+<g id="edge27" class="edge">
+<title>TUPLE_TOP->TUPLE2</title>
+<path fill="none" stroke="black" d="M779.31,-284.12C784.32,-273.8 790.95,-260.12 797.41,-246.81"/>
+<polygon fill="black" stroke="black" points="800.41,-248.65 801.62,-238.13 794.11,-245.6 800.41,-248.65"/>
+</g>
+<!-- TUPLEN -->
+<g id="node17" class="node">
+<title>TUPLEN</title>
+<polygon fill="none" stroke="none" points="944,-248.25 890,-248.25 890,-150.25 944,-150.25 944,-248.25"/>
+<polygon fill="pink" stroke="none" points="900.5,-221.75 900.5,-244.25 933.5,-244.25 933.5,-221.75 900.5,-221.75"/>
+<polygon fill="none" stroke="black" points="900.5,-221.75 900.5,-244.25 933.5,-244.25 933.5,-221.75 900.5,-221.75"/>
+<text text-anchor="start" x="903.5" y="-227.95" font-family="Times New Roman,serif" font-size="14.00">tuple</text>
+<polygon fill="black" stroke="none" points="900.5,-199.25 900.5,-221.75 933.5,-221.75 933.5,-199.25 900.5,-199.25"/>
+<polygon fill="none" stroke="black" points="900.5,-199.25 900.5,-221.75 933.5,-221.75 933.5,-199.25 900.5,-199.25"/>
+<text text-anchor="start" x="905.38" y="-205.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+<polygon fill="black" stroke="none" points="900.5,-176.75 900.5,-199.25 933.5,-199.25 933.5,-176.75 900.5,-176.75"/>
+<polygon fill="none" stroke="black" points="900.5,-176.75 900.5,-199.25 933.5,-199.25 933.5,-176.75 900.5,-176.75"/>
+<text text-anchor="start" x="911.38" y="-182.95" font-family="Times New Roman,serif" font-size="14.00" fill="white">...</text>
+<polygon fill="black" stroke="none" points="900.5,-154.25 900.5,-176.75 933.5,-176.75 933.5,-154.25 900.5,-154.25"/>
+<polygon fill="none" stroke="black" points="900.5,-154.25 900.5,-176.75 933.5,-176.75 933.5,-154.25 900.5,-154.25"/>
+<text text-anchor="start" x="905.38" y="-160.45" font-family="Times New Roman,serif" font-size="14.00" fill="white">type</text>
+</g>
+<!-- TUPLE_TOP->TUPLEN -->
+<g id="edge28" class="edge">
+<title>TUPLE_TOP->TUPLEN</title>
+<path fill="none" stroke="black" d="M792.54,-286.35C815.75,-270.29 853.06,-244.48 880.79,-225.3"/>
+<polygon fill="black" stroke="black" points="882.68,-228.25 888.91,-219.68 878.7,-222.49 882.68,-228.25"/>
+</g>
+<!-- TUPLE_BOT -->
+<g id="node14" class="node">
+<title>TUPLE_BOT</title>
+<ellipse fill="pink" stroke="black" cx="771" cy="-96.25" rx="42.65" ry="18"/>
+<text text-anchor="start" x="747.75" y="-92.2" font-family="Times New Roman,serif" font-weight="bold" font-size="14.00">⊥</text>
+<text text-anchor="start" x="763.5" y="-92.2" font-family="Times New Roman,serif" font-size="14.00">:tuple</text>
+</g>
+<!-- TUPLE_BOT->BOT -->
+<g id="edge32" class="edge">
+<title>TUPLE_BOT->BOT</title>
+<path fill="none" stroke="black" d="M732.57,-88.17C654.42,-73.77 478.23,-41.32 405.9,-28"/>
+<polygon fill="black" stroke="black" points="406.78,-24.6 396.31,-26.23 405.51,-31.49 406.78,-24.6"/>
+</g>
+<!-- TUPLE1->TUPLE_BOT -->
+<g id="edge29" class="edge">
+<title>TUPLE1->TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M735.11,-172.76C742.13,-158 750.96,-139.41 758.11,-124.38"/>
+<polygon fill="black" stroke="black" points="761.18,-126.06 762.31,-115.53 754.86,-123.06 761.18,-126.06"/>
+</g>
+<!-- TUPLE2->TUPLE_BOT -->
+<g id="edge30" class="edge">
+<title>TUPLE2->TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M802.17,-161.5C796.24,-149.27 789.75,-135.89 784.23,-124.51"/>
+<polygon fill="black" stroke="black" points="787.46,-123.15 779.94,-115.69 781.16,-126.21 787.46,-123.15"/>
+</g>
+<!-- TUPLEN->TUPLE_BOT -->
+<g id="edge31" class="edge">
+<title>TUPLEN->TUPLE_BOT</title>
+<path fill="none" stroke="black" d="M890.22,-179.72C865.26,-162.45 828.04,-136.71 801.84,-118.58"/>
+<polygon fill="black" stroke="black" points="803.85,-115.72 793.64,-112.91 799.87,-121.47 803.85,-115.72"/>
</g>
</g>
</svg>
|
