blob: 520a2349761e5d0ffdfc0dd551d0eff2537266fc (
plain) (
tree)
|
|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
<title>Nine Nines: Xerl: expression separator</title>
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
<link href="/css/99s.css?r=2" rel="stylesheet">
<link rel="shortcut icon" href="/img/ico/favicon.ico">
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
<link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
</head>
<body class="">
<header id="page-head">
<div id="topbar" class="container">
<div class="row">
<div class="span2">
<h1 id="logo"><a href="/" title="99s">99s</a></h1>
</div>
<div class="span10">
<div id="side-header">
<nav>
<ul>
<li class="active"><a title="Hear my thoughts" href="/articles">Articles</a></li>
<li><a title="Watch my talks" href="/talks">Talks</a></li>
<li><a title="Read the docs" href="/docs">Documentation</a></li>
<li><a title="Request my services" href="/services">Consulting & Training</a></li>
</ul>
</nav>
<ul id="social">
<li>
<a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
</li>
<li>
<a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
</li>
</ul>
</div>
</div>
</div>
</div>
</header>
<div id="contents">
<div class="container">
<div class="row">
<div class="span9 maincol">
<article class="blog_item">
<header>
<h1 class="lined-header"><span>Xerl: expression separator</span></h1>
<p class="date">
<span class="year">2013</span>
<span class="day-month">01 Mar</span>
</p>
</header>
<p>As promised we are adding an expression separator this time. This will be short and easy.</p>
<p>In the tokenizer we only need to add a line recognizing the comma as a valid token.</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>, <font color="#990000">:</font> {<font color="#FF6600">token</font>, {<font color="#FF6600">','</font>, <font color="#009900">TokenLine</font>}}<font color="#990000">.</font></tt></pre>
</div></div>
<p>Then we need to change the following lines in 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><font color="#FF6600">exprs</font> <font color="#990000">-></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">-></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></tt></pre>
</div></div>
<p>And add a comma between the expressions on the second line:</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><font color="#FF6600">exprs</font> <font color="#990000">-></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">-></font> <font color="#FF6600">expr</font> <font color="#FF6600">','</font> <font color="#FF6600">exprs</font> <font color="#990000">:</font> [<font color="#FF6600">'$1'</font> | <font color="#FF6600">'$3'</font>]<font color="#990000">.</font></tt></pre>
</div></div>
<p>That takes care of everything except the optional trailing comma at the end of our lists of expressions. We just need an additional rule to take care of this.</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><font color="#FF6600">exprs</font> <font color="#990000">-></font> <font color="#FF6600">expr</font> <font color="#FF6600">','</font> <font color="#990000">:</font> [<font color="#FF6600">'$1'</font>]<font color="#990000">.</font></tt></pre>
</div></div>
<p>That's it.</p>
<p>Wondering why we don't have this optional trailing comma in Erlang considering how easy it was and the number of people complaining about it? Yeah, me too. But that's for someone else to answer.</p>
<p>Another change I want to talk about is a simple modification of the compiler code to use an <code>#env{}</code> record for tracking state instead of passing around individual variables. This will be required later on when we make modules into proper expressions so I thought it was a good idea to anticipate.</p>
<ul><li><a href="https://github.com/extend/xerl/blob/0.4/">View the source</a>
</li>
</ul>
</article>
</div>
<div class="span3 sidecol">
<h3>More articles</h3>
<ul id="articles-nav" class="extra_margin">
<li><a href="https://ninenines.eu/articles/cowboy-2.6.0/">Cowboy 2.6</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.7.0/">Ranch 1.7</a></li>
<li><a href="https://ninenines.eu/articles/cowboy-2.5.0/">Cowboy 2.5</a></li>
<li><a href="https://ninenines.eu/articles/gun-1.3.0/">Gun 1.3</a></li>
<li><a href="https://ninenines.eu/articles/gun-1.2.0/">Gun 1.2</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.6.0/">Ranch 1.6</a></li>
<li><a href="https://ninenines.eu/articles/gun-1.0.0/">Gun 1.0</a></li>
<li><a href="https://ninenines.eu/articles/asciideck/">Asciideck: Asciidoc for Erlang</a></li>
<li><a href="https://ninenines.eu/articles/gun-1.0.0-rc.1/">Gun 1.0 release candidate 1</a></li>
<li><a href="https://ninenines.eu/articles/cowboy-2.4.0/">Cowboy 2.4</a></li>
<li><a href="https://ninenines.eu/articles/cowboy-2.3.0/">Cowboy 2.3</a></li>
<li><a href="https://ninenines.eu/articles/cowboy-2.2.0/">Cowboy 2.2</a></li>
<li><a href="https://ninenines.eu/articles/cowboy-2.1.0/">Cowboy 2.1</a></li>
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0/">Cowboy 2.0</a></li>
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-rc.2/">Cowboy 2.0 release candidate 2</a></li>
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-rc.1/">Cowboy 2.0 release candidate 1</a></li>
<li><a href="https://ninenines.eu/articles/the-elephant-in-the-room/">The elephant in the room</a></li>
<li><a href="https://ninenines.eu/articles/dont-let-it-crash/">Don't let it crash</a></li>
<li><a href="https://ninenines.eu/articles/cowboy-2.0.0-pre.4/">Cowboy 2.0 pre-release 4</a></li>
<li><a href="https://ninenines.eu/articles/ranch-1.3/">Ranch 1.3</a></li>
<li><a href="https://ninenines.eu/articles/ml-archives/">Mailing list archived</a></li>
<li><a href="https://ninenines.eu/articles/website-update/">Website update</a></li>
<li><a href="https://ninenines.eu/articles/erlanger-playbook-september-2015-update/">The Erlanger Playbook September 2015 Update</a></li>
<li><a href="https://ninenines.eu/articles/erlanger-playbook/">The Erlanger Playbook</a></li>
<li><a href="https://ninenines.eu/articles/erlang-validate-utf8/">Validating UTF-8 binaries with Erlang</a></li>
<li><a href="https://ninenines.eu/articles/on-open-source/">On open source</a></li>
<li><a href="https://ninenines.eu/articles/the-story-so-far/">The story so far</a></li>
<li><a href="https://ninenines.eu/articles/cowboy2-qs/">Cowboy 2.0 and query strings</a></li>
<li><a href="https://ninenines.eu/articles/january-2014-status/">January 2014 status</a></li>
<li><a href="https://ninenines.eu/articles/farwest-funded/">Farwest got funded!</a></li>
<li><a href="https://ninenines.eu/articles/erlang.mk-and-relx/">Build Erlang releases with Erlang.mk and Relx</a></li>
<li><a href="https://ninenines.eu/articles/xerl-0.5-intermediate-module/">Xerl: intermediate module</a></li>
<li><a href="https://ninenines.eu/articles/xerl-0.4-expression-separator/">Xerl: expression separator</a></li>
<li><a href="https://ninenines.eu/articles/erlang-scalability/">Erlang Scalability</a></li>
<li><a href="https://ninenines.eu/articles/xerl-0.3-atomic-expressions/">Xerl: atomic expressions</a></li>
<li><a href="https://ninenines.eu/articles/xerl-0.2-two-modules/">Xerl: two modules</a></li>
<li><a href="https://ninenines.eu/articles/xerl-0.1-empty-modules/">Xerl: empty modules</a></li>
<li><a href="https://ninenines.eu/articles/ranch-ftp/">Build an FTP Server with Ranch in 30 Minutes</a></li>
<li><a href="https://ninenines.eu/articles/tictactoe/">Erlang Tic Tac Toe</a></li>
</ul>
<h3>Feedback</h3>
<p>Feel free to <a href="mailto:[email protected]">email us</a>
if you found any mistake or need clarification on any of the
articles.</p>
</div>
</div>
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="span6">
<p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
<nav>
<ul>
<li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
</ul>
</nav>
</div>
<div class="span6 credits">
<p><img src="/img/footer_logo.png"></p>
<p>Copyright © Loïc Hoguin 2012-2018</p>
</div>
</div>
</div>
</footer>
<script src="/js/custom.js"></script>
</body>
</html>
|