diff options
| author | Marc Vertes <mvertes@free.fr> | 2023-05-03 11:03:52 +0200 |
|---|---|---|
| committer | Marc Vertes <mvertes@free.fr> | 2023-05-03 11:03:52 +0200 |
| commit | 225ec09076ce44673e4914770d67cadd670910d8 (patch) | |
| tree | 5461895c29ff0379c711b2639f6e5192521984c5 | |
initial release
| -rw-r--r-- | Makefile | 11 | ||||
| -rwxr-xr-x | build.sh | 46 | ||||
| -rw-r--r-- | index.html | 37 | ||||
| -rw-r--r-- | meta.sh | 3 | ||||
| -rw-r--r-- | readme.md | 15 | ||||
| -rw-r--r-- | yaegi-internals/ex1_ast_cfg.drawio.svg | 4 | ||||
| -rw-r--r-- | yaegi-internals/ex1_cfg.drawio.svg | 4 | ||||
| -rw-r--r-- | yaegi-internals/ex1_cfg_loop.drawio.svg | 4 | ||||
| -rw-r--r-- | yaegi-internals/ex1_raw_ast.drawio.svg | 4 | ||||
| -rw-r--r-- | yaegi-internals/frame1.drawio.svg | 4 | ||||
| -rw-r--r-- | yaegi-internals/index.html | 390 | ||||
| -rw-r--r-- | yaegi-internals/meta.sh | 4 | ||||
| -rw-r--r-- | yaegi-internals/readme.md | 405 | ||||
| -rw-r--r-- | yaegi-internals/yaegi_internals_fig1.drawio.svg | 4 |
14 files changed, 935 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b0f68f4 --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +# Generate the static web site from markdown files. +build: + ./build.sh + +# Launch a local web server. +server: + yaegi -e 'http.ListenAndServe(":8080", http.FileServer(http.Dir(".")))' + +# Publish on github pages. +publish: + git push diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..efda627 --- /dev/null +++ b/build.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +header='<meta charset="UTF-8"> +<meta name="viewport" content="width=device-width, initial-scale=1"> +<style> + body { + max-width: 45rem; + margin: auto; + padding: 0.5em; + text-align: justify; + } + h1 { text-align: center } + pre { + border: 1px solid; + padding: 1ch; + border-radius: 5px; + overflow: auto; + background-color: #eee; + } +</style> +' + +genhtml() ( + cd "$1" + + . ./meta.sh + + exec 1>index.html + + # Header + echo "<title>$title</title>" + echo "<!-- generated by build.sh. DO NOT EDIT. -->" + echo "$header" + [ "$1" != . ] && echo "<a href=\"..\">$blog_title</a><hr>" + + # Body + pandoc *.md + + # Footer + echo "<hr>From: $author, $date" +) + +for d in *; do + [ -d "$d" ] && genhtml "$d" +done +genhtml . diff --git a/index.html b/index.html new file mode 100644 index 0000000..63d5b2f --- /dev/null +++ b/index.html @@ -0,0 +1,37 @@ +<title>Marc's Programming Notes</title> +<!-- generated by build.sh. DO NOT EDIT. --> +<meta charset="UTF-8"> +<meta name="viewport" content="width=device-width, initial-scale=1"> +<style> + body { + max-width: 45rem; + margin: auto; + padding: 0.5em; + text-align: justify; + } + h1 { text-align: center } + pre { + border: 1px solid; + padding: 1ch; + border-radius: 5px; + overflow: auto; + background-color: #eee; + } +</style> + +<h1 id="marcs-programming-notes">Marc’s Programming Notes</h1> +<p>A blog about programming and other stories.</p> +<h2 id="posts">Posts</h2> +<ul> +<li><p><a href="yaegi-internals">Yaegi-Internals</a> may 2023</p> +<p>The anatomy of a Go interpreter.</p></li> +</ul> +<h2 id="contact">Contact</h2> +<ul> +<li>Email: mvertes@free.fr</li> +<li>Github: <a href="https://github.com/mvertes"><span class="citation" +data-cites="mvertes">@mvertes</span></a></li> +<li>Mastodon: <a href="https://mstdn.fr/@mvertes"><span class="citation" +data-cites="mvertes">@mvertes</span></a></li> +</ul> +<hr>From: Marc Vertes, 03 may 2023 @@ -0,0 +1,3 @@ +title="Marc's Programming Notes" +author="Marc Vertes" +date="03 may 2023" diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..843ef20 --- /dev/null +++ b/readme.md @@ -0,0 +1,15 @@ +# Marc's Programming Notes + +A blog about programming and other stories. + +## Posts + +- [Yaegi-Internals](yaegi-internals) may 2023 + + The anatomy of a Go interpreter. + +## Contact + +* Email: mvertes@free.fr +* Github: [@mvertes](https://github.com/mvertes) +* Mastodon: [@mvertes](https://mstdn.fr/@mvertes) diff --git a/yaegi-internals/ex1_ast_cfg.drawio.svg b/yaegi-internals/ex1_ast_cfg.drawio.svg new file mode 100644 index 0000000..cf15da5 --- /dev/null +++ b/yaegi-internals/ex1_ast_cfg.drawio.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than diagrams.net --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="471px" height="301px" viewBox="-0.5 -0.5 471 301" content="<mxfile host="Electron" modified="2023-04-04T09:52:23.254Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.1.2 Chrome/106.0.5249.199 Electron/21.4.3 Safari/537.36" etag="ajiZ4L5__m9Y7oxOlmHf" version="21.1.2" type="device"> <diagram name="Page-1" id="xVztW_I66fIyG3nHzLhH"> <mxGraphModel dx="954" dy="727" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="kNLiaCNoJibRKC7dolPK-1" value="1: stmt" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="230" y="30" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-2" value="2: :=" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="120" y="90" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-3" value="3: a" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="40" y="160" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-4" value="4: 3" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="120" y="160" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-5" value="5: if" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="230" y="90" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-6" value="6: &amp;gt;" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="200" y="160" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-7" value="7: a" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="120" y="230" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-8" value="8: 2" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="200" y="230" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-9" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-1" target="kNLiaCNoJibRKC7dolPK-5" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="260" y="390" as="sourcePoint" /> <mxPoint x="310" y="340" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-10" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-1" target="kNLiaCNoJibRKC7dolPK-2" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="270" y="70" as="sourcePoint" /> <mxPoint x="270" y="100" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-11" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-2" target="kNLiaCNoJibRKC7dolPK-4" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="249" y="66" as="sourcePoint" /> <mxPoint x="181" y="104" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-12" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-2" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="160" y="130" as="sourcePoint" /> <mxPoint x="80" y="160" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-13" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" target="kNLiaCNoJibRKC7dolPK-6" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="250" y="120" as="sourcePoint" /> <mxPoint x="270" y="100" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-14" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.65;entryY=0.033;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.3;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-6" target="kNLiaCNoJibRKC7dolPK-7" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="170" y="210" as="sourcePoint" /> <mxPoint x="240" y="170" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-15" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-6" target="kNLiaCNoJibRKC7dolPK-8" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="228" y="200" as="sourcePoint" /> <mxPoint x="169" y="241" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-16" value="9: stmt" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="280" y="160" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-17" value="10: call" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="280" y="230" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-18" value="11: print" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="220" y="300" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-19" value="12: &quot;ok&quot;" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="340" y="300" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-20" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.317;entryY=0.067;entryDx=0;entryDy=0;exitX=0.617;exitY=0.967;exitDx=0;exitDy=0;exitPerimeter=0;entryPerimeter=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-5" target="kNLiaCNoJibRKC7dolPK-16" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="260" y="130" as="sourcePoint" /> <mxPoint x="240" y="170" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-21" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-16" target="kNLiaCNoJibRKC7dolPK-17" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="277" y="129" as="sourcePoint" /> <mxPoint x="309" y="172" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-22" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0;entryDx=0;entryDy=0;exitX=0.383;exitY=1.033;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-17" target="kNLiaCNoJibRKC7dolPK-18" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="320" y="200" as="sourcePoint" /> <mxPoint x="320" y="240" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-23" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.333;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.65;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-17" target="kNLiaCNoJibRKC7dolPK-19" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="320" y="250" as="sourcePoint" /> <mxPoint x="281" y="294" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-24" value="13: call" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="360" y="90" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-25" value="14: print" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="360" y="160" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-26" value="15: &quot;bye&quot;" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="450" y="160" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-27" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0.317;entryY=0.067;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-1" target="kNLiaCNoJibRKC7dolPK-24" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="270" y="70" as="sourcePoint" /> <mxPoint x="270" y="100" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-28" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-24" target="kNLiaCNoJibRKC7dolPK-25" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="291" y="66" as="sourcePoint" /> <mxPoint x="389" y="102" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-29" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=1;exitY=1;exitDx=0;exitDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-24" target="kNLiaCNoJibRKC7dolPK-26" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="400" y="130" as="sourcePoint" /> <mxPoint x="400" y="170" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-30" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#00CC00;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-2" target="kNLiaCNoJibRKC7dolPK-6" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="180" y="140" as="sourcePoint" /> <mxPoint x="230" y="90" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-32" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#FF0000;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0;exitDx=0;exitDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-6" target="kNLiaCNoJibRKC7dolPK-24" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="290" y="410" as="sourcePoint" /> <mxPoint x="340" y="360" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-33" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#00CC00;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-6" target="kNLiaCNoJibRKC7dolPK-17" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="252" y="190" as="sourcePoint" /> <mxPoint x="290" y="238" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-34" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#00CC00;exitX=0.733;exitY=0.067;exitDx=0;exitDy=0;entryX=0.283;entryY=1.033;entryDx=0;entryDy=0;entryPerimeter=0;exitPerimeter=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-17" target="kNLiaCNoJibRKC7dolPK-24" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="261" y="196" as="sourcePoint" /> <mxPoint x="299" y="244" as="targetPoint" /> </mxGeometry> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs/><g><g id="cell-kNLiaCNoJibRKC7dolPK-1"><ellipse cx="220" cy="15" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 15px; margin-left: 191px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">1: stmt</div></div></div></foreignObject><text x="220" y="19" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">1: stmt</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-2"><ellipse cx="110" cy="75" rx="30" ry="15" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 75px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">2: :=</div></div></div></foreignObject><text x="110" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">2: :=</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-3"><ellipse cx="30" cy="145" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 145px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">3: a</div></div></div></foreignObject><text x="30" y="149" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">3: a</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-4"><ellipse cx="110" cy="145" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 145px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">4: 3</div></div></div></foreignObject><text x="110" y="149" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">4: 3</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-5"><ellipse cx="220" cy="75" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 75px; margin-left: 191px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">5: if</div></div></div></foreignObject><text x="220" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">5: if</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-6"><ellipse cx="190" cy="145" rx="30" ry="15" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 145px; margin-left: 161px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">6: ></div></div></div></foreignObject><text x="190" y="149" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">6: ></text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-7"><ellipse cx="110" cy="215" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 215px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">7: a</div></div></div></foreignObject><text x="110" y="219" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">7: a</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-8"><ellipse cx="190" cy="215" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 215px; margin-left: 161px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">8: 2</div></div></div></foreignObject><text x="190" y="219" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">8: 2</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-9"><path d="M 220 30 L 220 53.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 220 58.88 L 216.5 51.88 L 220 53.63 L 223.5 51.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-10"><path d="M 198.79 25.61 L 136.74 61.22" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 132.18 63.84 L 136.51 57.32 L 136.74 61.22 L 140 63.39 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-11"><path d="M 110 90 L 110 123.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 110 128.88 L 106.5 121.88 L 110 123.63 L 113.5 121.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-12"><path d="M 88.79 85.61 L 44.71 125.71" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 40.83 129.25 L 43.65 121.95 L 44.71 125.71 L 48.36 127.13 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-13"><path d="M 210 90 L 192.85 124.3" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 190.5 129 L 190.5 121.17 L 192.85 124.3 L 196.76 124.3 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-14"><path d="M 178 160 L 124.23 197.36" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 119.92 200.35 L 123.67 193.48 L 124.23 197.36 L 127.66 199.23 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-15"><path d="M 190 160 L 190 193.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 190 198.88 L 186.5 191.88 L 190 193.63 L 193.5 191.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-16"><ellipse cx="270" cy="145" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 145px; margin-left: 241px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">9: stmt</div></div></div></foreignObject><text x="270" y="149" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">9: stmt</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-17"><ellipse cx="270" cy="215" rx="30" ry="15" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 215px; margin-left: 241px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">10: call</div></div></div></foreignObject><text x="270" y="219" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">10: call</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-18"><ellipse cx="210" cy="285" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 285px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">11: print</div></div></div></foreignObject><text x="210" y="289" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">11: print</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-19"><ellipse cx="330" cy="285" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 285px; margin-left: 301px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">12: "ok"</div></div></div></foreignObject><text x="330" y="289" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">12: "ok"</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-20"><path d="M 227.02 89.01 L 255.22 126.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 258.35 131.11 L 251.37 127.59 L 255.22 126.9 L 256.98 123.41 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-21"><path d="M 270 160 L 270 193.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 270 198.88 L 266.5 191.88 L 270 193.63 L 273.5 191.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-22"><path d="M 262.98 230.99 L 234.97 269.25" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 231.87 273.49 L 233.18 265.78 L 234.97 269.25 L 238.83 269.91 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-23"><path d="M 279 230 L 315.42 265.55" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 319.18 269.22 L 311.73 266.83 L 315.42 265.55 L 316.62 261.82 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-24"><ellipse cx="350" cy="75" rx="30" ry="15" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 75px; margin-left: 321px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">13: call</div></div></div></foreignObject><text x="350" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">13: call</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-25"><ellipse cx="350" cy="145" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 145px; margin-left: 321px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">14: print</div></div></div></foreignObject><text x="350" y="149" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">14: print</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-26"><ellipse cx="440" cy="145" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 145px; margin-left: 411px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">15: "bye"</div></div></div></foreignObject><text x="440" y="149" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">15: "bye"</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-27"><path d="M 241.21 25.61 L 333.05 59.79" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 337.97 61.62 L 330.19 62.46 L 333.05 59.79 L 332.63 55.9 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-28"><path d="M 350 90 L 350 123.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 350 128.88 L 346.5 121.88 L 350 123.63 L 353.5 121.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-29"><path d="M 371.21 85.61 L 434.65 126.55" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 439.06 129.39 L 431.28 128.54 L 434.65 126.55 L 435.08 122.66 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-30"><path d="M 131.21 85.61 L 164.9 129.35" fill="none" stroke="#00cc00" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 168.1 133.51 L 161.06 130.1 L 164.9 129.35 L 166.61 125.83 Z" fill="#00cc00" stroke="#00cc00" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-32"><path d="M 211.21 134.39 L 314.41 78.05" fill="none" stroke="#ff0000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 319.02 75.54 L 314.55 81.96 L 314.41 78.05 L 311.2 75.82 Z" fill="#ff0000" stroke="#ff0000" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-33"><path d="M 211.21 155.61 L 244.9 199.35" fill="none" stroke="#00cc00" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 248.1 203.51 L 241.06 200.1 L 244.9 199.35 L 246.61 195.83 Z" fill="#00cc00" stroke="#00cc00" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-34"><path d="M 283.98 202.01 L 334.24 96.74" fill="none" stroke="#00cc00" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 336.5 92 L 336.64 99.82 L 334.24 96.74 L 330.32 96.81 Z" fill="#00cc00" stroke="#00cc00" stroke-miterlimit="10" pointer-events="all"/></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file diff --git a/yaegi-internals/ex1_cfg.drawio.svg b/yaegi-internals/ex1_cfg.drawio.svg new file mode 100644 index 0000000..6cc87c8 --- /dev/null +++ b/yaegi-internals/ex1_cfg.drawio.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than diagrams.net --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="421px" height="95px" viewBox="-0.5 -0.5 421 95" content="<mxfile host="Electron" modified="2023-04-04T09:52:02.347Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.1.2 Chrome/106.0.5249.199 Electron/21.4.3 Safari/537.36" etag="nGrzC8U6nfsKaIXWIYYw" version="21.1.2" type="device"> <diagram name="Page-1" id="xVztW_I66fIyG3nHzLhH"> <mxGraphModel dx="954" dy="727" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="kNLiaCNoJibRKC7dolPK-2" value="2: :=" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1"> <mxGeometry x="120" y="90" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-6" value="6: &amp;gt;" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1"> <mxGeometry x="240" y="90" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-17" value="10: call" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1"> <mxGeometry x="360" y="140" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-24" value="13: call" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1"> <mxGeometry x="480" y="90" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-30" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#00CC00;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="kNLiaCNoJibRKC7dolPK-2" target="kNLiaCNoJibRKC7dolPK-6"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="180" y="140" as="sourcePoint" /> <mxPoint x="230" y="90" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-32" value="" style="endArrow=classic;html=1;strokeColor=#FF0000;entryX=0;entryY=0;entryDx=0;entryDy=0;exitX=1;exitY=0;exitDx=0;exitDy=0;curved=1;" edge="1" parent="1" source="kNLiaCNoJibRKC7dolPK-6" target="kNLiaCNoJibRKC7dolPK-24"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="290" y="410" as="sourcePoint" /> <mxPoint x="340" y="360" as="targetPoint" /> <Array as="points"> <mxPoint x="390" y="60" /> </Array> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-33" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#00CC00;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="kNLiaCNoJibRKC7dolPK-6" target="kNLiaCNoJibRKC7dolPK-17"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="252" y="190" as="sourcePoint" /> <mxPoint x="290" y="238" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-34" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#00CC00;entryX=0;entryY=1;entryDx=0;entryDy=0;exitX=1;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="kNLiaCNoJibRKC7dolPK-17" target="kNLiaCNoJibRKC7dolPK-24"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="420" y="140" as="sourcePoint" /> <mxPoint x="299" y="244" as="targetPoint" /> </mxGeometry> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs/><g><g id="cell-kNLiaCNoJibRKC7dolPK-2"><ellipse cx="30" cy="28" rx="30" ry="15" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 28px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">2: :=</div></div></div></foreignObject><text x="30" y="32" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">2: :=</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-6"><ellipse cx="150" cy="28" rx="30" ry="15" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 28px; margin-left: 121px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">6: ></div></div></div></foreignObject><text x="150" y="32" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">6: ></text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-17"><ellipse cx="270" cy="78" rx="30" ry="15" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 78px; margin-left: 241px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">10: call</div></div></div></foreignObject><text x="270" y="82" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">10: call</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-24"><ellipse cx="390" cy="28" rx="30" ry="15" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 28px; margin-left: 361px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">13: call</div></div></div></foreignObject><text x="390" y="32" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">13: call</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-30"><path d="M 60 28 L 113.63 28" fill="none" stroke="#00cc00" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 118.88 28 L 111.88 31.5 L 113.63 28 L 111.88 24.5 Z" fill="#00cc00" stroke="#00cc00" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-32"><path d="M 171.21 17.39 Q 270 -17 362.77 15.3" fill="none" stroke="#ff0000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 367.73 17.03 L 359.97 18.03 L 362.77 15.3 L 362.27 11.42 Z" fill="#ff0000" stroke="#ff0000" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-33"><path d="M 171.21 38.61 L 242.82 65.18" fill="none" stroke="#00cc00" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 247.74 67 L 239.96 67.85 L 242.82 65.18 L 242.39 61.29 Z" fill="#00cc00" stroke="#00cc00" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-34"><path d="M 291.21 67.39 L 362.82 40.82" fill="none" stroke="#00cc00" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 367.74 39 L 362.39 44.71 L 362.82 40.82 L 359.96 38.15 Z" fill="#00cc00" stroke="#00cc00" stroke-miterlimit="10" pointer-events="all"/></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file diff --git a/yaegi-internals/ex1_cfg_loop.drawio.svg b/yaegi-internals/ex1_cfg_loop.drawio.svg new file mode 100644 index 0000000..7928ec0 --- /dev/null +++ b/yaegi-internals/ex1_cfg_loop.drawio.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than diagrams.net --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="421px" height="145px" viewBox="-0.5 -0.5 421 145" content="<mxfile host="Electron" modified="2023-04-04T12:21:53.129Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.1.2 Chrome/106.0.5249.199 Electron/21.4.3 Safari/537.36" etag="r4TE3l_1ITMOUrcHC6Qx" version="21.1.2" type="device"> <diagram name="Page-1" id="xVztW_I66fIyG3nHzLhH"> <mxGraphModel dx="954" dy="727" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="kNLiaCNoJibRKC7dolPK-2" value="2: :=" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="120" y="90" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-6" value="6: &amp;gt;" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="240" y="90" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-17" value="10: call" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="360" y="140" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-24" value="13: call" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> <mxGeometry x="480" y="90" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-30" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#00CC00;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-2" target="kNLiaCNoJibRKC7dolPK-6" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="180" y="140" as="sourcePoint" /> <mxPoint x="230" y="90" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-32" value="" style="endArrow=classic;html=1;strokeColor=#FF0000;entryX=0;entryY=0;entryDx=0;entryDy=0;exitX=1;exitY=0;exitDx=0;exitDy=0;curved=1;" parent="1" source="kNLiaCNoJibRKC7dolPK-6" target="kNLiaCNoJibRKC7dolPK-24" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="290" y="410" as="sourcePoint" /> <mxPoint x="340" y="360" as="targetPoint" /> <Array as="points"> <mxPoint x="390" y="60" /> </Array> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-33" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#00CC00;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-6" target="kNLiaCNoJibRKC7dolPK-17" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="252" y="190" as="sourcePoint" /> <mxPoint x="290" y="238" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-34" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#00CC00;entryX=0;entryY=1;entryDx=0;entryDy=0;exitX=1;exitY=0;exitDx=0;exitDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-17" target="kNLiaCNoJibRKC7dolPK-24" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="420" y="140" as="sourcePoint" /> <mxPoint x="299" y="244" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="gsGOXgsebsyc2-BwZNvm-1" value="" style="endArrow=classic;html=1;strokeColor=#00CC00;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;curved=1;" edge="1" parent="1" source="kNLiaCNoJibRKC7dolPK-24" target="kNLiaCNoJibRKC7dolPK-2"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="421" y="154" as="sourcePoint" /> <mxPoint x="499" y="126" as="targetPoint" /> <Array as="points"> <mxPoint x="450" y="220" /> <mxPoint x="250" y="220" /> </Array> </mxGeometry> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs/><g><g id="cell-kNLiaCNoJibRKC7dolPK-2"><ellipse cx="30" cy="28" rx="30" ry="15" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 28px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">2: :=</div></div></div></foreignObject><text x="30" y="32" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">2: :=</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-6"><ellipse cx="150" cy="28" rx="30" ry="15" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 28px; margin-left: 121px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">6: ></div></div></div></foreignObject><text x="150" y="32" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">6: ></text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-17"><ellipse cx="270" cy="78" rx="30" ry="15" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 78px; margin-left: 241px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">10: call</div></div></div></foreignObject><text x="270" y="82" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">10: call</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-24"><ellipse cx="390" cy="28" rx="30" ry="15" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 28px; margin-left: 361px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">13: call</div></div></div></foreignObject><text x="390" y="32" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">13: call</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-30"><path d="M 60 28 L 113.63 28" fill="none" stroke="#00cc00" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 118.88 28 L 111.88 31.5 L 113.63 28 L 111.88 24.5 Z" fill="#00cc00" stroke="#00cc00" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-32"><path d="M 171.21 17.39 Q 270 -17 362.77 15.3" fill="none" stroke="#ff0000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 367.73 17.03 L 359.97 18.03 L 362.77 15.3 L 362.27 11.42 Z" fill="#ff0000" stroke="#ff0000" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-33"><path d="M 171.21 38.61 L 242.82 65.18" fill="none" stroke="#00cc00" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 247.74 67 L 239.96 67.85 L 242.82 65.18 L 242.39 61.29 Z" fill="#00cc00" stroke="#00cc00" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-34"><path d="M 291.21 67.39 L 362.82 40.82" fill="none" stroke="#00cc00" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 367.74 39 L 362.39 44.71 L 362.82 40.82 L 359.96 38.15 Z" fill="#00cc00" stroke="#00cc00" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-gsGOXgsebsyc2-BwZNvm-1"><path d="M 390 43 Q 330 143 230 143 Q 130 143 34.5 47.5" fill="none" stroke="#00cc00" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 30.79 43.79 L 38.22 46.27 L 34.5 47.5 L 33.27 51.22 Z" fill="#00cc00" stroke="#00cc00" stroke-miterlimit="10" pointer-events="all"/></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file diff --git a/yaegi-internals/ex1_raw_ast.drawio.svg b/yaegi-internals/ex1_raw_ast.drawio.svg new file mode 100644 index 0000000..a15f4f6 --- /dev/null +++ b/yaegi-internals/ex1_raw_ast.drawio.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than diagrams.net --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="471px" height="301px" viewBox="-0.5 -0.5 471 301" content="<mxfile host="Electron" modified="2023-04-04T09:52:49.799Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.1.2 Chrome/106.0.5249.199 Electron/21.4.3 Safari/537.36" etag="xPx_CSjU3CsP79y-tyBY" version="21.1.2" type="device"> <diagram name="Page-1" id="xVztW_I66fIyG3nHzLhH"> <mxGraphModel dx="954" dy="727" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="kNLiaCNoJibRKC7dolPK-1" value="1: stmt" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="230" y="30" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-2" value="2: :=" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="120" y="90" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-3" value="3: a" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="40" y="160" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-4" value="4: 3" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="120" y="160" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-5" value="5: if" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="230" y="90" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-6" value="6: &amp;gt;" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="200" y="160" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-7" value="7: a" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="120" y="230" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-8" value="8: 2" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="200" y="230" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-9" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-1" target="kNLiaCNoJibRKC7dolPK-5" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="260" y="390" as="sourcePoint" /> <mxPoint x="310" y="340" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-10" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-1" target="kNLiaCNoJibRKC7dolPK-2" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="270" y="70" as="sourcePoint" /> <mxPoint x="270" y="100" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-11" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-2" target="kNLiaCNoJibRKC7dolPK-4" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="249" y="66" as="sourcePoint" /> <mxPoint x="181" y="104" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-12" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-2" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="160" y="130" as="sourcePoint" /> <mxPoint x="80" y="160" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-13" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" target="kNLiaCNoJibRKC7dolPK-6" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="250" y="120" as="sourcePoint" /> <mxPoint x="270" y="100" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-14" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.65;entryY=0.033;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.3;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-6" target="kNLiaCNoJibRKC7dolPK-7" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="170" y="210" as="sourcePoint" /> <mxPoint x="240" y="170" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-15" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-6" target="kNLiaCNoJibRKC7dolPK-8" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="228" y="200" as="sourcePoint" /> <mxPoint x="169" y="241" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-16" value="9: stmt" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="280" y="160" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-17" value="10: call" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="280" y="230" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-18" value="11: print" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="220" y="300" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-19" value="12: &quot;ok&quot;" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="340" y="300" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-20" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.317;entryY=0.067;entryDx=0;entryDy=0;exitX=0.617;exitY=0.967;exitDx=0;exitDy=0;exitPerimeter=0;entryPerimeter=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-5" target="kNLiaCNoJibRKC7dolPK-16" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="260" y="130" as="sourcePoint" /> <mxPoint x="240" y="170" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-21" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-16" target="kNLiaCNoJibRKC7dolPK-17" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="277" y="129" as="sourcePoint" /> <mxPoint x="309" y="172" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-22" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0;entryDx=0;entryDy=0;exitX=0.383;exitY=1.033;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-17" target="kNLiaCNoJibRKC7dolPK-18" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="320" y="200" as="sourcePoint" /> <mxPoint x="320" y="240" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-23" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.333;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.65;exitY=1;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-17" target="kNLiaCNoJibRKC7dolPK-19" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="320" y="250" as="sourcePoint" /> <mxPoint x="281" y="294" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-24" value="13: call" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="360" y="90" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-25" value="14: print" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="360" y="160" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-26" value="15: &quot;bye&quot;" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="450" y="160" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-27" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0.317;entryY=0.067;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-1" target="kNLiaCNoJibRKC7dolPK-24" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="270" y="70" as="sourcePoint" /> <mxPoint x="270" y="100" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-28" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-24" target="kNLiaCNoJibRKC7dolPK-25" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="291" y="66" as="sourcePoint" /> <mxPoint x="389" y="102" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="kNLiaCNoJibRKC7dolPK-29" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=1;exitY=1;exitDx=0;exitDy=0;" parent="1" source="kNLiaCNoJibRKC7dolPK-24" target="kNLiaCNoJibRKC7dolPK-26" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="400" y="130" as="sourcePoint" /> <mxPoint x="400" y="170" as="targetPoint" /> </mxGeometry> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs/><g><g id="cell-kNLiaCNoJibRKC7dolPK-1"><ellipse cx="220" cy="15" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 15px; margin-left: 191px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">1: stmt</div></div></div></foreignObject><text x="220" y="19" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">1: stmt</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-2"><ellipse cx="110" cy="75" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 75px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">2: :=</div></div></div></foreignObject><text x="110" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">2: :=</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-3"><ellipse cx="30" cy="145" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 145px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">3: a</div></div></div></foreignObject><text x="30" y="149" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">3: a</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-4"><ellipse cx="110" cy="145" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 145px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">4: 3</div></div></div></foreignObject><text x="110" y="149" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">4: 3</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-5"><ellipse cx="220" cy="75" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 75px; margin-left: 191px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">5: if</div></div></div></foreignObject><text x="220" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">5: if</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-6"><ellipse cx="190" cy="145" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 145px; margin-left: 161px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">6: ></div></div></div></foreignObject><text x="190" y="149" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">6: ></text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-7"><ellipse cx="110" cy="215" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 215px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">7: a</div></div></div></foreignObject><text x="110" y="219" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">7: a</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-8"><ellipse cx="190" cy="215" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 215px; margin-left: 161px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">8: 2</div></div></div></foreignObject><text x="190" y="219" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">8: 2</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-9"><path d="M 220 30 L 220 53.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 220 58.88 L 216.5 51.88 L 220 53.63 L 223.5 51.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-10"><path d="M 198.79 25.61 L 136.74 61.22" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 132.18 63.84 L 136.51 57.32 L 136.74 61.22 L 140 63.39 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-11"><path d="M 110 90 L 110 123.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 110 128.88 L 106.5 121.88 L 110 123.63 L 113.5 121.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-12"><path d="M 88.79 85.61 L 44.71 125.71" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 40.83 129.25 L 43.65 121.95 L 44.71 125.71 L 48.36 127.13 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-13"><path d="M 210 90 L 192.85 124.3" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 190.5 129 L 190.5 121.17 L 192.85 124.3 L 196.76 124.3 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-14"><path d="M 178 160 L 124.23 197.36" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 119.92 200.35 L 123.67 193.48 L 124.23 197.36 L 127.66 199.23 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-15"><path d="M 190 160 L 190 193.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 190 198.88 L 186.5 191.88 L 190 193.63 L 193.5 191.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-16"><ellipse cx="270" cy="145" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 145px; margin-left: 241px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">9: stmt</div></div></div></foreignObject><text x="270" y="149" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">9: stmt</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-17"><ellipse cx="270" cy="215" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 215px; margin-left: 241px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">10: call</div></div></div></foreignObject><text x="270" y="219" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">10: call</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-18"><ellipse cx="210" cy="285" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 285px; margin-left: 181px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">11: print</div></div></div></foreignObject><text x="210" y="289" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">11: print</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-19"><ellipse cx="330" cy="285" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 285px; margin-left: 301px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">12: "ok"</div></div></div></foreignObject><text x="330" y="289" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">12: "ok"</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-20"><path d="M 227.02 89.01 L 255.22 126.9" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 258.35 131.11 L 251.37 127.59 L 255.22 126.9 L 256.98 123.41 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-21"><path d="M 270 160 L 270 193.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 270 198.88 L 266.5 191.88 L 270 193.63 L 273.5 191.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-22"><path d="M 262.98 230.99 L 234.97 269.25" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 231.87 273.49 L 233.18 265.78 L 234.97 269.25 L 238.83 269.91 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-23"><path d="M 279 230 L 315.42 265.55" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 319.18 269.22 L 311.73 266.83 L 315.42 265.55 L 316.62 261.82 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-24"><ellipse cx="350" cy="75" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 75px; margin-left: 321px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">13: call</div></div></div></foreignObject><text x="350" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">13: call</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-25"><ellipse cx="350" cy="145" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 145px; margin-left: 321px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">14: print</div></div></div></foreignObject><text x="350" y="149" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">14: print</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-26"><ellipse cx="440" cy="145" rx="30" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 145px; margin-left: 411px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">15: "bye"</div></div></div></foreignObject><text x="440" y="149" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">15: "bye"</text></switch></g></g><g id="cell-kNLiaCNoJibRKC7dolPK-27"><path d="M 241.21 25.61 L 333.05 59.79" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 337.97 61.62 L 330.19 62.46 L 333.05 59.79 L 332.63 55.9 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-28"><path d="M 350 90 L 350 123.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 350 128.88 L 346.5 121.88 L 350 123.63 L 353.5 121.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g><g id="cell-kNLiaCNoJibRKC7dolPK-29"><path d="M 371.21 85.61 L 434.65 126.55" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 439.06 129.39 L 431.28 128.54 L 434.65 126.55 L 435.08 122.66 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file diff --git a/yaegi-internals/frame1.drawio.svg b/yaegi-internals/frame1.drawio.svg new file mode 100644 index 0000000..eaa406d --- /dev/null +++ b/yaegi-internals/frame1.drawio.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than diagrams.net --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="602px" height="291px" viewBox="-0.5 -0.5 602 291" content="<mxfile host="Electron" modified="2023-05-02T15:37:09.311Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.2.1 Chrome/112.0.5615.87 Electron/24.1.2 Safari/537.36" etag="9SFcaECSP9dacijr0PgM" version="21.2.1" type="device"> <diagram name="Page-1" id="5na_llSKl-pBBE5rP9AI"> <mxGraphModel dx="954" dy="727" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="2HcqKHcNLJ_RsXilhcFv-46" value="frame 2" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="460" y="170" width="90" height="50" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-33" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="220" y="280" as="sourcePoint" /> <mxPoint x="460" y="170" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-1" value="data ptr" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="120" y="120" width="50" height="20" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-2" value="type ptr" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="170" y="120" width="50" height="20" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-5" value="" style="group" parent="1" vertex="1" connectable="0"> <mxGeometry x="120" y="160" width="100" height="20" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-3" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="2HcqKHcNLJ_RsXilhcFv-5" vertex="1"> <mxGeometry width="50" height="20" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-4" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="2HcqKHcNLJ_RsXilhcFv-5" vertex="1"> <mxGeometry x="50" width="50" height="20" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-10" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=1;entryY=1;entryDx=0;entryDy=0;" parent="2HcqKHcNLJ_RsXilhcFv-5" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint y="120" as="sourcePoint" /> <mxPoint y="-20" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-6" value="" style="group" parent="1" vertex="1" connectable="0"> <mxGeometry x="120" y="200" width="100" height="20" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-7" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="2HcqKHcNLJ_RsXilhcFv-6" vertex="1"> <mxGeometry width="50" height="20" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-8" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="2HcqKHcNLJ_RsXilhcFv-6" vertex="1"> <mxGeometry x="50" width="50" height="20" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-9" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=1;entryY=1;entryDx=0;entryDy=0;" parent="1" target="2HcqKHcNLJ_RsXilhcFv-2" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="220" y="280" as="sourcePoint" /> <mxPoint x="420" y="290" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-11" value="" style="endArrow=none;dashed=1;html=1;rounded=0;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="120" y="280" as="sourcePoint" /> <mxPoint x="220" y="280" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-12" value="" style="shape=curlyBracket;whiteSpace=wrap;html=1;rounded=1;flipH=1;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;size=0.5;" parent="1" vertex="1"> <mxGeometry x="230" y="120" width="20" height="30" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-13" value="m return parameters" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="250" y="120" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-14" value="0" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="60" y="115" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-15" value="m" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="60" y="155" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-16" value="" style="shape=curlyBracket;whiteSpace=wrap;html=1;rounded=1;flipH=1;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;size=0.5;" parent="1" vertex="1"> <mxGeometry x="230" y="160" width="20" height="30" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-18" value="n input parameters" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="250" y="160" width="110" height="30" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-19" value="m+n" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="60" y="195" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-20" value="" style="shape=curlyBracket;whiteSpace=wrap;html=1;rounded=1;flipH=1;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;size=0.5;" parent="1" vertex="1"> <mxGeometry x="230" y="200" width="20" height="80" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-22" value="m+n+p" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="60" y="270" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-23" value="p local variables" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="250" y="200" width="110" height="30" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-24" value="" style="shape=curlyBracket;whiteSpace=wrap;html=1;rounded=1;labelPosition=left;verticalLabelPosition=middle;align=right;verticalAlign=middle;direction=south;" parent="1" vertex="1"> <mxGeometry x="120" y="90" width="100" height="20" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-25" value="reflect.Value" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="140" y="70" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-28" value="function frame" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="130" y="300" width="80" height="30" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-29" value="global frame" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="460" y="70" width="90" height="50" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-30" value="frame 1" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="460" y="120" width="90" height="50" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-32" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=0;exitX=1;exitY=0;exitDx=0;exitDy=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" source="2HcqKHcNLJ_RsXilhcFv-2" target="2HcqKHcNLJ_RsXilhcFv-30" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="350" y="340" as="sourcePoint" /> <mxPoint x="400" y="290" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-34" value="stack goroutine 1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="460" y="330" width="80" height="30" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-35" value="frame i" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="460" y="260" width="90" height="50" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-36" value="" style="endArrow=none;dashed=1;html=1;rounded=0;exitX=0;exitY=0;exitDx=0;exitDy=0;" parent="1" source="2HcqKHcNLJ_RsXilhcFv-35" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="350" y="340" as="sourcePoint" /> <mxPoint x="460" y="220" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-37" value="" style="endArrow=none;dashed=1;html=1;rounded=0;exitX=1;exitY=0;exitDx=0;exitDy=0;" parent="1" source="2HcqKHcNLJ_RsXilhcFv-35" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="549.17" y="250" as="sourcePoint" /> <mxPoint x="549" y="220" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-38" value="frame 2&#39;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="570" y="180" width="90" height="50" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-39" value="frame j&#39;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="570" y="260" width="90" height="50" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-40" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0;entryY=1;entryDx=0;entryDy=0;exitX=0;exitY=0;exitDx=0;exitDy=0;" parent="1" source="2HcqKHcNLJ_RsXilhcFv-39" target="2HcqKHcNLJ_RsXilhcFv-38" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="560" y="240" as="sourcePoint" /> <mxPoint x="559.17" y="180" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-41" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=1;entryY=0;entryDx=0;entryDy=0;exitX=1;exitY=1;exitDx=0;exitDy=0;" parent="1" source="2HcqKHcNLJ_RsXilhcFv-38" target="2HcqKHcNLJ_RsXilhcFv-39" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="580" y="270" as="sourcePoint" /> <mxPoint x="580" y="245" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-42" value="stack goroutine 2" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="575" y="330" width="80" height="30" as="geometry" /> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-43" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0;entryY=1;entryDx=0;entryDy=0;exitX=0;exitY=0;exitDx=0;exitDy=0;" parent="1" source="2HcqKHcNLJ_RsXilhcFv-38" target="2HcqKHcNLJ_RsXilhcFv-30" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="580" y="270" as="sourcePoint" /> <mxPoint x="580" y="245" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="2HcqKHcNLJ_RsXilhcFv-44" value="" style="endArrow=none;dashed=1;html=1;rounded=0;entryX=0;entryY=1;entryDx=0;entryDy=0;exitX=1;exitY=0;exitDx=0;exitDy=0;" parent="1" source="2HcqKHcNLJ_RsXilhcFv-38" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="660" y="185" as="sourcePoint" /> <mxPoint x="550" y="170" as="targetPoint" /> </mxGeometry> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs/><g><g id="cell-2HcqKHcNLJ_RsXilhcFv-46"><rect x="400" y="100" width="90" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 125px; margin-left: 401px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">frame 2</div></div></div></foreignObject><text x="445" y="129" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">frame 2</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-33"><path d="M 160 210 L 400 100" fill="none" stroke="#6c8ebf" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-1"><rect x="60" y="50" width="50" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 60px; margin-left: 61px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">data ptr</div></div></div></foreignObject><text x="85" y="64" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">data ptr</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-2"><rect x="110" y="50" width="50" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 60px; margin-left: 111px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">type ptr</div></div></div></foreignObject><text x="135" y="64" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">type ptr</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-3"><rect x="60" y="90" width="50" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-4"><rect x="110" y="90" width="50" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-10"><path d="M 60 210 L 60 70" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-7"><rect x="60" y="130" width="50" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-8"><rect x="110" y="130" width="50" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-9"><path d="M 160 210 L 160 70" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-11"><path d="M 60 210 L 160 210" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-12"><path d="M 190 50 L 185 50 Q 180 50 180 57.5 L 180 61.25 Q 180 65 175 65 L 172.5 65 Q 170 65 175 65 L 177.5 65 Q 180 65 180 72.5 L 180 76.25 Q 180 80 185 80 L 190 80" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="translate(180,0)scale(-1,1)translate(-180,0)" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-13"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 118px; height: 1px; padding-top: 65px; margin-left: 192px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">m return parameters</div></div></div></foreignObject><text x="192" y="69" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">m return parameters</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-14"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">0</div></div></div></foreignObject><text x="30" y="64" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">0</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-15"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 100px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">m</div></div></div></foreignObject><text x="30" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">m</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-16"><path d="M 190 90 L 185 90 Q 180 90 180 97.5 L 180 101.25 Q 180 105 175 105 L 172.5 105 Q 170 105 175 105 L 177.5 105 Q 180 105 180 112.5 L 180 116.25 Q 180 120 185 120 L 190 120" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="translate(180,0)scale(-1,1)translate(-180,0)" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-18"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 108px; height: 1px; padding-top: 105px; margin-left: 192px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">n input parameters</div></div></div></foreignObject><text x="192" y="109" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">n input parameters</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-19"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 140px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">m+n</div></div></div></foreignObject><text x="30" y="144" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">m+n</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-20"><path d="M 190 130 L 185 130 Q 180 130 180 140 L 180 160 Q 180 170 175 170 L 172.5 170 Q 170 170 175 170 L 177.5 170 Q 180 170 180 180 L 180 200 Q 180 210 185 210 L 190 210" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="translate(180,0)scale(-1,1)translate(-180,0)" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-22"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 215px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">m+n+p</div></div></div></foreignObject><text x="30" y="219" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">m+n+p</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-23"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 108px; height: 1px; padding-top: 145px; margin-left: 192px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">p local variables</div></div></div></foreignObject><text x="192" y="149" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">p local variables</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-24"><path d="M 120 -20 L 115 -20 Q 110 -20 110 -10 L 110 20 Q 110 30 105 30 L 102.5 30 Q 100 30 105 30 L 107.5 30 Q 110 30 110 40 L 110 70 Q 110 80 115 80 L 120 80" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" transform="rotate(90,110,30)" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-25"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 15px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">reflect.Value</div></div></div></foreignObject><text x="110" y="19" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">reflect.Va...</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-28"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 245px; margin-left: 71px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">function frame</div></div></div></foreignObject><text x="110" y="249" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">function frame</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-29"><rect x="400" y="0" width="90" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 25px; margin-left: 401px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">global frame</div></div></div></foreignObject><text x="445" y="29" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">global frame</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-30"><rect x="400" y="50" width="90" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 75px; margin-left: 401px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">frame 1</div></div></div></foreignObject><text x="445" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">frame 1</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-32"><path d="M 160 50 L 400 50" fill="none" stroke="#6c8ebf" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-34"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 275px; margin-left: 401px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">stack goroutine 1</div></div></div></foreignObject><text x="440" y="279" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">stack gorouti...</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-35"><rect x="400" y="190" width="90" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 215px; margin-left: 401px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">frame i</div></div></div></foreignObject><text x="445" y="219" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">frame i</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-36"><path d="M 400 190 L 400 150" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-37"><path d="M 490 190 L 489 150" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-38"><rect x="510" y="110" width="90" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 135px; margin-left: 511px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">frame 2'</div></div></div></foreignObject><text x="555" y="139" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">frame 2'</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-39"><rect x="510" y="190" width="90" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 215px; margin-left: 511px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">frame j'</div></div></div></foreignObject><text x="555" y="219" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">frame j'</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-40"><path d="M 510 190 L 510 160" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-41"><path d="M 600 160 L 600 190" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-42"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 275px; margin-left: 516px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">stack goroutine 2</div></div></div></foreignObject><text x="555" y="279" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">stack gorouti...</text></switch></g></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-43"><path d="M 510 110 L 400 100" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/></g><g id="cell-2HcqKHcNLJ_RsXilhcFv-44"><path d="M 600 110 L 490 100" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file diff --git a/yaegi-internals/index.html b/yaegi-internals/index.html new file mode 100644 index 0000000..7981524 --- /dev/null +++ b/yaegi-internals/index.html @@ -0,0 +1,390 @@ +<title>Yaegi Internals</title> +<!-- generated by build.sh. DO NOT EDIT. --> +<meta charset="UTF-8"> +<meta name="viewport" content="width=device-width, initial-scale=1"> +<style> + body { + max-width: 45rem; + margin: auto; + padding: 0.5em; + text-align: justify; + } + h1 { text-align: center } + pre { + border: 1px solid; + padding: 1ch; + border-radius: 5px; + overflow: auto; + background-color: #eee; + } +</style> + +<a href="..">Marc's Programming Notes</a><hr> +<h1 id="yaegi-internals">Yaegi internals</h1> +<p><a href="https://github.com/traefik/yaegi">Yaegi</a> is an +interpreter of the Go language written in Go. This project was started +in Traefik-Labs initially to provide a simple and practical embedded +plugin engine for the traefik reverse proxy. Now, more than 200 plugins +contributed by the community are listed on the public catalog at <a +href="https://plugins.traefik.io">plugins.traefik.io</a>. The use of +yaegi extends also to other domains, for example <a +href="https://github.com/xo/xo">databases</a>, <a +href="https://github.com/slok/sloth">observability</a>, <a +href="https://github.com/cyberark/kubesploit">container security</a> and +many <a +href="https://github.com/traefik/yaegi/network/dependents?package_id=UGFja2FnZS0yMjc1NTQ3MjIy">others</a>.</p> +<p>Yaegi is lean and mean, as it delivers in a single package, with no +external dependency, a complete Go interpreter, compliant with the <a +href="https://go.dev/ref/spec">Go specification</a>. Lean, but also +mean: its code is dense, complex, not always idiomatic, and sometimes +maybe hard to understand.</p> +<p>This document is here to address that. In the following, after +getting an overview, we look under the hood, explore the internals and +discuss the design. Our aim is to provide the essential insights, +clarify the architecture and the code organization. But first, the +overview.</p> +<h2 id="overview-of-architecture">Overview of architecture</h2> +<p>Let’s see what happens inside yaegi when one executes the following +line:</p> +<div class="sourceCode" id="cb1"><pre class="sourceCode go"><code class="sourceCode go"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>interp<span class="op">.</span>Eval<span class="op">(</span><span class="st">`print("hello", 2+3)`</span><span class="op">)</span></span></code></pre></div> +<p>The following figure 1 displays the main steps of evaluation:</p> +<figure> +<img src="yaegi_internals_fig1.drawio.svg" +alt="figure 1: steps of evaluation" /> +<figcaption aria-hidden="true">figure 1: steps of +evaluation</figcaption> +</figure> +<ol type="1"> +<li><p>The <em>scanner</em> (provided by the <a +href="https://pkg.go.dev/go/scanner">go/scanner</a> package) transforms +a stream of characters (the source code) into a stream of tokens, +through a <a +href="https://en.wikipedia.org/wiki/Lexical_analysis">lexical +analysis</a> step.</p></li> +<li><p>The <em>parser</em> (provided by the <a +href="https://pkg.go.dev/go/parser">go/parser</a> package) transforms +the stream of tokens into an <a +href="https://en.wikipedia.org/wiki/Abstract_syntax_tree">abstract +syntax tree</a> or AST, through a <a +href="https://en.wikipedia.org/wiki/Syntax_analysis">syntax analysis</a> +step.</p></li> +<li><p>The <em>analyser</em> (implemented in the <a +href="https://pkg.go.dev/github.com/traefik/yaegi/interp">yaegi/interp</a> +package) performs the checks and creation of type, constant, variable +and function symbols. It also computes the <a +href="https://en.wikipedia.org/wiki/Control-flow_graph">control-flow +graphs</a> and memory allocations for symbols, through <a +href="https://en.wikipedia.org/wiki/Semantic_analysis_(compilers)">semantic +analysis</a> steps. All those metadata are obtained from and stored to +the nodes of the AST, making it annotated.</p></li> +<li><p>The <em>generator</em> (implemented in the <a +href="https://pkg.go.dev/github.com/traefik/yaegi/interp">yaegi/interp</a> +package) reads the annotated AST and produces code intructions to be +executed, through a <a +href="https://en.wikipedia.org/wiki/Code_generation_%28compiler%29">code +generation</a> step.</p></li> +<li><p>The <em>executor</em> (implemented in the <a +href="https://pkg.go.dev/github.com/traefik/yaegi/interp">yaegi/interp</a> +package) runs the code instructions in the context of the +interpreter.</p></li> +</ol> +<p>The interpreter is designed as a simple compiler, except that the +code is generated into memory instead of object files, and with an +executor module to run the specific instruction format.</p> +<p>We won’t spend more details on the scanner and the parser, both +provided by the standard library, and instead examine directly the +analyser.</p> +<h2 id="semantic-analysis">Semantic analysis</h2> +<p>The analyser performs the semantic analysis of the program to +interpret. This is done in several steps, all consisting of reading from +and writing to the AST, so we first examine the details and dynamics of +our AST representation.</p> +<h3 id="ast-dynamics">AST dynamics</h3> +<p>Hereafter stands the most important data structure of any compiler, +interpreter or other language tool, and the function to use it +(extracted from <a +href="https://github.com/traefik/yaegi/blob/8de3add6faf471a807182c7b8198fe863debc9d8/interp/interp.go#L284-L296">here</a>).</p> +<div class="sourceCode" id="cb2"><pre class="sourceCode go"><code class="sourceCode go"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="co">// node defines a node of a (abstract syntax) tree.</span></span> +<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="kw">type</span> node <span class="kw">struct</span> <span class="op">{</span></span> +<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> <span class="co">// Node children</span></span> +<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> child <span class="op">[]*</span>node</span> +<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="co">// Node metadata</span></span> +<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> <span class="op">...</span></span> +<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span> +<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a></span> +<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a><span class="co">// walk traverses AST n in depth first order, invoking in function</span></span> +<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a><span class="co">// at node entry and out function at node exit.</span></span> +<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a><span class="kw">func</span> <span class="op">(</span>n <span class="op">*</span>node<span class="op">)</span> walk<span class="op">(</span>in <span class="kw">func</span><span class="op">(</span>n <span class="op">*</span>node<span class="op">)</span> <span class="dt">bool</span><span class="op">,</span> out <span class="kw">func</span><span class="op">(</span>n <span class="op">*</span>node<span class="op">))</span> <span class="op">{</span></span> +<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> in <span class="op">!=</span> <span class="ot">nil</span> <span class="op">&&</span> <span class="op">!</span>in<span class="op">(</span>n<span class="op">)</span> <span class="op">{</span></span> +<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span></span> +<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span> +<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a> <span class="cf">for</span> _<span class="op">,</span> child <span class="op">:=</span> <span class="kw">range</span> n<span class="op">.</span>child <span class="op">{</span></span> +<span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a> child<span class="op">.</span>Walk<span class="op">(</span>in<span class="op">,</span> out<span class="op">)</span></span> +<span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span> +<span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> out <span class="op">!=</span> <span class="ot">nil</span> <span class="op">{</span></span> +<span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a> out<span class="op">(</span>n<span class="op">)</span></span> +<span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span> +<span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div> +<p>The above code is deceptively simple. As in many complex systems, an +important part of the signification is carried by the relationships +between the elements and the patterns they form. It’s easier to +understand it by displaying the corresponding graph and consider the +system as a whole. We can do that using a simple example:</p> +<div class="sourceCode" id="cb3"><pre class="sourceCode go"><code class="sourceCode go"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a>a <span class="op">:=</span> <span class="dv">3</span></span> +<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="cf">if</span> a <span class="op">></span> <span class="dv">2</span> <span class="op">{</span></span> +<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a> <span class="bu">print</span><span class="op">(</span><span class="st">"ok"</span><span class="op">)</span></span> +<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span> +<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a><span class="bu">print</span><span class="op">(</span><span class="st">"bye"</span><span class="op">)</span></span></code></pre></div> +<p>The corresponding AST is:</p> +<figure> +<img src="ex1_raw_ast.drawio.svg" alt="figure 2: a raw AST" /> +<figcaption aria-hidden="true">figure 2: a raw AST</figcaption> +</figure> +<p>This is the raw AST, with no annotations, as obtained from the +parser. Each node contains an index number (for labelling purpose only), +and the node type, computed by the parser from the set of Go grammar +rules (i.e. “stmt” for “list of <a +href="https://go.dev/ref/spec#Statements">statements</a>”, “call” for +“call <a href="https://go.dev/ref/spec#Expressions">expression</a>”, …). +We also recognize the source tokens as literal values in leaf +locations.</p> +<p>Walking the tree consists in visiting the nodes starting from the +root (node 1), in their numbering order (here from 1 to 15): depth first +(the children before the siblings) and from left to right. At each node, +a callback <code>in</code> is invoked at entry (pre-processing) and a +callback <code>out</code> at exit (post-processing).</p> +<p>When the <code>in</code> callback executes, only the information +computed in the sub-trees in the left of the node is available, in +addition to the pre-processing information computed in the node +ancestors. The <code>in</code> callback returns a boolean. If the result +is false, the node sub-tree is skipped, allowing to short-cut +processing, for example to avoid to dive in function bodies and process +only function signatures.</p> +<p>When the <code>out</code> callback executes, the results computed on +the whole descendant sub-trees are available, which is useful for +example to compute the size of a composite object defined accross nested +structures. In the absence of post-processing, multiple tree walks are +necessary to achieve the same result.</p> +<p>A semantic analysis step is therefore simply a tree walk with the +right callbacks. In the case of our interpreter, we have two tree walks +to perform: the globals and types analysis in <a +href="https://github.com/traefik/yaegi/blob/master/interp/gta.go">interp/gta.go</a> +and the control-flow graphs analysis in <a +href="https://github.com/traefik/yaegi/blob/master/interp/cfg.go">interp/cfg.go</a>. +In both files, notice the call to <code>root.Walk</code>.</p> +<p>Note: we have chosen to represent the AST as a uniform node structure +as opposed to the <a href="https://pkg.go.dev/go/ast#Node">ast.Node</a> +interface in the Go standard library, implemented by specialized types +for all the node kinds. The main reason is that the tree walk method <a +href="https://pkg.go.dev/go/ast#Inspect">ast.Inspect</a> only permits a +pre-processing callback, not a post-processing one, required for several +compiling steps. It also seemed simpler at the time to start with this +uniform structure, and we ended up sticking with it.</p> +<h3 id="globals-and-types-analysis">Globals and types analysis</h3> +<p>Our first operation on the AST is to check and register all the +components of the program declared at global level. This is a partial +analysis, concerned only about declarations and not function +implementations.</p> +<p>This step is necessary because in Go, at global level, symbols can be +used before being declared (as opposed to Go function bodies, or in C in +general, where use before declaration is simply forbidden in strict +mode).</p> +<p>Allowing out of order symbols is what permits the code to be +scattered arbitrarily amongst several files in packages without more +constraints. It is indeed an important feature to let the programer +organize her code as she wants.</p> +<p>This step, implemented in <a +href="https://github.com/traefik/yaegi/blob/master/interp/gta.go">interp/gta.go</a>, +consists in performing a tree walk with only a pre-processing callback +(no <code>out</code> function is passed). There are two +particularities:</p> +<p>The first is the multiple-pass iterative walk. Indeed, in a first +global pass, instead of failing with an error whenever an incomplete +definition is met, the reference to the failing sub-tree is kept in a +list of nodes to be retried, and the walk finishes going over the whole +tree. Then, all the problematic sub-trees are iteratively retried until +all the nodes have been defined, or as long as there is progress. That +is, if two subsequent iterations lead to the exact same state, it is a +hint that progress is not being made and it would result in an infinite +loop, at which point yaegi just stops with an error.</p> +<p>The second particularity is that despite being in a partial analysis +step, a full interpretation can still be necessary on an expression +sub-tree if this one serves to implement a global type definition. For +example if an array size is computed by an expression as in the +following valid Go declarations:</p> +<div class="sourceCode" id="cb4"><pre class="sourceCode go"><code class="sourceCode go"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="kw">const</span> <span class="op">(</span></span> +<span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a> prefix <span class="op">=</span> <span class="st">"/usr"</span></span> +<span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a> path <span class="op">=</span> prefix <span class="op">+</span> <span class="st">"/local/bin"</span></span> +<span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a><span class="op">)</span></span> +<span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a><span class="kw">var</span> a <span class="op">[</span><span class="bu">len</span><span class="op">(</span>prefix<span class="op">+</span>path<span class="op">)</span> <span class="op">+</span> <span class="dv">2</span><span class="op">]</span><span class="dt">int</span></span></code></pre></div> +<p>A paradox is that the compiler needs an interpreter to perform the +type analysis! Indeed, in the example above, <code>[16]int</code> +(because <code>len(prefix+path) + 2 = 16</code>) is a specific type in +itself, distinct from e.g. <code>[14]int</code>. Which means that even +though we are only at the types analysis phase we already must be able +to compute the <code>len(prefix+path) + 2</code> expression. In the C +language it is one of the roles of the <a +href="https://gcc.gnu.org/onlinedocs/cpp/">pre-processor</a>, which +means the compiler itself does not need to be able to achieve that. Here +in Go, the specification forces the compiler implementor to provide and +use early-on the mechanics involved above, which is usually called +constant folding optimisation. It is therefore implemented both within +the standard gc, and whithin yaegi. The same kind of approach is pushed +to its paroxysm in the <a href="https://ziglang.org">Zig language</a> +with its <a +href="https://ziglang.org/documentation/master/#comptime">comptime</a> +keyword.</p> +<h3 id="control-flow-graphs">Control-flow graphs</h3> +<p>After GTA, all the global symbols are properly defined no matter +their declaration order. We can now proceed with the full code analysis, +which will be performed by a single tree walk in <a +href="https://github.com/traefik/yaegi/blob/master/interp/cfg.go">interp/cfg.go</a>.</p> +<p>Both pre-processing and post-processing callbacks are provided to the +walk function. Despite being activated in a single pass, multiple kinds +of data processing are executed:</p> +<ul> +<li><p>Types checking and creation. Started in GTA, it is now completed +also in all function bodies.</p></li> +<li><p>Analysis of variable scoping: scope levels are opened in +pre-processing and closed in post-processing, as the nesting of scope +reflects the AST structure.</p></li> +<li><p>Precise computing of object sizes and locations.</p></li> +<li><p>Identification and ordering of actions.</p></li> +</ul> +<p>The last point is critical for code generation. It consists in the +production of control-flow graphs. CFGs are usually represented in the +form of an intermediate representation (IR), which really is a +simplified machine independent instruction set, as in the <a +href="https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html">GCC GIMPLE</a>, +the <a href="https://llvm.org/docs/LangRef.html">LLVM IR</a> or the <a +href="https://github.com/golang/go/blob/bf48163e8f2b604f3b9e83951e331cd11edd8495/src/cmd/compile/internal/ssa/README.md">SSA</a> +form in the Go compiler. In yaegi, no IR is produced, only AST +annotations are used.</p> +<p>Let’s use our previous example to explain:</p> +<figure> +<img src="ex1_ast_cfg.drawio.svg" alt="figure 3: CFG is in AST" /> +<figcaption aria-hidden="true">figure 3: CFG is in AST</figcaption> +</figure> +<p>In the AST, the nodes relevant to the CFG are the <em>action</em> +nodes (in blue), that is the nodes referring to an arithmetic or a logic +operation, a function call or a memory operation (assigning a variable, +accessing an array entry, …).</p> +<p>Building the CFG consists in identifying action nodes and then find +their successor (to be stored in node fields <code>tnext</code> and +<code>fnext</code>). An action node has one successor in the general +case (shown with a green arrow), or two if the action is associated to a +conditional branch (green arrow if the test is true, red arrow +otherwise).</p> +<p>The rules to determine the successor of an action node are inherent +to the properties of its neighbours (ancestors, siblings and +descendants). For example, in the <code>if</code> sub-tree (nodes 5 to +12), the first action to execute is the condition test, that is, the +first action in the condition sub-tree, here the node 6. This action +will have two alternative successors: one to execute if the test is +true, the other if not. The <em>true</em> successor will be the first +action in the second child sub-tree of the <code>if</code> node, +describing the <em>true</em> branch (this sub-tree root is node 9, and +first action 10). As there is no <code>if</code> <em>false</em> branch +in our example, the next action of the whole <code>if</code> sub-tree is +the first action in the <code>if</code> sibling sub-tree, here the node +13. This node will be therefore the <em>false</em> successor, the first +action to execute when the <code>if</code> condition fails. Finally the +node 13 is also the successor of the <em>true</em> branch, the node 10. +The corresponding implementation is located in a <a +href="https://github.com/traefik/yaegi/blob/8de3add6faf471a807182c7b8198fe863debc9d8/interp/cfg.go#L1608-L1624">block +of 16 lines</a> in the post-processing CFG callback. Note that the same +code also performs dead branch elimination and condition validity +checking. At this stage, in terms of Control Flow, our AST example can +now be seen as a simpler representation, such as the following.</p> +<figure> +<img src="ex1_cfg.drawio.svg" alt="figure 4: the same CFG isolated" /> +<figcaption aria-hidden="true">figure 4: the same CFG +isolated</figcaption> +</figure> +<p>In our example, the action nodes composing the CFG can do the +following kind of operations: - defining variables in memory and +assigning values to them - performing arithmetic or logical operations - +conditional branching - function calling</p> +<p>Adding the capacity to jump to a <em>backward</em> location (where +destination node index is inferior to source’s one, an arrow from right +to left), thus allowing <em>loops</em>, makes the action set to become +<a href="https://en.wikipedia.org/wiki/Turing_completeness">Turing +complete</a>, implementing a universal computing machine.</p> +<figure> +<img src="ex1_cfg_loop.drawio.svg" alt="figure 5: a CFG with a loop" /> +<figcaption aria-hidden="true">figure 5: a CFG with a loop</figcaption> +</figure> +<p>The character of universality here lies in the cyclic nature of the +control-flow graph (remark that <code>if</code> statement graphs, +although appearing cyclic, are not, because the conditional branches are +mutually exclusives).</p> +<p>This is not just theoretical. For example, forbidding backward jumps +was crucial in the design of the Linux <a +href="https://www.kernel.org/doc/html/latest/bpf/verifier.html">eBPF +verifier</a>, in order to let user provided (therefore untrusted) +snippets execute in a kernel system privileged environment and guarantee +no infinite loops.</p> +<h2 id="code-generation-and-execution">Code generation and +execution</h2> +<p>The compiler implemented in yaegi targets the Go runtime itself, not +a particular hardware architecture. For each action node in the CFG a +corresponding closure is generated. The main benefits are: - +Portability: the generated code runs on any platform where Go is +supported. - Interoperability: the objects produced by the interpreter +are directly usable by the host program in the form of reflect values. - +The memory management in particular the garbage collector, is provided +by the runtime, and applies also to the values created by the +interpreter. - The support of runtime type safety, slices, maps, +channels, goroutines is also provided by the runtime.</p> +<p>The action templates are located in <a +href="https://github.com/traefik/yaegi/blob/master/interp/run.go">interp/run.go</a> +and <a +href="https://github.com/traefik/yaegi/blob/master/interp/op.go">interp/op.go</a>. +Generating closures allows to optimize all the cases where a constant is +used (an operation involving a constant and a variable is cheaper and +faster than the same operation involving two variables). It also permits +to hard-code the control-flow graph, that is to pre-define the next +instruction to execute and avoid useless branch tests.</p> +<p>The pseudo architecture targeted by the interpreter is in effect a +virtual <a href="https://en.wikipedia.org/wiki/Stack_machine">stack +machine</a> where the memory is represented as slices of Go reflect +values, as shown in the following figure, and where the instructions are +represented directly by the set of action nodes (the CFG) in the AST. +Those atomic instructions, also called <em>builtins</em>, are sligthly +higher level than a real hardware instruction set, because they operate +directly on Go interfaces (more precisely their reflect representation), +hiding a lot of low level processing and subtleties provided by the Go +runtime.</p> +<figure> +<img src="frame1.drawio.svg" alt="figure 6: frame organization" /> +<figcaption aria-hidden="true">figure 6: frame organization</figcaption> +</figure> +<p>The memory management performed by the interpreter consists to create +a global frame at a new session (the top of the stack), populated with +all global values (constants, types, variables and functions). At each +new interpreted function call, a new frame is pushed on the stack, +containing the values for all the return value, input parameters and +local variables of the function.</p> +<h2 id="conclusion">Conclusion</h2> +<p>We have described the general architecture of a Go interpreter, +reusing the existing Go scanner and parser. We have focused on the +semantic analysis, which is based on AST annotations, up to the +control-flow graph and code generation. This design leads to a +consistent and concise compiler suitable for an embedded interpreter. We +have also provided a succint overview of the virtual stack machine on +top of the Go runtime, leveraging on the reflection layer provided by +the Go standard library.</p> +<p>We can now evolve this design to address different target +architectures, for example a more efficient virtual machine, already in +the works.</p> +<p>Some parts of yaegi have not been detailed yet and will be addressed +in a next article:</p> +<ul> +<li>Integration with pre-compiled packages</li> +<li>Go Generics</li> +<li>Recursive types</li> +<li>Interfaces and methods</li> +<li>Virtualization and sandboxing</li> +<li>REPL and interactive use</li> +</ul> +<hr>From: Marc Vertes, 03 may 2023 diff --git a/yaegi-internals/meta.sh b/yaegi-internals/meta.sh new file mode 100644 index 0000000..4eef2a2 --- /dev/null +++ b/yaegi-internals/meta.sh @@ -0,0 +1,4 @@ +blog_title="Marc's Programming Notes" +title="Yaegi Internals" +author="Marc Vertes" +date="03 may 2023" diff --git a/yaegi-internals/readme.md b/yaegi-internals/readme.md new file mode 100644 index 0000000..efa251d --- /dev/null +++ b/yaegi-internals/readme.md @@ -0,0 +1,405 @@ +# Yaegi internals + +[Yaegi] is an interpreter of the Go language written in Go. This project +was started in Traefik-Labs initially to provide a simple and practical +embedded plugin engine for the traefik reverse proxy. Now, more than +200 plugins contributed by the community are listed on the public +catalog at [plugins.traefik.io]. The use of yaegi extends also to other +domains, for example [databases], [observability], [container security] +and many +[others](https://github.com/traefik/yaegi/network/dependents?package_id=UGFja2FnZS0yMjc1NTQ3MjIy). + +Yaegi is lean and mean, as it delivers in a single package, with no +external dependency, a complete Go interpreter, compliant with the [Go +specification]. Lean, but also mean: its code is dense, complex, not +always idiomatic, and sometimes maybe hard to understand. + +This document is here to address that. In the following, after getting +an overview, we look under the hood, explore the internals and discuss +the design. Our aim is to provide the essential insights, clarify the +architecture and the code organization. But first, the overview. + +## Overview of architecture + +Let's see what happens inside yaegi when one executes the following +line: + +```go +interp.Eval(`print("hello", 2+3)`) +``` + +The following figure 1 displays the main steps of evaluation: + + + +1. The *scanner* (provided by the [go/scanner] package) transforms a + stream of characters (the source code) into a stream of tokens, + through a [lexical analysis] step. + +2. The *parser* (provided by the [go/parser] package) transforms the + stream of tokens into an [abstract syntax tree] or AST, through a + [syntax analysis] step. + +3. The *analyser* (implemented in the [yaegi/interp] package) performs + the checks and creation of type, constant, variable and function + symbols. It also computes the [control-flow graphs] and memory + allocations for symbols, through [semantic analysis] steps. All those + metadata are obtained from and stored to the nodes of the AST, making + it annotated. + +4. The *generator* (implemented in the [yaegi/interp] package) reads the + annotated AST and produces code intructions to be executed, through a + [code generation] step. + +5. The *executor* (implemented in the [yaegi/interp] package) runs the + code instructions in the context of the interpreter. + +The interpreter is designed as a simple compiler, except that the code +is generated into memory instead of object files, and with an executor +module to run the specific instruction format. + +We won't spend more details on the scanner and the parser, both provided +by the standard library, and instead examine directly the analyser. + +## Semantic analysis + +The analyser performs the semantic analysis of the program to interpret. +This is done in several steps, all consisting of reading from and +writing to the AST, so we first examine the details and dynamics of our +AST representation. + +### AST dynamics + +Hereafter stands the most important data structure of any compiler, +interpreter or other language tool, and the function to use it +(extracted from +[here](https://github.com/traefik/yaegi/blob/8de3add6faf471a807182c7b8198fe863debc9d8/interp/interp.go#L284-L296)). + +```go +// node defines a node of a (abstract syntax) tree. +type node struct { + // Node children + child []*node + // Node metadata + ... +} + +// walk traverses AST n in depth first order, invoking in function +// at node entry and out function at node exit. +func (n *node) walk(in func(n *node) bool, out func(n *node)) { + if in != nil && !in(n) { + return + } + for _, child := range n.child { + child.Walk(in, out) + } + if out != nil { + out(n) + } +} +``` + +The above code is deceptively simple. As in many complex systems, an +important part of the signification is carried by the relationships +between the elements and the patterns they form. It's easier to +understand it by displaying the corresponding graph and consider the +system as a whole. We can do that using a simple example: + +```go +a := 3 +if a > 2 { + print("ok") +} +print("bye") +``` + +The corresponding AST is: + + + +This is the raw AST, with no annotations, as obtained from the parser. +Each node contains an index number (for labelling purpose only), and the +node type, computed by the parser from the set of Go grammar rules (i.e. +"stmt" for "list of [statements]", "call" for "call [expression]", ...). +We also recognize the source tokens as literal values in leaf locations. + +Walking the tree consists in visiting the nodes starting from the root +(node 1), in their numbering order (here from 1 to 15): depth first (the +children before the siblings) and from left to right. At each node, a +callback `in` is invoked at entry (pre-processing) and a callback `out` +at exit (post-processing). + +When the `in` callback executes, only the information computed in the +sub-trees in the left of the node is available, in addition to the +pre-processing information computed in the node ancestors. The `in` +callback returns a boolean. If the result is false, the node sub-tree is +skipped, allowing to short-cut processing, for example to avoid to dive +in function bodies and process only function signatures. + +When the `out` callback executes, the results computed on the whole +descendant sub-trees are available, which is useful for example to +compute the size of a composite object defined accross nested +structures. In the absence of post-processing, multiple tree walks are +necessary to achieve the same result. + +A semantic analysis step is therefore simply a tree walk with the right +callbacks. In the case of our interpreter, we have two tree walks to +perform: the globals and types analysis in [interp/gta.go] and the +control-flow graphs analysis in [interp/cfg.go]. In both files, notice +the call to `root.Walk`. + +Note: we have chosen to represent the AST as a uniform node structure +as opposed to the [ast.Node] interface in the Go standard library, +implemented by specialized types for all the node kinds. The main +reason is that the tree walk method [ast.Inspect] only permits a +pre-processing callback, not a post-processing one, required for +several compiling steps. It also seemed simpler at the time to start +with this uniform structure, and we ended up sticking with it. + +### Globals and types analysis + +Our first operation on the AST is to check and register all the +components of the program declared at global level. This is a partial +analysis, concerned only about declarations and not function +implementations. + +This step is necessary because in Go, at global level, symbols can be +used before being declared (as opposed to Go function bodies, or in C in +general, where use before declaration is simply forbidden in strict +mode). + +Allowing out of order symbols is what permits the code to be scattered +arbitrarily amongst several files in packages without more constraints. +It is indeed an important feature to let the programer organize her code +as she wants. + +This step, implemented in [interp/gta.go], consists in performing a tree +walk with only a pre-processing callback (no `out` function is passed). +There are two particularities: + +The first is the multiple-pass iterative walk. Indeed, in a first global +pass, instead of failing with an error whenever an incomplete definition +is met, the reference to the failing sub-tree is kept in a list of nodes +to be retried, and the walk finishes going over the whole tree. Then, +all the problematic sub-trees are iteratively retried until all the +nodes have been defined, or as long as there is progress. That is, if +two subsequent iterations lead to the exact same state, it is a hint +that progress is not being made and it would result in an infinite loop, +at which point yaegi just stops with an error. + +The second particularity is that despite being in a partial analysis +step, a full interpretation can still be necessary on an expression +sub-tree if this one serves to implement a global type definition. For +example if an array size is computed by an expression as in the +following valid Go declarations: + +```go +const ( + prefix = "/usr" + path = prefix + "/local/bin" +) +var a [len(prefix+path) + 2]int +``` + +A paradox is that the compiler needs an interpreter to perform the type +analysis! Indeed, in the example above, `[16]int` (because +`len(prefix+path) + 2 = 16`) is a specific type in itself, distinct from +e.g. `[14]int`. Which means that even though we are only at the types +analysis phase we already must be able to compute the `len(prefix+path) ++ 2` expression. In the C language it is one of the roles of the +[pre-processor], which means the compiler itself does not need to be +able to achieve that. Here in Go, the specification forces the compiler +implementor to provide and use early-on the mechanics involved above, +which is usually called constant folding optimisation. It is therefore +implemented both within the standard gc, and whithin yaegi. The same +kind of approach is pushed to its paroxysm in the [Zig language] with +its [comptime] keyword. + +### Control-flow graphs + +After GTA, all the global symbols are properly defined no matter +their declaration order. We can now proceed with the full code +analysis, which will be performed by a single tree walk in +[interp/cfg.go]. + +Both pre-processing and post-processing callbacks are provided to the +walk function. Despite being activated in a single pass, multiple kinds +of data processing are executed: + +- Types checking and creation. Started in GTA, it is now completed also + in all function bodies. + +- Analysis of variable scoping: scope levels are opened in + pre-processing and closed in post-processing, as the nesting of scope + reflects the AST structure. + +- Precise computing of object sizes and locations. + +- Identification and ordering of actions. + +The last point is critical for code generation. It consists in the +production of control-flow graphs. CFGs are usually represented in the +form of an intermediate representation (IR), which really is a +simplified machine independent instruction set, as in the [GCC GIMPLE], +the [LLVM IR] or the [SSA] form in the Go compiler. In yaegi, no IR is +produced, only AST annotations are used. + +Let's use our previous example to explain: + + + +In the AST, the nodes relevant to the CFG are the *action* nodes (in +blue), that is the nodes referring to an arithmetic or a logic +operation, a function call or a memory operation (assigning a variable, +accessing an array entry, ...). + +Building the CFG consists in identifying action nodes and then find +their successor (to be stored in node fields `tnext` and `fnext`). An +action node has one successor in the general case (shown with a green +arrow), or two if the action is associated to a conditional branch +(green arrow if the test is true, red arrow otherwise). + +The rules to determine the successor of an action node are inherent to +the properties of its neighbours (ancestors, siblings and descendants). +For example, in the `if` sub-tree (nodes 5 to 12), the first action to +execute is the condition test, that is, the first action in the +condition sub-tree, here the node 6. This action will have two +alternative successors: one to execute if the test is true, the other +if not. The *true* successor will be the first action in the second +child sub-tree of the `if` node, describing the *true* branch (this +sub-tree root is node 9, and first action 10). As there is no `if` +*false* branch in our example, the next action of the whole `if` +sub-tree is the first action in the `if` sibling sub-tree, here the node +13. This node will be therefore the *false* successor, the first action +to execute when the `if` condition fails. Finally the node 13 is also +the successor of the *true* branch, the node 10. The corresponding +implementation is located in a [block of 16 lines] in the +post-processing CFG callback. Note that the same code also performs dead +branch elimination and condition validity checking. At this stage, in +terms of Control Flow, our AST example can now be seen as a simpler +representation, such as the following. + + + +In our example, the action nodes composing the CFG can do the following +kind of operations: +- defining variables in memory and assigning values to them +- performing arithmetic or logical operations +- conditional branching +- function calling + +Adding the capacity to jump to a *backward* location (where destination +node index is inferior to source's one, an arrow from right to +left), thus allowing *loops*, makes the action set to become +[Turing complete], implementing a universal computing machine. + + + +The character of universality here lies in the cyclic nature of the +control-flow graph (remark that `if` statement graphs, although +appearing cyclic, are not, because the conditional branches are +mutually exclusives). + +This is not just theoretical. For example, forbidding backward jumps was +crucial in the design of the Linux [eBPF verifier], in order to let user +provided (therefore untrusted) snippets execute in a kernel system +privileged environment and guarantee no infinite loops. + +## Code generation and execution + +The compiler implemented in yaegi targets the Go runtime itself, not a +particular hardware architecture. For each action node in the CFG a +corresponding closure is generated. The main benefits are: +- Portability: the generated code runs on any platform where Go is + supported. +- Interoperability: the objects produced by the interpreter are directly + usable by the host program in the form of reflect values. +- The memory management in particular the garbage collector, is provided + by the runtime, and applies also to the values created by the + interpreter. +- The support of runtime type safety, slices, maps, channels, goroutines + is also provided by the runtime. + +The action templates are located in [interp/run.go] and [interp/op.go]. +Generating closures allows to optimize all the cases where a constant is +used (an operation involving a constant and a variable is cheaper and +faster than the same operation involving two variables). It also permits +to hard-code the control-flow graph, that is to pre-define the next +instruction to execute and avoid useless branch tests. + +The pseudo architecture targeted by the interpreter is in effect a +virtual [stack machine] where the memory is represented as slices of Go +reflect values, as shown in the following figure, and where the +instructions are represented directly by the set of action nodes (the +CFG) in the AST. Those atomic instructions, also called *builtins*, are +sligthly higher level than a real hardware instruction set, because they +operate directly on Go interfaces (more precisely their reflect +representation), hiding a lot of low level processing and subtleties +provided by the Go runtime. + + + +The memory management performed by the interpreter consists to create a +global frame at a new session (the top of the stack), populated with all +global values (constants, types, variables and functions). At each new +interpreted function call, a new frame is pushed on the stack, +containing the values for all the return value, input parameters and +local variables of the function. + +## Conclusion + +We have described the general architecture of a Go interpreter, reusing +the existing Go scanner and parser. We have focused on the semantic +analysis, which is based on AST annotations, up to the control-flow +graph and code generation. This design leads to a consistent and +concise compiler suitable for an embedded interpreter. We have also +provided a succint overview of the virtual stack machine on top of the +Go runtime, leveraging on the reflection layer provided by the Go +standard library. + +We can now evolve this design to address different target architectures, +for example a more efficient virtual machine, already in the works. + +Some parts of yaegi have not been detailed yet and will be addressed in +a next article: + +- Integration with pre-compiled packages +- Go Generics +- Recursive types +- Interfaces and methods +- Virtualization and sandboxing +- REPL and interactive use + +[Yaegi]: https://github.com/traefik/yaegi +[plugins.traefik.io]: https://plugins.traefik.io +[databases]: https://github.com/xo/xo +[observability]: https://github.com/slok/sloth +[container security]: https://github.com/cyberark/kubesploit +[Go specification]: https://go.dev/ref/spec +[go/scanner]: https://pkg.go.dev/go/scanner +[go/parser]: https://pkg.go.dev/go/parser +[abstract syntax tree]: https://en.wikipedia.org/wiki/Abstract_syntax_tree +[lexical analysis]: https://en.wikipedia.org/wiki/Lexical_analysis +[syntax analysis]: https://en.wikipedia.org/wiki/Syntax_analysis +[semantic analysis]: https://en.wikipedia.org/wiki/Semantic_analysis_(compilers) +[control-flow graphs]: https://en.wikipedia.org/wiki/Control-flow_graph +[yaegi/interp]: https://pkg.go.dev/github.com/traefik/yaegi/interp +[code generation]: https://en.wikipedia.org/wiki/Code_generation_%28compiler%29 +[ast.Node]: https://pkg.go.dev/go/ast#Node +[ast.Inspect]: https://pkg.go.dev/go/ast#Inspect +[statements]: https://go.dev/ref/spec#Statements +[expression]: https://go.dev/ref/spec#Expressions +[Turing complete]: https://en.wikipedia.org/wiki/Turing_completeness +[eBPF verifier]: https://www.kernel.org/doc/html/latest/bpf/verifier.html +[interp/gta.go]: https://github.com/traefik/yaegi/blob/master/interp/gta.go +[interp/cfg.go]: https://github.com/traefik/yaegi/blob/master/interp/cfg.go +[interp/run.go]: https://github.com/traefik/yaegi/blob/master/interp/run.go +[interp/op.go]: https://github.com/traefik/yaegi/blob/master/interp/op.go +[pre-processor]: https://gcc.gnu.org/onlinedocs/cpp/ +[GCC GIMPLE]: https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html +[LLVM IR]: https://llvm.org/docs/LangRef.html +[SSA]: https://github.com/golang/go/blob/bf48163e8f2b604f3b9e83951e331cd11edd8495/src/cmd/compile/internal/ssa/README.md +[block of 16 lines]: https://github.com/traefik/yaegi/blob/8de3add6faf471a807182c7b8198fe863debc9d8/interp/cfg.go#L1608-L1624 +[Zig language]: https://ziglang.org +[comptime]: https://ziglang.org/documentation/master/#comptime +[stack machine]: https://en.wikipedia.org/wiki/Stack_machine diff --git a/yaegi-internals/yaegi_internals_fig1.drawio.svg b/yaegi-internals/yaegi_internals_fig1.drawio.svg new file mode 100644 index 0000000..bfe123f --- /dev/null +++ b/yaegi-internals/yaegi_internals_fig1.drawio.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than diagrams.net --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="641px" height="351px" viewBox="-0.5 -0.5 641 351" content="<mxfile host="Electron" modified="2023-04-06T14:17:28.604Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.1.2 Chrome/106.0.5249.199 Electron/21.4.3 Safari/537.36" etag="AdbRRaVimnH_mmBxbIQ9" version="21.1.2" type="device"> <diagram name="Page-1" id="7KjBe1GQy4R-MzBecK1R"> <mxGraphModel dx="954" dy="674" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="dklFw9bgWBskkmRMdnWt-11" value="" style="group" parent="1" vertex="1" connectable="0"> <mxGeometry x="80" y="40" width="160" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-1" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="dklFw9bgWBskkmRMdnWt-11" vertex="1"> <mxGeometry width="160" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-2" value="" style="endArrow=none;html=1;rounded=0;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" parent="dklFw9bgWBskkmRMdnWt-11" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="20" y="20" as="sourcePoint" /> <mxPoint x="20" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-4" value="" style="endArrow=none;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" parent="dklFw9bgWBskkmRMdnWt-11" source="dklFw9bgWBskkmRMdnWt-1" target="dklFw9bgWBskkmRMdnWt-1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="30" y="30" as="sourcePoint" /> <mxPoint x="30" y="10" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-5" value="" style="endArrow=none;html=1;rounded=0;exitX=0.375;exitY=1.045;exitDx=0;exitDy=0;exitPerimeter=0;" parent="dklFw9bgWBskkmRMdnWt-11" source="dklFw9bgWBskkmRMdnWt-1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="55" y="20" as="sourcePoint" /> <mxPoint x="60" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-6" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="dklFw9bgWBskkmRMdnWt-11" source="dklFw9bgWBskkmRMdnWt-1" target="dklFw9bgWBskkmRMdnWt-1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="70" y="31" as="sourcePoint" /> <mxPoint x="70" y="10" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-7" value="" style="endArrow=none;html=1;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-11" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="100" y="20" as="sourcePoint" /> <mxPoint x="100" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-9" value="" style="endArrow=none;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" parent="dklFw9bgWBskkmRMdnWt-11" source="dklFw9bgWBskkmRMdnWt-1" target="dklFw9bgWBskkmRMdnWt-1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="110" y="30" as="sourcePoint" /> <mxPoint x="110" y="10" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-10" value="" style="endArrow=none;html=1;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-11" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="140" y="20" as="sourcePoint" /> <mxPoint x="140" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-73" value="&lt;font face=&quot;Courier New&quot;&gt;p&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-11" vertex="1"> <mxGeometry width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-76" value="&lt;font face=&quot;Courier New&quot;&gt;r&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-11" vertex="1"> <mxGeometry x="20" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-77" value="&lt;font face=&quot;Courier New&quot;&gt;i&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-11" vertex="1"> <mxGeometry x="40" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-78" value="&lt;font face=&quot;Courier New&quot;&gt;n&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-11" vertex="1"> <mxGeometry x="60" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-79" value="&lt;font face=&quot;Courier New&quot;&gt;t&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-11" vertex="1"> <mxGeometry x="80" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-80" value="&lt;font face=&quot;Courier New&quot;&gt;(&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-11" vertex="1"> <mxGeometry x="100" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-81" value="&lt;font face=&quot;Courier New&quot;&gt;&quot;&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-11" vertex="1"> <mxGeometry x="120" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-75" value="&lt;font face=&quot;Courier New&quot;&gt;h&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-11" vertex="1"> <mxGeometry x="140" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-21" value="stream of characters" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="90" y="10" width="140" height="30" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-23" value="tokens" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="430" y="10" width="140" height="30" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-24" value="scanner" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="280" y="35" width="100" height="30" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-25" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="dklFw9bgWBskkmRMdnWt-1" target="dklFw9bgWBskkmRMdnWt-24" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="300" y="110" as="sourcePoint" /> <mxPoint x="350" y="60" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-26" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="dklFw9bgWBskkmRMdnWt-24" target="dklFw9bgWBskkmRMdnWt-13" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="300" y="110" as="sourcePoint" /> <mxPoint x="350" y="60" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-27" value="parser" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="620" y="90" width="100" height="30" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-28" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="dklFw9bgWBskkmRMdnWt-13" target="dklFw9bgWBskkmRMdnWt-27" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="340" y="220" as="sourcePoint" /> <mxPoint x="390" y="170" as="targetPoint" /> <Array as="points"> <mxPoint x="670" y="50" /> </Array> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-40" value="" style="group" parent="1" vertex="1" connectable="0"> <mxGeometry x="95" y="130" width="130" height="100" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-29" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="dklFw9bgWBskkmRMdnWt-40" vertex="1"> <mxGeometry x="70" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-30" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#d5e8d4;strokeColor=#82b366;" parent="dklFw9bgWBskkmRMdnWt-40" vertex="1"> <mxGeometry x="30" y="40" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-31" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#fff2cc;strokeColor=#d6b656;" parent="dklFw9bgWBskkmRMdnWt-40" vertex="1"> <mxGeometry x="110" y="40" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-32" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="dklFw9bgWBskkmRMdnWt-40" vertex="1"> <mxGeometry y="80" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-33" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#f8cecc;strokeColor=#b85450;" parent="dklFw9bgWBskkmRMdnWt-40" vertex="1"> <mxGeometry x="60" y="80" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-36" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=1;entryDx=0;entryDy=0;" parent="dklFw9bgWBskkmRMdnWt-40" source="dklFw9bgWBskkmRMdnWt-30" target="dklFw9bgWBskkmRMdnWt-29" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="80" y="50" as="sourcePoint" /> <mxPoint x="130" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-37" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=1;entryDx=0;entryDy=0;" parent="dklFw9bgWBskkmRMdnWt-40" source="dklFw9bgWBskkmRMdnWt-32" target="dklFw9bgWBskkmRMdnWt-30" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="10" y="80" as="sourcePoint" /> <mxPoint x="30" y="60" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-38" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="dklFw9bgWBskkmRMdnWt-40" source="dklFw9bgWBskkmRMdnWt-29" target="dklFw9bgWBskkmRMdnWt-31" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="160" y="20" as="sourcePoint" /> <mxPoint x="210" y="-30" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-39" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=0;exitX=1;exitY=1;exitDx=0;exitDy=0;" parent="dklFw9bgWBskkmRMdnWt-40" source="dklFw9bgWBskkmRMdnWt-30" target="dklFw9bgWBskkmRMdnWt-33" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="50" y="60" as="sourcePoint" /> <mxPoint x="210" y="-30" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-41" value="Abstract Syntax Tree (AST)" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="431" y="100" width="150" height="30" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-42" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="dklFw9bgWBskkmRMdnWt-27" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="420" y="190" as="sourcePoint" /> <mxPoint x="580" y="170" as="targetPoint" /> <Array as="points"> <mxPoint x="670" y="170" /> </Array> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-44" value="analyser" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="280" y="150" width="100" height="30" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-45" value="" style="group" parent="1" vertex="1" connectable="0"> <mxGeometry x="445" y="130" width="130" height="100" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-46" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="dklFw9bgWBskkmRMdnWt-45" vertex="1"> <mxGeometry x="70" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-47" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="dklFw9bgWBskkmRMdnWt-45" vertex="1"> <mxGeometry x="30" y="40" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-48" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="dklFw9bgWBskkmRMdnWt-45" vertex="1"> <mxGeometry x="110" y="40" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-49" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="dklFw9bgWBskkmRMdnWt-45" vertex="1"> <mxGeometry y="80" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-50" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="dklFw9bgWBskkmRMdnWt-45" vertex="1"> <mxGeometry x="60" y="80" width="20" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-51" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=1;entryDx=0;entryDy=0;" parent="dklFw9bgWBskkmRMdnWt-45" source="dklFw9bgWBskkmRMdnWt-47" target="dklFw9bgWBskkmRMdnWt-46" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="80" y="50" as="sourcePoint" /> <mxPoint x="130" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-52" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=1;entryDx=0;entryDy=0;" parent="dklFw9bgWBskkmRMdnWt-45" source="dklFw9bgWBskkmRMdnWt-49" target="dklFw9bgWBskkmRMdnWt-47" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="10" y="80" as="sourcePoint" /> <mxPoint x="30" y="60" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-53" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="dklFw9bgWBskkmRMdnWt-45" source="dklFw9bgWBskkmRMdnWt-46" target="dklFw9bgWBskkmRMdnWt-48" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="160" y="20" as="sourcePoint" /> <mxPoint x="210" y="-30" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-54" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0;entryDx=0;entryDy=0;exitX=1;exitY=1;exitDx=0;exitDy=0;" parent="dklFw9bgWBskkmRMdnWt-45" source="dklFw9bgWBskkmRMdnWt-47" target="dklFw9bgWBskkmRMdnWt-50" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="50" y="60" as="sourcePoint" /> <mxPoint x="210" y="-30" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-55" value="" style="endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="dklFw9bgWBskkmRMdnWt-44" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="460" y="165" as="sourcePoint" /> <mxPoint x="470" y="140" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-57" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="dklFw9bgWBskkmRMdnWt-44" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="420" y="190" as="sourcePoint" /> <mxPoint x="230" y="165" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-58" value="annotated AST" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="90" y="100" width="150" height="30" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-59" value="generator" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="280" y="275" width="100" height="30" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-60" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="dklFw9bgWBskkmRMdnWt-59" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="170" y="240" as="sourcePoint" /> <mxPoint x="370" y="140" as="targetPoint" /> <Array as="points"> <mxPoint x="170" y="290" /> </Array> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-62" value="" style="group" parent="1" vertex="1" connectable="0"> <mxGeometry x="420" y="40" width="160" height="21.25" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-13" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="dklFw9bgWBskkmRMdnWt-62" vertex="1"> <mxGeometry width="160" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-15" value="" style="endArrow=none;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" parent="dklFw9bgWBskkmRMdnWt-62" source="dklFw9bgWBskkmRMdnWt-13" target="dklFw9bgWBskkmRMdnWt-13" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="-310" y="100" as="sourcePoint" /> <mxPoint x="-310" y="80" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-17" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="dklFw9bgWBskkmRMdnWt-62" source="dklFw9bgWBskkmRMdnWt-13" target="dklFw9bgWBskkmRMdnWt-13" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="-270" y="101" as="sourcePoint" /> <mxPoint x="-270" y="80" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-19" value="" style="endArrow=none;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" parent="dklFw9bgWBskkmRMdnWt-62" source="dklFw9bgWBskkmRMdnWt-13" target="dklFw9bgWBskkmRMdnWt-13" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="-230" y="100" as="sourcePoint" /> <mxPoint x="-230" y="80" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-83" value="&lt;font style=&quot;font-size: 10px;&quot;&gt;ident&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-62" vertex="1"> <mxGeometry y="-1.25" width="40" height="22.5" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-84" value="&lt;font style=&quot;font-size: 10px;&quot;&gt;lpar&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-62" vertex="1"> <mxGeometry x="40" y="-2.5" width="40" height="22.5" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-85" value="&lt;font style=&quot;font-size: 10px;&quot;&gt;string&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-62" vertex="1"> <mxGeometry x="80" y="-2.5" width="40" height="22.5" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-82" value="&lt;font style=&quot;font-size: 10px;&quot;&gt;comma&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-62" vertex="1"> <mxGeometry x="120" y="-2.5" width="40" height="22.5" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-63" value="" style="group" parent="1" vertex="1" connectable="0"> <mxGeometry x="420" y="280" width="160" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-64" value="" style="rounded=0;whiteSpace=wrap;html=1;" parent="dklFw9bgWBskkmRMdnWt-63" vertex="1"> <mxGeometry width="160" height="20" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-65" value="" style="endArrow=none;html=1;rounded=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;" parent="dklFw9bgWBskkmRMdnWt-63" source="dklFw9bgWBskkmRMdnWt-64" target="dklFw9bgWBskkmRMdnWt-64" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="-310" y="100" as="sourcePoint" /> <mxPoint x="-310" y="80" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-66" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="dklFw9bgWBskkmRMdnWt-63" source="dklFw9bgWBskkmRMdnWt-64" target="dklFw9bgWBskkmRMdnWt-64" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="-270" y="101" as="sourcePoint" /> <mxPoint x="-270" y="80" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-67" value="" style="endArrow=none;html=1;rounded=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" parent="dklFw9bgWBskkmRMdnWt-63" source="dklFw9bgWBskkmRMdnWt-64" target="dklFw9bgWBskkmRMdnWt-64" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="-230" y="100" as="sourcePoint" /> <mxPoint x="-230" y="80" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-101" value="&lt;font style=&quot;font-size: 10px;&quot;&gt;add&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-63" vertex="1"> <mxGeometry y="-2.5" width="40" height="22.5" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-102" value="&lt;font style=&quot;font-size: 10px;&quot;&gt;load&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-63" vertex="1"> <mxGeometry x="40" y="-2.5" width="40" height="22.5" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-103" value="&lt;font style=&quot;font-size: 10px;&quot;&gt;call&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-63" vertex="1"> <mxGeometry x="80" y="-2.5" width="40" height="22.5" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-100" value="&lt;font style=&quot;font-size: 10px;&quot;&gt;print&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="dklFw9bgWBskkmRMdnWt-63" vertex="1"> <mxGeometry x="120" y="-2.5" width="40" height="22.5" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-68" value="code instructions" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="431" y="250" width="140" height="30" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-69" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="380" y="289.58000000000004" as="sourcePoint" /> <mxPoint x="420" y="289.58000000000004" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-70" value="executor" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1"> <mxGeometry x="620" y="275" width="100" height="30" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-71" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="dklFw9bgWBskkmRMdnWt-64" target="dklFw9bgWBskkmRMdnWt-70" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="320" y="190" as="sourcePoint" /> <mxPoint x="370" y="140" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-72" value="&lt;font face=&quot;Courier New&quot;&gt;print(&quot;hello&quot;, 2+3)&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="80" y="60" width="160" height="30" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-86" value="&lt;font face=&quot;Courier New&quot;&gt;hello5&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> <mxGeometry x="640" y="330" width="60" height="30" as="geometry" /> </mxCell> <mxCell id="dklFw9bgWBskkmRMdnWt-88" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="dklFw9bgWBskkmRMdnWt-70" target="dklFw9bgWBskkmRMdnWt-86" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="460" y="240" as="sourcePoint" /> <mxPoint x="510" y="190" as="targetPoint" /> </mxGeometry> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> "><defs/><g><g id="cell-dklFw9bgWBskkmRMdnWt-1"><rect x="0" y="30" width="160" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-2"><path d="M 20 50 L 20 30" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-4"><path d="M 40 50 L 40 30" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-5"><path d="M 60 50.9 L 60 30" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-6"><path d="M 80 50 L 80 30" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-7"><path d="M 100 50 L 100 30" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-9"><path d="M 120 50 L 120 30" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-10"><path d="M 140 50 L 140 30" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-73"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 40px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font face="Courier New">p</font></div></div></div></foreignObject><text x="10" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">p</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-76"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 40px; margin-left: 21px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font face="Courier New">r</font></div></div></div></foreignObject><text x="30" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">r</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-77"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 40px; margin-left: 41px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font face="Courier New">i</font></div></div></div></foreignObject><text x="50" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">i</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-78"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 40px; margin-left: 61px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font face="Courier New">n</font></div></div></div></foreignObject><text x="70" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">n</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-79"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 40px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font face="Courier New">t</font></div></div></div></foreignObject><text x="90" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">t</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-80"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 40px; margin-left: 101px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font face="Courier New">(</font></div></div></div></foreignObject><text x="110" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">(</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-81"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 40px; margin-left: 121px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font face="Courier New">"</font></div></div></div></foreignObject><text x="130" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">"</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-75"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 40px; margin-left: 141px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font face="Courier New">h</font></div></div></div></foreignObject><text x="150" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">h</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-21"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 15px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">stream of characters</div></div></div></foreignObject><text x="80" y="19" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">stream of characters</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-23"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 15px; margin-left: 351px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">tokens</div></div></div></foreignObject><text x="420" y="19" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">tokens</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-24"><ellipse cx="250" cy="40" rx="50" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 40px; margin-left: 201px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">scanner</div></div></div></foreignObject><text x="250" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">scanner</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-25"><path d="M 160 40 L 193.63 40" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 198.88 40 L 191.88 43.5 L 193.63 40 L 191.88 36.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-26"><path d="M 300 40 L 333.63 40" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 338.88 40 L 331.88 43.5 L 333.63 40 L 331.88 36.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-27"><ellipse cx="590" cy="95" rx="50" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 95px; margin-left: 541px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">parser</div></div></div></foreignObject><text x="590" y="99" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">parser</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-28"><path d="M 500 40 L 590 40 L 590 73.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 590 78.88 L 586.5 71.88 L 590 73.63 L 593.5 71.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-29"><ellipse cx="95" cy="130" rx="10" ry="10" fill="#dae8fc" stroke="#6c8ebf" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-30"><ellipse cx="55" cy="170" rx="10" ry="10" fill="#d5e8d4" stroke="#82b366" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-31"><ellipse cx="135" cy="170" rx="10" ry="10" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-32"><ellipse cx="25" cy="210" rx="10" ry="10" fill="#ffe6cc" stroke="#d79b00" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-33"><ellipse cx="85" cy="210" rx="10" ry="10" fill="#f8cecc" stroke="#b85450" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-36"><path d="M 62.07 162.93 L 87.93 137.07" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-37"><path d="M 32.07 202.93 L 47.93 177.07" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-38"><path d="M 102.07 137.07 L 127.93 162.93" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-39"><path d="M 62.07 177.07 L 77.93 202.93" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-41"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 105px; margin-left: 352px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">Abstract Syntax Tree (AST)</div></div></div></foreignObject><text x="426" y="109" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Abstract Syntax Tree (AST)</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-42"><path d="M 590 110 L 590 160 L 506.37 160" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 501.12 160 L 508.12 156.5 L 506.37 160 L 508.12 163.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-44"><ellipse cx="250" cy="155" rx="50" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 155px; margin-left: 201px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">analyser</div></div></div></foreignObject><text x="250" y="159" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">analyser</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-46"><ellipse cx="445" cy="130" rx="10" ry="10" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-47"><ellipse cx="405" cy="170" rx="10" ry="10" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-48"><ellipse cx="485" cy="170" rx="10" ry="10" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-49"><ellipse cx="375" cy="210" rx="10" ry="10" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-50"><ellipse cx="435" cy="210" rx="10" ry="10" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-51"><path d="M 412.07 162.93 L 437.93 137.07" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-52"><path d="M 382.07 202.93 L 397.93 177.07" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-53"><path d="M 452.07 137.07 L 477.93 162.93" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-54"><path d="M 412.07 177.07 L 427.93 202.93" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-55"><path d="M 380 155 L 306.37 155" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 301.12 155 L 308.12 151.5 L 306.37 155 L 308.12 158.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-57"><path d="M 200 155 L 156.37 155" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 151.12 155 L 158.12 151.5 L 156.37 155 L 158.12 158.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-58"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 105px; margin-left: 11px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">annotated AST</div></div></div></foreignObject><text x="85" y="109" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">annotated AST</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-59"><ellipse cx="250" cy="280" rx="50" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 280px; margin-left: 201px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">generator</div></div></div></foreignObject><text x="250" y="284" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">generator</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-60"><path d="M 90 230 L 90 280 L 193.63 280" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 198.88 280 L 191.88 283.5 L 193.63 280 L 191.88 276.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-13"><rect x="340" y="30" width="160" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-15"><path d="M 380 50 L 380 30" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-17"><path d="M 420 50 L 420 30" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-19"><path d="M 460 50 L 460 30" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-83"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 40px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font style="font-size: 10px;">ident</font></div></div></div></foreignObject><text x="360" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ident</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-84"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 39px; margin-left: 381px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font style="font-size: 10px;">lpar</font></div></div></div></foreignObject><text x="400" y="42" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">lpar</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-85"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 39px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font style="font-size: 10px;">string</font></div></div></div></foreignObject><text x="440" y="42" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">string</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-82"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 39px; margin-left: 461px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font style="font-size: 10px;">comma</font></div></div></div></foreignObject><text x="480" y="42" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">comma</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-64"><rect x="340" y="270" width="160" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-65"><path d="M 380 290 L 380 270" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-66"><path d="M 420 290 L 420 270" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-67"><path d="M 460 290 L 460 270" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-101"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 279px; margin-left: 341px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font style="font-size: 10px;">add</font></div></div></div></foreignObject><text x="360" y="282" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">add</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-102"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 279px; margin-left: 381px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font style="font-size: 10px;">load</font></div></div></div></foreignObject><text x="400" y="282" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">load</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-103"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 279px; margin-left: 421px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font style="font-size: 10px;">call</font></div></div></div></foreignObject><text x="440" y="282" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">call</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-100"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 279px; margin-left: 461px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font style="font-size: 10px;">print</font></div></div></div></foreignObject><text x="480" y="282" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">print</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-68"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 138px; height: 1px; padding-top: 255px; margin-left: 352px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">code instructions</div></div></div></foreignObject><text x="421" y="259" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">code instructions</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-69"><path d="M 300 279.58 L 333.63 279.58" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 338.88 279.58 L 331.88 283.08 L 333.63 279.58 L 331.88 276.08 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-70"><ellipse cx="590" cy="280" rx="50" ry="15" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 280px; margin-left: 541px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">executor</div></div></div></foreignObject><text x="590" y="284" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">executor</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-71"><path d="M 500 280 L 533.63 280" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 538.88 280 L 531.88 283.5 L 533.63 280 L 531.88 276.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g><g id="cell-dklFw9bgWBskkmRMdnWt-72"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 65px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font face="Courier New">print("hello", 2+3)</font></div></div></div></foreignObject><text x="80" y="69" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">print("hello", 2+3)</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-86"><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 335px; margin-left: 561px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;"><font face="Courier New">hello5</font></div></div></div></foreignObject><text x="590" y="339" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">hello5</text></switch></g></g><g id="cell-dklFw9bgWBskkmRMdnWt-88"><path d="M 590 295 L 590 313.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 590 318.88 L 586.5 311.88 L 590 313.63 L 593.5 311.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file |
