aboutsummaryrefslogtreecommitdiffhomepage
path: root/lexlua/erlang.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lexlua/erlang.lua')
-rw-r--r--lexlua/erlang.lua89
1 files changed, 89 insertions, 0 deletions
diff --git a/lexlua/erlang.lua b/lexlua/erlang.lua
new file mode 100644
index 000000000..973601ab2
--- /dev/null
+++ b/lexlua/erlang.lua
@@ -0,0 +1,89 @@
+-- Copyright 2006-2018 Mitchell mitchell.att.foicica.com. See License.txt.
+-- Erlang LPeg lexer.
+
+local lexer = require('lexer')
+local token, word_match = lexer.token, lexer.word_match
+local P, R, S = lpeg.P, lpeg.R, lpeg.S
+
+local lex = lexer.new('erlang')
+
+-- Whitespace.
+lex:add_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1))
+
+-- Keywords.
+lex:add_rule('keyword', token(lexer.KEYWORD, word_match[[
+ after begin case catch cond end fun if let of query receive try when
+ -- Operators.
+ div rem or xor bor bxor bsl bsr and band not bnot badarg nocookie orelse
+ andalso false true
+]]))
+
+-- Functions.
+lex:add_rule('function', token(lexer.FUNCTION, word_match[[
+ abs alive apply atom_to_list binary_to_list binary_to_term concat_binary date
+ disconnect_node element erase exit float float_to_list get get_keys
+ group_leader halt hd integer_to_list is_alive is_record length link
+ list_to_atom list_to_binary list_to_float list_to_integer list_to_pid
+ list_to_tuple load_module make_ref monitor_node node nodes now open_port
+ pid_to_list process_flag process_info process put register registered round
+ self setelement size spawn spawn_link split_binary statistics term_to_binary
+ throw time tl trunc tuple_to_list unlink unregister whereis
+ -- Others.
+ any atom binary bitstring byte constant function integer list map mfa
+ non_neg_integer number pid ports port_close port_info pos_integer reference
+ record
+ -- Erlang.
+ check_process_code delete_module get_cookie hash math module_loaded preloaded
+ processes purge_module set_cookie set_node
+ -- Math.
+ acos asin atan atan2 cos cosh exp log log10 min max pi pow power sin sinh sqrt
+ tan tanh
+]]))
+
+-- Identifiers.
+lex:add_rule('identifier', token(lexer.IDENTIFIER, lexer.lower *
+ ('_' + lexer.alnum)^0))
+
+-- Variables.
+lex:add_rule('variable', token(lexer.VARIABLE, P('_')^0 * lexer.upper *
+ ('_' + lexer.alnum)^0))
+
+-- Directives.
+lex:add_rule('directive', token('directive', '-' * word_match[[
+ author behaviour behavior compile copyright define doc else endif export file
+ ifdef ifndef import include include_lib module record spec type undef
+]]))
+lex:add_style('directive', lexer.STYLE_PREPROCESSOR)
+
+-- Strings.
+lex:add_rule('string', token(lexer.STRING, lexer.delimited_range("'", true) +
+ lexer.delimited_range('"') +
+ '$' * lexer.any * lexer.alnum^0))
+
+-- Comments.
+lex:add_rule('comment', token(lexer.COMMENT, '%' * lexer.nonnewline^0))
+
+-- Numbers.
+lex:add_rule('number', token(lexer.NUMBER, lexer.float + lexer.integer))
+
+-- Operators.
+lex:add_rule('operator', token(lexer.OPERATOR, S('-<>.;=/|+*:,!()[]{}')))
+
+-- Preprocessor.
+lex:add_rule('preprocessor', token(lexer.TYPE, '?' * lexer.word))
+
+-- Records.
+lex:add_rule('type', token(lexer.TYPE, '#' * lexer.word))
+
+-- Fold points.
+lex:add_fold_point(lexer.KEYWORD, 'case', 'end')
+lex:add_fold_point(lexer.KEYWORD, 'fun', 'end')
+lex:add_fold_point(lexer.KEYWORD, 'if', 'end')
+lex:add_fold_point(lexer.KEYWORD, 'query', 'end')
+lex:add_fold_point(lexer.KEYWORD, 'receive', 'end')
+lex:add_fold_point(lexer.OPERATOR, '(', ')')
+lex:add_fold_point(lexer.OPERATOR, '[', ']')
+lex:add_fold_point(lexer.OPERATOR, '{', '}')
+lex:add_fold_point(lexer.COMMENT, '%', lexer.fold_line_comments('%'))
+
+return lex