Cleanup the exprs namespace for the episode 5
This commit is contained in:
parent
e00156b9e7
commit
54b4458a8d
|
@ -0,0 +1,439 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="29cm"
|
||||||
|
height="10cm"
|
||||||
|
viewBox="0 0 290 99.999997"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
|
||||||
|
sodipodi:docname="ast.svg">
|
||||||
|
<defs
|
||||||
|
id="defs2" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#2f2f2f"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="1"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="0.98994949"
|
||||||
|
inkscape:cx="763.09643"
|
||||||
|
inkscape:cy="181.95893"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="g2389"
|
||||||
|
inkscape:document-rotation="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1064"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
units="cm" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<g
|
||||||
|
id="g965"
|
||||||
|
transform="translate(168.03441,76.711761)" />
|
||||||
|
<g
|
||||||
|
id="g2389"
|
||||||
|
transform="matrix(0.75119316,0,0,0.75119316,51.312464,-32.10995)">
|
||||||
|
<g
|
||||||
|
id="g844"
|
||||||
|
transform="translate(13.040514,28.699914)">
|
||||||
|
<rect
|
||||||
|
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.428288;stroke-linejoin:round"
|
||||||
|
id="rect833"
|
||||||
|
width="42.223991"
|
||||||
|
height="17.314972"
|
||||||
|
x="17.065075"
|
||||||
|
y="20.493992" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583;fill:#333333;"
|
||||||
|
x="29.975029"
|
||||||
|
y="32.850342"
|
||||||
|
id="text839"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan837"
|
||||||
|
x="29.975029"
|
||||||
|
y="32.850342"
|
||||||
|
style="stroke-width:0.264583;fill:#333333;">List</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g852"
|
||||||
|
transform="translate(236.49722,28.699914)">
|
||||||
|
<rect
|
||||||
|
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.428288;stroke-linejoin:round"
|
||||||
|
id="rect846"
|
||||||
|
width="42.223991"
|
||||||
|
height="17.314972"
|
||||||
|
x="17.065075"
|
||||||
|
y="20.493992" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583"
|
||||||
|
x="29.975029"
|
||||||
|
y="32.850342"
|
||||||
|
id="text850"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan848"
|
||||||
|
x="29.975029"
|
||||||
|
y="32.850342"
|
||||||
|
style="fill:#1a1a1a;stroke-width:0.264583">List</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g873"
|
||||||
|
transform="translate(-74.794886,79.485359)">
|
||||||
|
<rect
|
||||||
|
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.552882;stroke-linejoin:round"
|
||||||
|
id="rect854"
|
||||||
|
width="50.245274"
|
||||||
|
height="24.248156"
|
||||||
|
x="17.127373"
|
||||||
|
y="18.076727" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583;fill:#333333;"
|
||||||
|
x="24.819334"
|
||||||
|
y="28.069159"
|
||||||
|
id="text858"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan856"
|
||||||
|
x="24.819334"
|
||||||
|
y="28.069159"
|
||||||
|
style="stroke-width:0.264583;fill:#333333;">Symbol</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583;fill:#333333;"
|
||||||
|
x="34.455421"
|
||||||
|
y="37.899265"
|
||||||
|
id="text864"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan862"
|
||||||
|
x="34.455421"
|
||||||
|
y="37.899265"
|
||||||
|
style="stroke-width:0.264583;fill:#333333;">def</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g885"
|
||||||
|
transform="translate(-9.428929,79.485359)">
|
||||||
|
<rect
|
||||||
|
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.552882;stroke-linejoin:round"
|
||||||
|
id="rect875"
|
||||||
|
width="50.245274"
|
||||||
|
height="24.248156"
|
||||||
|
x="17.127373"
|
||||||
|
y="18.076727" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583;fill:#333333;"
|
||||||
|
x="24.819334"
|
||||||
|
y="28.069159"
|
||||||
|
id="text879"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan877"
|
||||||
|
x="24.819334"
|
||||||
|
y="28.069159"
|
||||||
|
style="stroke-width:0.264583;fill:#333333;">Symbol</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583;fill:#333333;"
|
||||||
|
x="30.550186"
|
||||||
|
y="37.899265"
|
||||||
|
id="text883"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan881"
|
||||||
|
x="30.550186"
|
||||||
|
y="37.899265"
|
||||||
|
style="stroke-width:0.264583;fill:#333333;">main</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g897"
|
||||||
|
transform="translate(8.560606,127.35446)">
|
||||||
|
<rect
|
||||||
|
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.552882;stroke-linejoin:round"
|
||||||
|
id="rect887"
|
||||||
|
width="50.245274"
|
||||||
|
height="24.248156"
|
||||||
|
x="17.127373"
|
||||||
|
y="18.076727" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583"
|
||||||
|
x="24.819334"
|
||||||
|
y="28.069159"
|
||||||
|
id="text891"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan889"
|
||||||
|
x="24.819334"
|
||||||
|
y="28.069159"
|
||||||
|
style="fill:#333333;stroke-width:0.264583">Symbol</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583"
|
||||||
|
x="37.482239"
|
||||||
|
y="37.899265"
|
||||||
|
id="text895"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan893"
|
||||||
|
x="37.482239"
|
||||||
|
y="37.899265"
|
||||||
|
style="fill:#1a1a1a;stroke-width:0.264583">fn</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g937"
|
||||||
|
transform="translate(194.83176,124.58311)">
|
||||||
|
<rect
|
||||||
|
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.552882;stroke-linejoin:round"
|
||||||
|
id="rect927"
|
||||||
|
width="50.245274"
|
||||||
|
height="24.248156"
|
||||||
|
x="-51.96307"
|
||||||
|
y="20.848083" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583"
|
||||||
|
x="-44.271111"
|
||||||
|
y="30.840515"
|
||||||
|
id="text931"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan929"
|
||||||
|
x="-44.271111"
|
||||||
|
y="30.840515"
|
||||||
|
style="fill:#1a1a1a;stroke-width:0.264583">Number</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583"
|
||||||
|
x="-29.835508"
|
||||||
|
y="40.67062"
|
||||||
|
id="text935"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan933"
|
||||||
|
x="-29.835508"
|
||||||
|
y="40.67062"
|
||||||
|
style="fill:#1a1a1a;stroke-width:0.264583">4</tspan></text>
|
||||||
|
</g>
|
||||||
|
<rect
|
||||||
|
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.552882;stroke-linejoin:round"
|
||||||
|
id="rect955"
|
||||||
|
width="50.245274"
|
||||||
|
height="24.248156"
|
||||||
|
x="17.127373"
|
||||||
|
y="16.008705"
|
||||||
|
transform="translate(168.03441,76.71176)" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583"
|
||||||
|
x="192.85374"
|
||||||
|
y="102.6676"
|
||||||
|
id="text959"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan957"
|
||||||
|
x="192.85374"
|
||||||
|
y="102.6676"
|
||||||
|
style="fill:#1a1a1a;stroke-width:0.264583">Symbol</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583"
|
||||||
|
x="202.48984"
|
||||||
|
y="112.49773"
|
||||||
|
id="text963"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan961"
|
||||||
|
x="202.48984"
|
||||||
|
y="112.49773"
|
||||||
|
style="fill:#1a1a1a;stroke-width:0.264583">prn</tspan></text>
|
||||||
|
<g
|
||||||
|
id="g997"
|
||||||
|
transform="translate(244.08463,122.05932)">
|
||||||
|
<rect
|
||||||
|
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.552882;stroke-linejoin:round"
|
||||||
|
id="rect987"
|
||||||
|
width="50.245274"
|
||||||
|
height="24.248156"
|
||||||
|
x="17.127373"
|
||||||
|
y="18.076727" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583"
|
||||||
|
x="24.819334"
|
||||||
|
y="28.069159"
|
||||||
|
id="text991"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan989"
|
||||||
|
x="24.819334"
|
||||||
|
y="28.069159"
|
||||||
|
style="fill:#1a1a1a;stroke-width:0.264583">Symbol</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583"
|
||||||
|
x="30.550186"
|
||||||
|
y="37.899265"
|
||||||
|
id="text995"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan993"
|
||||||
|
x="30.550186"
|
||||||
|
y="37.899265"
|
||||||
|
style="fill:#1a1a1a;stroke-width:0.264583">main</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g905"
|
||||||
|
transform="translate(71.553646,80.534686)">
|
||||||
|
<rect
|
||||||
|
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.428288;stroke-linejoin:round"
|
||||||
|
id="rect899"
|
||||||
|
width="42.223991"
|
||||||
|
height="17.314972"
|
||||||
|
x="17.065075"
|
||||||
|
y="20.493992" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583;fill:#333333;"
|
||||||
|
x="29.975029"
|
||||||
|
y="32.850342"
|
||||||
|
id="text903"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan901"
|
||||||
|
x="29.975029"
|
||||||
|
y="32.850342"
|
||||||
|
style="stroke-width:0.264583;fill:#333333;">List</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g925"
|
||||||
|
transform="translate(71.867786,128.40379)">
|
||||||
|
<rect
|
||||||
|
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.428288;stroke-linejoin:round"
|
||||||
|
id="rect919"
|
||||||
|
width="42.223991"
|
||||||
|
height="17.314972"
|
||||||
|
x="17.065075"
|
||||||
|
y="20.493992" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583"
|
||||||
|
x="29.975029"
|
||||||
|
y="32.850342"
|
||||||
|
id="text923"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan921"
|
||||||
|
x="29.975029"
|
||||||
|
y="32.850342"
|
||||||
|
style="fill:#1a1a1a;stroke-width:0.264583">List</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g985"
|
||||||
|
transform="translate(248.15757,75.693066)">
|
||||||
|
<rect
|
||||||
|
style="fill:#ffffff;stroke:#ffffff;stroke-width:0.428288;stroke-linejoin:round"
|
||||||
|
id="rect979"
|
||||||
|
width="42.223991"
|
||||||
|
height="17.314972"
|
||||||
|
x="17.065075"
|
||||||
|
y="20.493992" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:10.5833px;line-height:1.25;font-family:Charter;-inkscape-font-specification:Charter;stroke-width:0.264583"
|
||||||
|
x="29.975029"
|
||||||
|
y="32.850342"
|
||||||
|
id="text983"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan981"
|
||||||
|
x="29.975029"
|
||||||
|
y="32.850342"
|
||||||
|
style="fill:#1a1a1a;stroke-width:0.264583">List</tspan></text>
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 37.22751,66.508878 -12.952959,97.562086"
|
||||||
|
id="path1037"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g844"
|
||||||
|
inkscape:connection-end="#g873" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 48.144985,66.508878 37.123996,97.562086"
|
||||||
|
id="path1039"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g844"
|
||||||
|
inkscape:connection-end="#g885" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 60.990496,66.508878 38.96731,34.519802"
|
||||||
|
id="path1041"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g844"
|
||||||
|
inkscape:connection-end="#g905" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="M 99.074574,118.34365 65.733643,145.43119"
|
||||||
|
id="path1043"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g905"
|
||||||
|
inkscape:connection-end="#g897" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 109.78753,118.34365 0.20051,30.55413"
|
||||||
|
id="path1045"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g905"
|
||||||
|
inkscape:connection-end="#g925" />
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 120.26758,118.34365 32.96775,27.08754"
|
||||||
|
id="path1047"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g905"
|
||||||
|
inkscape:connection-end="#g937" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 263.31186,66.508878 -37.11531,28.27961"
|
||||||
|
id="path1057"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g852" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 276.82246,66.508878 7.36401,29.67818"
|
||||||
|
id="path1059"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g852"
|
||||||
|
inkscape:connection-end="#g985" />
|
||||||
|
<path
|
||||||
|
style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 286.33464,113.50203 v 26.63402"
|
||||||
|
id="path1067"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g985"
|
||||||
|
inkscape:connection-end="#g997" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 16 KiB |
|
@ -84,7 +84,8 @@ Deducted from https://www.aosabook.org/en/llvm.html
|
||||||
- Finally we fully lower =lir= to =LLVM IR= and pass it to the object generator
|
- Finally we fully lower =lir= to =LLVM IR= and pass it to the object generator
|
||||||
to generate object files.
|
to generate object files.
|
||||||
- Call the default =c compiler= to link the object files and generate the machine code.
|
- Call the default =c compiler= to link the object files and generate the machine code.
|
||||||
* Episode 4 - The reader
|
* DONE Episode 4 - The reader
|
||||||
|
CLOSED: [2021-07-27 Tue 22:50]
|
||||||
** What is a Parser ?
|
** What is a Parser ?
|
||||||
To put it simply, Parser converts the source code to an [[https://en.wikipedia.org/wiki/Abstract_syntax_tree][AST]]
|
To put it simply, Parser converts the source code to an [[https://en.wikipedia.org/wiki/Abstract_syntax_tree][AST]]
|
||||||
*** Algorithms
|
*** Algorithms
|
||||||
|
@ -110,3 +111,21 @@ Read More:
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
- LL(1.5)?
|
- LL(1.5)?
|
||||||
- O(n)
|
- O(n)
|
||||||
|
* Episode 5 - The Abstract Syntax Tree
|
||||||
|
** What is an AST?
|
||||||
|
Ast is a tree representation of the abstract syntactic structure of source code. It's just a tree made of nodes that each node is
|
||||||
|
a data structure describing the syntax.
|
||||||
|
|
||||||
|
#+BEGIN_SRC lisp
|
||||||
|
;; pseudo code
|
||||||
|
(def main (fn () 4))
|
||||||
|
(prn (main))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
|
||||||
|
[[./imgs/ast.svg]]
|
||||||
|
** The =Expression= abstract class
|
||||||
|
*** Expressions
|
||||||
|
- Expressions vs Statements
|
||||||
|
- Serene(Lisp) and expressions
|
||||||
|
** Node & AST
|
||||||
|
|
|
@ -44,7 +44,7 @@ class Expression;
|
||||||
using Node = std::shared_ptr<Expression>;
|
using Node = std::shared_ptr<Expression>;
|
||||||
using ErrorPtr = std::shared_ptr<errors::Error>;
|
using ErrorPtr = std::shared_ptr<errors::Error>;
|
||||||
|
|
||||||
// tree? Yupe, Errors can be stackable which makes
|
// tree? Yupe, Errors can be stackable which makes a vector of them a tree
|
||||||
using ErrorTree = std::vector<ErrorPtr>;
|
using ErrorTree = std::vector<ErrorPtr>;
|
||||||
|
|
||||||
using MaybeNode = Result<Node, ErrorTree>;
|
using MaybeNode = Result<Node, ErrorTree>;
|
||||||
|
@ -53,6 +53,7 @@ using Ast = std::vector<Node>;
|
||||||
using MaybeAst = Result<Ast, ErrorTree>;
|
using MaybeAst = Result<Ast, ErrorTree>;
|
||||||
|
|
||||||
static auto EmptyNode = MaybeNode::success(nullptr);
|
static auto EmptyNode = MaybeNode::success(nullptr);
|
||||||
|
|
||||||
/// The base class of the expressions which provides the common interface for
|
/// The base class of the expressions which provides the common interface for
|
||||||
/// the expressions to implement.
|
/// the expressions to implement.
|
||||||
class Expression {
|
class Expression {
|
||||||
|
@ -80,6 +81,10 @@ public:
|
||||||
/// \param ctx is the context object of the semantic analyzer.
|
/// \param ctx is the context object of the semantic analyzer.
|
||||||
virtual MaybeNode analyze(SereneContext &ctx) = 0;
|
virtual MaybeNode analyze(SereneContext &ctx) = 0;
|
||||||
|
|
||||||
|
/// Genenates the correspondig SLIR of the expressoin and attach it to the
|
||||||
|
/// module of the given namespace.
|
||||||
|
///
|
||||||
|
/// \param ns The namespace that current expression is in it.
|
||||||
virtual void generateIR(serene::Namespace &ns) = 0;
|
virtual void generateIR(serene::Namespace &ns) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -97,7 +102,6 @@ template <typename T, typename... Args>
|
||||||
Node make(Args &&...args) {
|
Node make(Args &&...args) {
|
||||||
return std::make_shared<T>(std::forward<Args>(args)...);
|
return std::make_shared<T>(std::forward<Args>(args)...);
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Create a new `node` of type `T` and forwards any given parameter
|
/// Create a new `node` of type `T` and forwards any given parameter
|
||||||
/// to the constructor of type `T`. This is the **official way** to create
|
/// to the constructor of type `T`. This is the **official way** to create
|
||||||
/// a new `Expression`. Here is an example:
|
/// a new `Expression`. Here is an example:
|
||||||
|
|
|
@ -28,8 +28,7 @@
|
||||||
#include "serene/context.h"
|
#include "serene/context.h"
|
||||||
#include "serene/exprs/expression.h"
|
#include "serene/exprs/expression.h"
|
||||||
|
|
||||||
#include "llvm/ADT/Optional.h"
|
#include <llvm/ADT/Optional.h>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace serene {
|
namespace serene {
|
||||||
|
@ -59,21 +58,31 @@ public:
|
||||||
size_t count() const;
|
size_t count() const;
|
||||||
|
|
||||||
Ast from(uint begin);
|
Ast from(uint begin);
|
||||||
// llvm::MutableArrayRef<Expression> from(uint begin);
|
|
||||||
|
|
||||||
llvm::Optional<Expression *> at(uint index);
|
llvm::Optional<Expression *> at(uint index);
|
||||||
|
|
||||||
|
/// Return an iterator to be used with the `for` loop. It's implicitly called
|
||||||
|
/// by the for loop.
|
||||||
std::vector<Node>::const_iterator cbegin();
|
std::vector<Node>::const_iterator cbegin();
|
||||||
|
|
||||||
|
/// Return an iterator to be used with the `for` loop. It's implicitly called
|
||||||
|
/// by the for loop.
|
||||||
std::vector<Node>::const_iterator cend();
|
std::vector<Node>::const_iterator cend();
|
||||||
|
|
||||||
|
/// Return an iterator to be used with the `for` loop. It's implicitly called
|
||||||
|
/// by the for loop.
|
||||||
std::vector<Node>::iterator begin();
|
std::vector<Node>::iterator begin();
|
||||||
|
|
||||||
|
/// Return an iterator to be used with the `for` loop. It's implicitly called
|
||||||
|
/// by the for loop.
|
||||||
std::vector<Node>::iterator end();
|
std::vector<Node>::iterator end();
|
||||||
|
|
||||||
MaybeNode analyze(SereneContext &);
|
MaybeNode analyze(SereneContext &);
|
||||||
void generateIR(serene::Namespace &){};
|
void generateIR(serene::Namespace &){};
|
||||||
|
|
||||||
static bool classof(const Expression *e);
|
|
||||||
|
|
||||||
~List() = default;
|
~List() = default;
|
||||||
|
|
||||||
|
static bool classof(const Expression *e);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace exprs
|
} // namespace exprs
|
||||||
|
|
|
@ -29,10 +29,9 @@
|
||||||
#include "serene/exprs/expression.h"
|
#include "serene/exprs/expression.h"
|
||||||
#include "serene/namespace.h"
|
#include "serene/namespace.h"
|
||||||
|
|
||||||
#include "llvm/Support/FormatVariadic.h"
|
#include <llvm/Support/FormatVariadic.h>
|
||||||
|
|
||||||
namespace serene {
|
namespace serene {
|
||||||
|
|
||||||
namespace exprs {
|
namespace exprs {
|
||||||
|
|
||||||
/// This data structure represent a number. I handles float points, integers,
|
/// This data structure represent a number. I handles float points, integers,
|
||||||
|
@ -40,7 +39,8 @@ namespace exprs {
|
||||||
/// So it won't cast to actual numeric types and it has a string container
|
/// So it won't cast to actual numeric types and it has a string container
|
||||||
/// to hold the parsed value.
|
/// to hold the parsed value.
|
||||||
struct Number : public Expression {
|
struct Number : public Expression {
|
||||||
// TODO: Use a variant here instead
|
|
||||||
|
// TODO: Use a variant here instead to store different number types
|
||||||
std::string value;
|
std::string value;
|
||||||
|
|
||||||
bool isNeg;
|
bool isNeg;
|
||||||
|
@ -52,15 +52,16 @@ struct Number : public Expression {
|
||||||
|
|
||||||
ExprType getType() const;
|
ExprType getType() const;
|
||||||
std::string toString() const;
|
std::string toString() const;
|
||||||
MaybeNode analyze(SereneContext &ctx);
|
|
||||||
|
|
||||||
static bool classof(const Expression *e);
|
MaybeNode analyze(SereneContext &ctx);
|
||||||
|
void generateIR(serene::Namespace &);
|
||||||
|
|
||||||
// TODO: This is horrible, we need to fix it after the mvp
|
// TODO: This is horrible, we need to fix it after the mvp
|
||||||
int toI64();
|
int toI64();
|
||||||
|
|
||||||
void generateIR(serene::Namespace &);
|
|
||||||
~Number() = default;
|
~Number() = default;
|
||||||
|
|
||||||
|
static bool classof(const Expression *e);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace exprs
|
} // namespace exprs
|
||||||
|
|
|
@ -28,8 +28,7 @@
|
||||||
#include "serene/context.h"
|
#include "serene/context.h"
|
||||||
#include "serene/exprs/expression.h"
|
#include "serene/exprs/expression.h"
|
||||||
|
|
||||||
#include "llvm/ADT/StringRef.h"
|
#include <llvm/ADT/StringRef.h>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace serene {
|
namespace serene {
|
||||||
|
@ -51,12 +50,12 @@ public:
|
||||||
ExprType getType() const;
|
ExprType getType() const;
|
||||||
std::string toString() const;
|
std::string toString() const;
|
||||||
|
|
||||||
static bool classof(const Expression *e);
|
|
||||||
|
|
||||||
MaybeNode analyze(SereneContext &);
|
MaybeNode analyze(SereneContext &);
|
||||||
void generateIR(serene::Namespace &){};
|
void generateIR(serene::Namespace &){};
|
||||||
|
|
||||||
~Symbol() = default;
|
~Symbol() = default;
|
||||||
|
|
||||||
|
static bool classof(const Expression *e);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace exprs
|
} // namespace exprs
|
||||||
|
|
|
@ -31,11 +31,10 @@
|
||||||
#include "serene/exprs/fn.h"
|
#include "serene/exprs/fn.h"
|
||||||
#include "serene/exprs/symbol.h"
|
#include "serene/exprs/symbol.h"
|
||||||
|
|
||||||
#include "llvm/Support/Casting.h"
|
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
|
||||||
#include "llvm/Support/FormatVariadic.h"
|
|
||||||
|
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <llvm/Support/Casting.h>
|
||||||
|
#include <llvm/Support/ErrorHandling.h>
|
||||||
|
#include <llvm/Support/FormatVariadic.h>
|
||||||
|
|
||||||
namespace serene {
|
namespace serene {
|
||||||
namespace exprs {
|
namespace exprs {
|
||||||
|
@ -91,20 +90,12 @@ bool List::classof(const Expression *e) {
|
||||||
return e->getType() == ExprType::List;
|
return e->getType() == ExprType::List;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Return an iterator to be used with the `for` loop. It's implicitly called by
|
|
||||||
/// the for loop.
|
|
||||||
std::vector<Node>::const_iterator List::cbegin() { return elements.begin(); }
|
std::vector<Node>::const_iterator List::cbegin() { return elements.begin(); }
|
||||||
|
|
||||||
/// Return an iterator to be used with the `for` loop. It's implicitly called by
|
|
||||||
/// the for loop.
|
|
||||||
std::vector<Node>::const_iterator List::cend() { return elements.end(); }
|
std::vector<Node>::const_iterator List::cend() { return elements.end(); }
|
||||||
|
|
||||||
/// Return an iterator to be used with the `for` loop. It's implicitly called by
|
|
||||||
/// the for loop.
|
|
||||||
std::vector<Node>::iterator List::begin() { return elements.begin(); }
|
std::vector<Node>::iterator List::begin() { return elements.begin(); }
|
||||||
|
|
||||||
/// Return an iterator to be used with the `for` loop. It's implicitly called by
|
|
||||||
/// the for loop.
|
|
||||||
std::vector<Node>::iterator List::end() { return elements.end(); }
|
std::vector<Node>::iterator List::end() { return elements.end(); }
|
||||||
|
|
||||||
size_t List::count() const { return elements.size(); }
|
size_t List::count() const { return elements.size(); }
|
||||||
|
@ -118,7 +109,6 @@ llvm::Optional<Expression *> List::at(uint index) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Ast List::from(uint index) {
|
Ast List::from(uint index) {
|
||||||
|
|
||||||
if (index < elements.size()) {
|
if (index < elements.size()) {
|
||||||
return Ast(elements.begin() + index, elements.end());
|
return Ast(elements.begin() + index, elements.end());
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,9 @@
|
||||||
|
|
||||||
#include "serene/exprs/symbol.h"
|
#include "serene/exprs/symbol.h"
|
||||||
|
|
||||||
#include "llvm/Support/FormatVariadic.h"
|
#include "llvm/Support/Casting.h"
|
||||||
|
|
||||||
|
#include <llvm/Support/FormatVariadic.h>
|
||||||
|
|
||||||
namespace serene {
|
namespace serene {
|
||||||
namespace exprs {
|
namespace exprs {
|
||||||
|
|
Loading…
Reference in New Issue