<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                      "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
  <title>Kaleidoscope: Tutorial Introduction and the Lexer</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta name="author" content="Chris Lattner">
  <meta name="author" content="Erick Tryzelaar">
  <link rel="stylesheet" href="../llvm.css" type="text/css">
</head>

<body>

<div class="doc_title">Kaleidoscope: Tutorial Introduction and the Lexer</div>

<ul>
<li><a href="index.html">Up to Tutorial Index</a></li>
<li>Chapter 1
  <ol>
    <li><a href="#intro">Tutorial Introduction</a></li>
    <li><a href="#language">The Basic Language</a></li>
    <li><a href="#lexer">The Lexer</a></li>
  </ol>
</li>
<li><a href="OCamlLangImpl2.html">Chapter 2</a>: Implementing a Parser and
AST</li>
</ul>

<div class="doc_author">
	<p>
		Written by <a href="mailto:sabre@nondot.org">Chris Lattner</a>
		and <a href="mailto:idadesub@users.sourceforge.net">Erick Tryzelaar</a>
	</p>
</div>

<!-- *********************************************************************** -->
<div class="doc_section"><a name="intro">Tutorial Introduction</a></div>
<!-- *********************************************************************** -->

<div class="doc_text">

<p>Welcome to the "Implementing a language with LLVM" tutorial.  This tutorial
runs through the implementation of a simple language, showing how fun and
easy it can be.  This tutorial will get you up and started as well as help to
build a framework you can extend to other languages.  The code in this tutorial
can also be used as a playground to hack on other LLVM specific things.
</p>

<p>
The goal of this tutorial is to progressively unveil our language, describing
how it is built up over time.  This will let us cover a fairly broad range of
language design and LLVM-specific usage issues, showing and explaining the code
for it all along the way, without overwhelming you with tons of details up
front.</p>

<p>It is useful to point out ahead of time that this tutorial is really about
teaching compiler techniques and LLVM specifically, <em>not</em> about teaching
modern and sane software engineering principles.  In practice, this means that
we'll take a number of shortcuts to simplify the exposition.  For example, the
code leaks memory, uses global variables all over the place, doesn't use nice
design patterns like <a
href="http://en.wikipedia.org/wiki/Visitor_pattern">visitors</a>, etc... but it
is very simple.  If you dig in and use the code as a basis for future projects,
fixing these deficiencies shouldn't be hard.</p>

<p>I've tried to put this tutorial together in a way that makes chapters easy to
skip over if you are already familiar with or are uninterested in the various
pieces.  The structure of the tutorial is:
</p>

<ul>
<li><b><a href="#language">Chapter #1</a>: Introduction to the Kaleidoscope
language, and the definition of its Lexer</b> - This shows where we are going
and the basic functionality that we want it to do.  In order to make this
tutorial maximally understandable and hackable, we choose to implement
everything in Objective Caml instead of using lexer and parser generators.
LLVM obviously works just fine with such tools, feel free to use one if you
prefer.</li>
<li><b><a href="OCamlLangImpl2.html">Chapter #2</a>: Implementing a Parser and
AST</b> - With the lexer in place, we can talk about parsing techniques and
basic AST construction.  This tutorial describes recursive descent parsing and
operator precedence parsing.  Nothing in Chapters 1 or 2 is LLVM-specific,
the code doesn't even link in LLVM at this point. :)</li>
<li><b><a href="OCamlLangImpl3.html">Chapter #3</a>: Code generation to LLVM
IR</b> - With the AST ready, we can show off how easy generation of LLVM IR
really is.</li>
<li><b><a href="OCamlLangImpl4.html">Chapter #4</a>: Adding JIT and Optimizer
Support</b> - Because a lot of people are interested in using LLVM as a JIT,
we'll dive right into it and show you the 3 lines it takes to add JIT support.
LLVM is also useful in many other ways, but this is one simple and "sexy" way
to shows off its power. :)</li>
<li><b><a href="OCamlLangImpl5.html">Chapter #5</a>: Extending the Language:
Control Flow</b> - With the language up and running, we show how to extend it
with control flow operations (if/then/else and a 'for' loop).  This gives us a
chance to talk about simple SSA construction and control flow.</li>
<li><b><a href="OCamlLangImpl6.html">Chapter #6</a>: Extending the Language:
User-defined Operators</b> - This is a silly but fun chapter that talks about
extending the language to let the user program define their own arbitrary
unary and binary operators (with assignable precedence!).  This lets us build a
significant piece of the "language" as library routines.</li>
<li><b><a href="OCamlLangImpl7.html">Chapter #7</a>: Extending the Language:
Mutable Variables</b> - This chapter talks about adding user-defined local
variables along with an assignment operator.  The interesting part about this
is how easy and trivial it is to construct SSA form in LLVM: no, LLVM does
<em>not</em> require your front-end to construct SSA form!</li>
<li><b><a href="OCamlLangImpl8.html">Chapter #8</a>: Conclusion and other
useful LLVM tidbits</b> - This chapter wraps up the series by talking about
potential ways to extend the language, but also includes a bunch of pointers to
info about "special topics" like adding garbage collection support, exceptions,
debugging, support for "spaghetti stacks", and a bunch of other tips and
tricks.</li>

