90 lines
3.3 KiB
Lua
Executable File
90 lines
3.3 KiB
Lua
Executable File
-- Copyright 2006-2019 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
|