60 lines
1.7 KiB
Erlang
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.
|