lytlang/src/lytlang_lexer.xrl

60 lines
1.7 KiB
Erlang

% Lexer syntax for the Elixir language done with leex
% Copyright (C) 2011 Jose Valim
Definitions.
D = [0-9]
U = [A-Z]
L = [a-z]
WS = [\s]
LF = \n
Rules.
{D}+\.{D}+ : { token, { float, TokenLine, list_to_float(TokenChars) } }.
{D}+ : { token, { integer, TokenLine, list_to_integer(TokenChars) } }.
[{L}|_][{U}{L}{D}|_]+ : { token, var(TokenChars, TokenLine) }.
\+ : { token, { '+', TokenLine } }.
- : { token, { '-', TokenLine } }.
\* : { token, { '*', TokenLine } }.
/ : { token, { '/', TokenLine } }.
// : { token, { '//', TokenLine } }.
\( : { token, { '(', TokenLine } }.
\) : { token, { ')', TokenLine } }.
\[ : { token, { '[', TokenLine } }.
\] : { token, { ']', TokenLine } }.
\< : { token, { '<', TokenLine } }.
\> : { token, { '>', TokenLine } }.
\{ : { token, { '{', TokenLine } }.
\} : { token, { '}', TokenLine } }.
\" : { token, { '"', TokenLine } }.
\' : { token, { '\'', TokenLine } }.
, : { token, { ',', TokenLine } }.
= : { token, { '=', TokenLine } }.
-> : { token, { '->', TokenLine } }.
: : { token, { ':', TokenLine } }.
; : { token, { eol, TokenLine } }.
{LF} : { token, { eol, TokenLine } }.
{Comment} : skip_token.
{WS}+ : skip_token.
% {LF}+ : skip_token.
% {CRLF}+ : skip_token.
% ({Comment}|{Whitespace})*(\n({Comment}|{Whitespace})*)+ : { token, { eol, TokenLine } }.
Erlang code.
var(Chars, Line) ->
Atom = list_to_atom(Chars),
case reserved_word(Atom) of
true -> {Atom, Line};
false -> {var, Line, Atom}
end.
reserved_word('nil') -> true;
reserved_word('true') -> true;
reserved_word('false') -> true;
reserved_word('module') -> true;
reserved_word(_) -> false.