iup-stack/iup/etc/lexlua/erlang.lua

90 lines
3.3 KiB
Lua
Raw Normal View History

2023-02-20 16:44:45 +00:00
-- 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