</ul>

<p>By the end of the tutorial, we'll have written a bit less than 700 lines of
non-comment, non-blank, lines of code.  With this small amount of code, we'll
have built up a very reasonable compiler for a non-trivial language including
a hand-written lexer, parser, AST, as well as code generation support with a JIT
compiler.  While other systems may have interesting "hello world" tutorials,
I think the breadth of this tutorial is a great testament to the strengths of
LLVM and why you should consider it if you're interested in language or compiler
design.</p>

<p>A note about this tutorial: we expect you to extend the language and play
with it on your own.  Take the code and go crazy hacking away at it, compilers
don't need to be scary creatures - it can be a lot of fun to play with
languages!</p>

</div>

<!-- *********************************************************************** -->
<div class="doc_section"><a name="language">The Basic Language</a></div>
<!-- *********************************************************************** -->

<div class="doc_text">

<p>This tutorial will be illustrated with a toy language that we'll call
"<a href="http://en.wikipedia.org/wiki/Kaleidoscope">Kaleidoscope</a>" (derived
from "meaning beautiful, form, and view").
Kaleidoscope is a procedural language that allows you to define functions, use
conditionals, math, etc.  Over the course of the tutorial, we'll extend
Kaleidoscope to support the if/then/else construct, a for loop, user defined
operators, JIT compilation with a simple command line interface, etc.</p>

