lytlang/src/lytlang_lexer.xrl

45 lines
1.2 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]
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 } }.
{Comment} : skip_token.
{WS}+ : 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.