summaryrefslogtreecommitdiffstats
path: root/articles/xerl-0.1-empty-modules/index.html
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2018-06-13 09:54:12 +0200
committerLoïc Hoguin <[email protected]>2018-06-13 09:54:12 +0200
commit92b54aacc0de5446dd5497c39897b0bbff72e626 (patch)
treec3a98cfec636d1271f5804e5c19b35b208bba00d /articles/xerl-0.1-empty-modules/index.html
parent8b5c3dc972b99f174750123c9e4abc96259c34a9 (diff)
downloadninenines.eu-92b54aacc0de5446dd5497c39897b0bbff72e626.tar.gz
ninenines.eu-92b54aacc0de5446dd5497c39897b0bbff72e626.tar.bz2
ninenines.eu-92b54aacc0de5446dd5497c39897b0bbff72e626.zip
Rebuild using Asciideck
Diffstat (limited to 'articles/xerl-0.1-empty-modules/index.html')
-rw-r--r--articles/xerl-0.1-empty-modules/index.html183
1 files changed, 67 insertions, 116 deletions
diff --git a/articles/xerl-0.1-empty-modules/index.html b/articles/xerl-0.1-empty-modules/index.html
index 86d54924..281c134a 100644
--- a/articles/xerl-0.1-empty-modules/index.html
+++ b/articles/xerl-0.1-empty-modules/index.html
@@ -69,144 +69,95 @@
</p>
</header>
-<div class="paragraph"><p>Let&#8217;s build a programming language. I call it Xerl: eXtended ERLang.
-It&#8217;ll be an occasion for us to learn a few things, especially me.</p></div>
-<div class="paragraph"><p>Unlike in Erlang, in this language, everything is an expression.
-This means that modules and functions are expression, and indeed that
-you can have more than one module per file.</p></div>
-<div class="paragraph"><p>We are just starting, so let&#8217;s no go ahead of ourselves here. We&#8217;ll
-begin with writing the code allowing us to compile an empty module.</p></div>
-<div class="paragraph"><p>We will compile to Core Erlang: this is one of the many intermediate
-step your Erlang code compiles to before it becomes BEAM machine code.
-Core Erlang is a very neat language for machine generated code, and we
-will learn many things about it.</p></div>
-<div class="paragraph"><p>Today we will only focus on compiling the following code:</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight
+<p>Let&apos;s build a programming language. I call it Xerl: eXtended ERLang. It&apos;ll be an occasion for us to learn a few things, especially me.</p>
+<p>Unlike in Erlang, in this language, everything is an expression. This means that modules and functions are expression, and indeed that you can have more than one module per file.</p>
+<p>We are just starting, so let&apos;s no go ahead of ourselves here. We&apos;ll begin with writing the code allowing us to compile an empty module.</p>
+<p>We will compile to Core Erlang: this is one of the many intermediate step your Erlang code compiles to before it becomes BEAM machine code. Core Erlang is a very neat language for machine generated code, and we will learn many things about it.</p>
+<p>Today we will only focus on compiling the following code:</p>
+<div class="listingblock"><div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><tt><span style="color: #FF6600">mod</span> <span style="color: #FF6600">my_module</span>
-<span style="font-weight: bold"><span style="color: #0000FF">begin</span></span>
-<span style="font-weight: bold"><span style="color: #0000FF">end</span></span></tt></pre></div></div>
-<div class="paragraph"><p>Compilation will be done in a few steps. First, the source file will
-be transformed in a tree of tokens by the lexer. Then, the parser will
-use that tree of tokens and convert it to the AST, bringing semantical
-meaning to our representation. Finally, the code generator will transform
-this AST to Core Erlang AST, which will then be compiled.</p></div>
-<div class="paragraph"><p>We will use <em>leex</em> for the lexer. This lexer uses .xrl files
-which are then compiled to .erl files that you can then compile to BEAM.
-The file is divided in three parts: definitions, rules and Erlang code.
-Definitions and Erlang code are obvious; rules are what concerns us.</p></div>
-<div class="paragraph"><p>We only need two things: atoms and whitespaces. Atoms are a lowercase
-letter followed by any letter, number, _ or @. Whitespace is either a
-space, an horizontal tab, \r or \n. There exists other kinds of whitespaces
-but we simply do not allow them in the Xerl language.</p></div>
-<div class="paragraph"><p>Rules consist of a regular expression followed by Erlang code. The
-latter must return a token representation or the atom <code>skip_token</code>.</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight
+<pre><tt><font color="#FF6600">mod</font> <font color="#FF6600">my_module</font>
+<b><font color="#0000FF">begin</font></b>
+<b><font color="#0000FF">end</font></b></tt></pre>
+</div></div>
+<p>Compilation will be done in a few steps. First, the source file will be transformed in a tree of tokens by the lexer. Then, the parser will use that tree of tokens and convert it to the AST, bringing semantical meaning to our representation. Finally, the code generator will transform this AST to Core Erlang AST, which will then be compiled.</p>
+<p>We will use <em>leex</em> for the lexer. This lexer uses .xrl files which are then compiled to .erl files that you can then compile to BEAM. The file is divided in three parts: definitions, rules and Erlang code. Definitions and Erlang code are obvious; rules are what concerns us.</p>
+<p>We only need two things: atoms and whitespaces. Atoms are a lowercase letter followed by any letter, number, _ or @. Whitespace is either a space, an horizontal tab, \r or \n. There exists other kinds of whitespaces but we simply do not allow them in the Xerl language.</p>
+<p>Rules consist of a regular expression followed by Erlang code. The latter must return a token representation or the atom <code>skip_token</code>.</p>
+<div class="listingblock"><div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><tt>{<span style="color: #009900">L</span>}{<span style="color: #009900">A</span>}<span style="color: #990000">*</span> <span style="color: #990000">:</span>
- <span style="color: #009900">Atom</span> <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000080">list_to_atom</span></span>(<span style="color: #009900">TokenChars</span>),
- {<span style="color: #FF6600">token</span>, <span style="font-weight: bold"><span style="color: #0000FF">case</span></span> <span style="font-weight: bold"><span style="color: #000000">reserved_word</span></span>(<span style="color: #009900">Atom</span>) <span style="font-weight: bold"><span style="color: #0000FF">of</span></span>
- <span style="color: #000080">true</span> <span style="color: #990000">-&gt;</span> {<span style="color: #009900">Atom</span>, <span style="color: #009900">TokenLine</span>};
- <span style="color: #000080">false</span> <span style="color: #990000">-&gt;</span> {<span style="font-weight: bold"><span style="color: #000080">atom</span></span>, <span style="color: #009900">TokenLine</span>, <span style="color: #009900">Atom</span>}
- <span style="font-weight: bold"><span style="color: #0000FF">end</span></span>}<span style="color: #990000">.</span>
+<pre><tt>{<font color="#009900">L</font>}{<font color="#009900">A</font>}<font color="#990000">*</font> <font color="#990000">:</font>
+ <font color="#009900">Atom</font> <font color="#990000">=</font> <b><font color="#000080">list_to_atom</font></b>(<font color="#009900">TokenChars</font>),
+ {<font color="#FF6600">token</font>, <b><font color="#0000FF">case</font></b> <b><font color="#000000">reserved_word</font></b>(<font color="#009900">Atom</font>) <b><font color="#0000FF">of</font></b>
+ <font color="#000080">true</font> <font color="#990000">-&gt;</font> {<font color="#009900">Atom</font>, <font color="#009900">TokenLine</font>};
+ <font color="#000080">false</font> <font color="#990000">-&gt;</font> {<b><font color="#000080">atom</font></b>, <font color="#009900">TokenLine</font>, <font color="#009900">Atom</font>}
+ <b><font color="#0000FF">end</font></b>}<font color="#990000">.</font>
-{<span style="color: #009900">WS</span>}<span style="color: #990000">+</span> <span style="color: #990000">:</span> <span style="color: #FF6600">skip_token</span><span style="color: #990000">.</span></tt></pre></div></div>
-<div class="paragraph"><p>The first rule matches an atom, which is converted to either a special
-representation for reserved words, or an atom tuple. The
-<code>TokenChars</code> variable represents the match as a string, and
-the <code>TokenLine</code> variable contains the line number.
-<a href="https://github.com/extend/xerl/blob/0.1/src/xerl_lexer.xrl">View the complete file</a>.</p></div>
-<div class="paragraph"><p>We obtain the following result from the lexer:</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight
+{<font color="#009900">WS</font>}<font color="#990000">+</font> <font color="#990000">:</font> <font color="#FF6600">skip_token</font><font color="#990000">.</font></tt></pre>
+</div></div>
+<p>The first rule matches an atom, which is converted to either a special representation for reserved words, or an atom tuple. The <code>TokenChars</code> variable represents the match as a string, and the <code>TokenLine</code> variable contains the line number. <a href="https://github.com/extend/xerl/blob/0.1/src/xerl_lexer.xrl">View the complete file</a>.</p>
+<p>We obtain the following result from the lexer:</p>
+<div class="listingblock"><div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><tt>[{<span style="color: #FF6600">mod</span>,<span style="color: #993399">1</span>},{<span style="font-weight: bold"><span style="color: #000080">atom</span></span>,<span style="color: #993399">1</span>,<span style="color: #FF6600">my_module</span>},{<span style="color: #FF6600">'begin'</span>,<span style="color: #993399">2</span>},{<span style="color: #FF6600">'end'</span>,<span style="color: #993399">3</span>}]</tt></pre></div></div>
-<div class="paragraph"><p>The second step is to parse this list of tokens to add semantic meaning
-and generate what is called an <em>abstract syntax tree</em>. We will be
-using the <em>yecc</em> parser generator for this. This time it will take
-.yrl files but the process is the same as before. The file is a little
-more complex than for the lexer, we need to define at the very least
-terminals, nonterminals and root symbols, the grammar itself, and
-optionally some Erlang code.</p></div>
-<div class="paragraph"><p>To compile our module, we need a few things. First, everything is an
-expression. We thus need list of expressions and individual expressions.
-We will support a single expression for now, the <code>mod</code>
-expression which defines a module. And that&#8217;s it! We end up with the
-following grammar:</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight
+<pre><tt>[{<font color="#FF6600">mod</font>,<font color="#993399">1</font>},{<b><font color="#000080">atom</font></b>,<font color="#993399">1</font>,<font color="#FF6600">my_module</font>},{<font color="#FF6600">'begin'</font>,<font color="#993399">2</font>},{<font color="#FF6600">'end'</font>,<font color="#993399">3</font>}]</tt></pre>
+</div></div>
+<p>The second step is to parse this list of tokens to add semantic meaning and generate what is called an <em>abstract syntax tree</em>. We will be using the <em>yecc</em> parser generator for this. This time it will take .yrl files but the process is the same as before. The file is a little more complex than for the lexer, we need to define at the very least terminals, nonterminals and root symbols, the grammar itself, and optionally some Erlang code.</p>
+<p>To compile our module, we need a few things. First, everything is an expression. We thus need list of expressions and individual expressions. We will support a single expression for now, the <code>mod</code> expression which defines a module. And that&apos;s it! We end up with the following grammar:</p>
+<div class="listingblock"><div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><tt><span style="color: #FF6600">exprs</span> <span style="color: #990000">-&gt;</span> <span style="color: #FF6600">expr</span> <span style="color: #990000">:</span> [<span style="color: #FF6600">'$1'</span>]<span style="color: #990000">.</span>
-<span style="color: #FF6600">exprs</span> <span style="color: #990000">-&gt;</span> <span style="color: #FF6600">expr</span> <span style="color: #FF6600">exprs</span> <span style="color: #990000">:</span> [<span style="color: #FF6600">'$1'</span> | <span style="color: #FF6600">'$2'</span>]<span style="color: #990000">.</span>
+<pre><tt><font color="#FF6600">exprs</font> <font color="#990000">-&gt;</font> <font color="#FF6600">expr</font> <font color="#990000">:</font> [<font color="#FF6600">'$1'</font>]<font color="#990000">.</font>
+<font color="#FF6600">exprs</font> <font color="#990000">-&gt;</font> <font color="#FF6600">expr</font> <font color="#FF6600">exprs</font> <font color="#990000">:</font> [<font color="#FF6600">'$1'</font> | <font color="#FF6600">'$2'</font>]<font color="#990000">.</font>
-<span style="color: #FF6600">expr</span> <span style="color: #990000">-&gt;</span> <span style="color: #FF6600">module</span> <span style="color: #990000">:</span> <span style="color: #FF6600">'$1'</span><span style="color: #990000">.</span>
+<font color="#FF6600">expr</font> <font color="#990000">-&gt;</font> <font color="#FF6600">module</font> <font color="#990000">:</font> <font color="#FF6600">'$1'</font><font color="#990000">.</font>
-<span style="color: #FF6600">module</span> <span style="color: #990000">-&gt;</span> <span style="color: #FF6600">'mod'</span> <span style="font-weight: bold"><span style="color: #000080">atom</span></span> <span style="color: #FF6600">'begin'</span> <span style="color: #FF6600">'end'</span> <span style="color: #990000">:</span>
- {<span style="color: #FF6600">'mod'</span>, <span style="font-weight: bold"><span style="color: #000080">?line</span></span>(<span style="color: #FF6600">'$1'</span>), <span style="color: #FF6600">'$2'</span>, []}<span style="color: #990000">.</span></tt></pre></div></div>
-<div class="paragraph"><p><a href="https://github.com/extend/xerl/blob/0.1/src/xerl_parser.yrl">View the complete file</a>.</p></div>
-<div class="paragraph"><p>We obtain the following result from the parser:</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight
+<font color="#FF6600">module</font> <font color="#990000">-&gt;</font> <font color="#FF6600">'mod'</font> <b><font color="#000080">atom</font></b> <font color="#FF6600">'begin'</font> <font color="#FF6600">'end'</font> <font color="#990000">:</font>
+ {<font color="#FF6600">'mod'</font>, <b><font color="#000080">?line</font></b>(<font color="#FF6600">'$1'</font>), <font color="#FF6600">'$2'</font>, []}<font color="#990000">.</font></tt></pre>
+</div></div>
+<p><a href="https://github.com/extend/xerl/blob/0.1/src/xerl_parser.yrl">View the complete file</a>.</p>
+<p>We obtain the following result from the parser:</p>
+<div class="listingblock"><div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><tt>[{<span style="color: #FF6600">mod</span>,<span style="color: #993399">1</span>,{<span style="font-weight: bold"><span style="color: #000080">atom</span></span>,<span style="color: #993399">1</span>,<span style="color: #FF6600">my_module</span>},[]}]</tt></pre></div></div>
-<div class="paragraph"><p>We obtain a list of a single <code>mod</code> expression. Just like
-we wanted. Last step is generating the Core Erlang code from it.</p></div>
-<div class="paragraph"><p>Code generation generally is comprised of several steps. We will
-discuss these in more details later on. For now, we will focus on the
-minimal needed for successful compilation.</p></div>
-<div class="paragraph"><p>We can use the <code>cerl</code> module to generate Core Erlang AST.
-We will simply be using functions, which allows us to avoid learning
-and keeping up to date with the internal representation.</p></div>
-<div class="paragraph"><p>There&#8217;s one important thing to do when generating Core Erlang AST
-for a module: create the <code>module_info/{0,1}</code> functions.
-Indeed, these are added to Erlang before it becomes Core Erlang, and
-so we need to replicate this ourselves. Do not be concerned however,
-as this only takes a few lines of extra code.</p></div>
-<div class="paragraph"><p>As you can see by
-<a href="https://github.com/extend/xerl/blob/0.1/src/xerl_codegen.erl">looking at the complete file</a>,
-the code generator echoes the grammar we defined in the parser, and
-simply applies the appropriate Core Erlang functions for each expressions.</p></div>
-<div class="paragraph"><p>We obtain the following pretty-printed Core Erlang generated code:</p></div>
-<div class="listingblock">
-<div class="content"><!-- Generator: GNU source-highlight
+<pre><tt>[{<font color="#FF6600">mod</font>,<font color="#993399">1</font>,{<b><font color="#000080">atom</font></b>,<font color="#993399">1</font>,<font color="#FF6600">my_module</font>},[]}]</tt></pre>
+</div></div>
+<p>We obtain a list of a single <code>mod</code> expression. Just like we wanted. Last step is generating the Core Erlang code from it.</p>
+<p>Code generation generally is comprised of several steps. We will discuss these in more details later on. For now, we will focus on the minimal needed for successful compilation.</p>
+<p>We can use the <code>cerl</code> module to generate Core Erlang AST. We will simply be using functions, which allows us to avoid learning and keeping up to date with the internal representation.</p>
+<p>There&apos;s one important thing to do when generating Core Erlang AST for a module: create the <code>module_info/{0,1}</code> functions. Indeed, these are added to Erlang before it becomes Core Erlang, and so we need to replicate this ourselves. Do not be concerned however, as this only takes a few lines of extra code.</p>
+<p>As you can see by <a href="https://github.com/extend/xerl/blob/0.1/src/xerl_codegen.erl">looking at the complete file</a>, the code generator echoes the grammar we defined in the parser, and simply applies the appropriate Core Erlang functions for each expressions.</p>
+<p>We obtain the following pretty-printed Core Erlang generated code:</p>
+<div class="listingblock"><div class="content"><!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><tt><span style="color: #FF6600">module</span> <span style="color: #FF6600">'my_module'</span> [<span style="color: #FF6600">'module_info'</span><span style="color: #990000">/</span><span style="color: #993399">0</span>,
- <span style="color: #FF6600">'module_info'</span><span style="color: #990000">/</span><span style="color: #993399">1</span>]
- <span style="color: #FF6600">attributes</span> []
-<span style="color: #FF6600">'module_info'</span><span style="color: #990000">/</span><span style="color: #993399">0</span> <span style="color: #990000">=</span>
- <span style="font-weight: bold"><span style="color: #0000FF">fun</span></span> () <span style="color: #990000">-&gt;</span>
- <span style="font-weight: bold"><span style="color: #000080">call</span></span> <span style="color: #FF6600">'erlang'</span><span style="color: #990000">:</span><span style="color: #FF6600">'get_module_info'</span>
- (<span style="color: #FF6600">'empty_module'</span>)
-<span style="color: #FF6600">'module_info'</span><span style="color: #990000">/</span><span style="color: #993399">1</span> <span style="color: #990000">=</span>
- <span style="font-weight: bold"><span style="color: #0000FF">fun</span></span> (<span style="color: #009900">Key</span>) <span style="color: #990000">-&gt;</span>
- <span style="font-weight: bold"><span style="color: #000080">call</span></span> <span style="color: #FF6600">'erlang'</span><span style="color: #990000">:</span><span style="color: #FF6600">'get_module_info'</span>
- (<span style="color: #FF6600">'empty_module'</span>, <span style="color: #009900">Key</span>)
-<span style="font-weight: bold"><span style="color: #0000FF">end</span></span></tt></pre></div></div>
-<div class="paragraph"><p>For convenience I added all the steps in a <code>xerl:compile/1</code>
-function that you can use against your own .xerl files.</p></div>
-<div class="paragraph"><p>That&#8217;s it for today! We will go into more details over each steps in
-the next few articles.</p></div>
-<div class="ulist"><ul>
-<li>
-<p>
-<a href="https://github.com/extend/xerl/blob/0.1/">View the source</a>
-</p>
+<pre><tt><font color="#FF6600">module</font> <font color="#FF6600">'my_module'</font> [<font color="#FF6600">'module_info'</font><font color="#990000">/</font><font color="#993399">0</font>,
+ <font color="#FF6600">'module_info'</font><font color="#990000">/</font><font color="#993399">1</font>]
+ <font color="#FF6600">attributes</font> []
+<font color="#FF6600">'module_info'</font><font color="#990000">/</font><font color="#993399">0</font> <font color="#990000">=</font>
+ <b><font color="#0000FF">fun</font></b> () <font color="#990000">-&gt;</font>
+ <b><font color="#000080">call</font></b> <font color="#FF6600">'erlang'</font><font color="#990000">:</font><font color="#FF6600">'get_module_info'</font>
+ (<font color="#FF6600">'empty_module'</font>)
+<font color="#FF6600">'module_info'</font><font color="#990000">/</font><font color="#993399">1</font> <font color="#990000">=</font>
+ <b><font color="#0000FF">fun</font></b> (<font color="#009900">Key</font>) <font color="#990000">-&gt;</font>
+ <b><font color="#000080">call</font></b> <font color="#FF6600">'erlang'</font><font color="#990000">:</font><font color="#FF6600">'get_module_info'</font>
+ (<font color="#FF6600">'empty_module'</font>, <font color="#009900">Key</font>)
+<b><font color="#0000FF">end</font></b></tt></pre>
+</div></div>
+<p>For convenience I added all the steps in a <code>xerl:compile/1</code> function that you can use against your own .xerl files.</p>
+<p>That&apos;s it for today! We will go into more details over each steps in the next few articles.</p>
+<ul><li><a href="https://github.com/extend/xerl/blob/0.1/">View the source</a>
</li>
-</ul></div>
+</ul>
+
</article>
</div>