<p>Because we want to keep things simple, the only datatype in Kaleidoscope is a
64-bit floating point type (aka 'float' in O'Caml parlance).  As such, all
values are implicitly double precision and the language doesn't require type
declarations.  This gives the language a very nice and simple syntax.  For
example, the following simple example computes <a
href="http://en.wikipedia.org/wiki/Fibonacci_number">Fibonacci numbers:</a></p>

<div class="doc_code">
<pre>
# Compute the x'th fibonacci number.
def fib(x)
  if x &lt; 3 then
    1
  else
    fib(x-1)+fib(x-2)

# This expression will compute the 40th number.
fib(40)
</pre>
</div>

<p>We also allow Kaleidoscope to call into standard library functions (the LLVM
JIT makes this completely trivial).  This means that you can use the 'extern'
keyword to define a function before you use it (this is also useful for mutually
recursive functions).  For example:</p>

<div class="doc_code">
<pre>
extern sin(arg);
extern cos(arg);
extern atan2(arg1 arg2);

atan2(sin(.4), cos(42))
</pre>
</div>

<p>A more interesting example is included in Chapter 6 where we write a little
Kaleidoscope application that <a href="OCamlLangImpl6.html#example">displays
a Mandelbrot Set</a> at various levels of magnification.</p>

<p>Lets dive into the implementation of this language!</p>

</div>

<!-- *********************************************************************** -->
<div class="doc_section"><a name="lexer">The Lexer</a></div>
<!-- *********************************************************************** -->

<div class="doc_text">

<p>When it comes to implementing a language, the first thing needed is
the ability to process a text file and recognize what it says.  The traditional
way to do this is to use a "<a
href="http://en.wikipedia.org/wiki/Lexical_analysis">lexer</a>" (aka 'scanner')
to break the input up into "tokens".  Each token returned by the lexer includes
a token code and potentially some metadata (e.g. the numeric value of a number).
First, we define the possibilities:
</p>

<div class="doc_code">
<pre>
(* The lexer returns these 'Kwd' if it is an unknown character, otherwise one of
 * these others for known things. *)
type token =
  (* commands *)
  | Def | Extern

  (* primary *)
  | Ident of string | Number of float

  (* unknown *)
  | Kwd of char
</pre>
</div>

<p>Each token returned by our lexer will be one of the token variant values.
An unknown character like '+' will be returned as <tt>Token.Kwd '+'</tt>.  If
the curr token is an identifier, the value will be <tt>Token.Ident s</tt>.  If
the current token is a numeric literal (like 1.0), the value will be
<tt>Token.Number 1.0</tt>.
</p>

<p>The actual implementation of the lexer is a collection of functions driven
by a function named <tt>Lexer.lex</tt>.  The <tt>Lexer.lex</tt> function is
called to return the next token from standard input.  We will use
<a href="http://caml.inria.fr/pub/docs/manual-camlp4/index.html">Camlp4</a>
to simplify the tokenization of the standard input.  Its definition starts
as:</p>

<div class="doc_code">
<pre>
(*===----------------------------------------------------------------------===
 * Lexer
 *===----------------------------------------------------------------------===*)

let rec lex = parser
  (* Skip any whitespace. *)
  | [&lt; ' (' ' | '\n' | '\r' | '\t'); stream &gt;] -&gt; lex stream
</pre>
</div>

<p>
<tt>Lexer.lex</tt> works by recursing over a <tt>char Stream.t</tt> to read
characters one at a time from the standard input.  It eats them as it recognizes
them and stores them in in a <tt>Token.token</tt> variant.  The first thing that
it has to do is ignore whitespace between tokens.  This is accomplished with the
recursive call above.</p>

<p>The next thing <tt>Lexer.lex</tt> needs to do is recognize identifiers and
specific keywords like "def".  Kaleidoscope does this with this a pattern match
and a helper function.<p>

<div class="doc_code">
<pre>
  (* identifier: [a-zA-Z][a-zA-Z0-9] *)
  | [&lt; ' ('A' .. 'Z' | 'a' .. 'z' as c); stream &gt;] -&gt;
      let buffer = Buffer.create 1 in
      Buffer.add_char buffer c;
      lex_ident buffer stream

...

and lex_ident buffer = parser
  | [&lt; ' ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' as c); stream &gt;] -&gt;
      Buffer.add_char buffer c;
      lex_ident buffer stream
  | [&lt; stream=lex &gt;] -&gt;
      match Buffer.contents buffer with
      | "def" -&gt; [&lt; 'Token.Def; stream &gt;]
      | "extern" -&gt; [&lt; 'Token.Extern; stream &gt;]
      | id -&gt; [&lt; 'Token.Ident id; stream &gt;]
</pre>
</div>

Numeric values are similar:</p>

<div class="doc_code">
<pre>
  (* number: [0-9.]+ *)
  | [&lt; ' ('0' .. '9' as c); stream &gt;] -&gt;
      let buffer = Buffer.create 1 in
      Buffer.add_char buffer c;
      lex_number buffer stream

...

and lex_number buffer = parser
  | [&lt; ' ('0' .. '9' | '.' as c); stream &gt;] -&gt;
      Buffer.add_char buffer c;
      lex_number buffer stream
  | [&lt; stream=lex &gt;] -&gt;
      [&lt; 'Token.Number (float_of_string (Buffer.contents buffer)); stream &gt;]
</pre>
</div>

<p>This is all pretty straight-forward code for processing input.  When reading
a numeric value from input, we use the ocaml <tt>float_of_string</tt> function
to convert it to a numeric value that we store in <tt>Token.Number</tt>.  Note
that this isn't doing sufficient error checking: it will raise <tt>Failure</tt>
if the string "1.23.45.67".  Feel free to extend it :).  Next we handle
comments:
</p>

<div class="doc_code">
<pre>
  (* Comment until end of line. *)
  | [&lt; ' ('#'); stream &gt;] -&gt;
      lex_comment stream

...

and lex_comment = parser
  | [&lt; ' ('\n'); stream=lex &gt;] -&gt; stream
  | [&lt; 'c; e=lex_comment &gt;] -&gt; e
  | [&lt; &gt;] -&gt; [&lt; &gt;]
</pre>
</div>

<p>We handle comments by skipping to the end of the line and then return the
next token.  Finally, if the input doesn't match one of the above cases, it is
either an operator character like '+' or the end of the file.  These are handled
with this code:</p>

<div class="doc_code">
<pre>
  (* Otherwise, just return the character as its ascii value. *)
  | [&lt; 'c; stream &gt;] -&gt;
      [&lt; 'Token.Kwd c; lex stream &gt;]

  (* end of stream. *)
  | [&lt; &gt;] -&gt; [&lt; &gt;]
</pre>
</div>

<p>With this, we have the complete lexer for the basic Kaleidoscope language
(the <a href="OCamlLangImpl2.html#code">full code listing</a> for the Lexer is
available in the <a href="OCamlLangImpl2.html">next chapter</a> of the
tutorial).  Next we'll <a href="OCamlLangImpl2.html">build a simple parser that
uses this to build an Abstract Syntax Tree</a>.  When we have that, we'll
include a driver so that you can use the lexer and parser together.
</p>

<a href="OCamlLangImpl2.html">Next: Implementing a Parser and AST</a>
</div>

<!-- *********************************************************************** -->
<hr>
<address>
  <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
  src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"></a>
  <a href="http://validator.w3.org/check/referer"><img
  src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>

  <a href="mailto:sabre@nondot.org">Chris Lattner</a><br>
  <a href="mailto:idadesub@users.sourceforge.net">Erick Tryzelaar</a><br>
  <a href="http://llvm.org">The LLVM Compiler Infrastructure</a><br>
  Last modified: $Date: 2007-10-17 11:05:13 -0700 (Wed, 17 Oct 2007) $
</address>
</body>
</html>
