% 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.