diff options
Diffstat (limited to 'lua/lexers/meson.lua')
| -rw-r--r-- | lua/lexers/meson.lua | 107 |
1 files changed, 55 insertions, 52 deletions
diff --git a/lua/lexers/meson.lua b/lua/lexers/meson.lua index c224f82..75fe32b 100644 --- a/lua/lexers/meson.lua +++ b/lua/lexers/meson.lua @@ -1,23 +1,58 @@ --- Copyright 2020-2022 Florian Fischer. See LICENSE. +-- Copyright 2020-2024 Florian Fischer. See LICENSE. -- Meson file 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 lexer = lexer +local S = lpeg.S -local lex = lexer.new('meson', {fold_by_indentation = true}) - --- Whitespace. -lex:add_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1)) +local lex = lexer.new(..., {fold_by_indentation = true}) -- Keywords. -lex:add_rule('keyword', token(lexer.KEYWORD, word_match( - 'and or not if elif else endif foreach break continue endforeach'))) +lex:add_rule('keyword', lex:tag(lexer.KEYWORD, lex:word_match(lexer.KEYWORD))) --- Methods. +-- Functions. -- https://mesonbuild.com/Reference-manual.html#builtin-objects -- https://mesonbuild.com/Reference-manual.html#returned-objects -local method_names = word_match{ +local method = lex:tag(lexer.FUNCTION_METHOD, lex:word_match(lexer.FUNCTION_METHOD)) +-- https://mesonbuild.com/Reference-manual.html#functions +local func = lex:tag(lexer.FUNCTION_BUILTIN, lex:word_match(lexer.FUNCTION_BUILTIN)) +-- A function call must be followed by an opening parenthesis. The matching of function calls +-- instead of just their names is needed to not falsely highlight function names which can also +-- be keyword arguments. For example 'include_directories' can be a function call itself or a +-- keyword argument of an 'executable' or 'library' function call. +lex:add_rule('function', (method + func) * #(lexer.space^0 * '(')) + +-- Builtin objects. +-- https://mesonbuild.com/Reference-manual.html#builtin-objects +lex:add_rule('object', lex:tag(lexer.VARIABLE_BUILTIN, lex:word_match(lexer.VARIABLE_BUILTIN))) + +-- Constants. +lex:add_rule('constant', lex:tag(lexer.CONSTANT_BUILTIN, lex:word_match(lexer.CONSTANT_BUILTIN))) + +-- Identifiers. +lex:add_rule('identifier', lex:tag(lexer.IDENTIFIER, lexer.word)) + +-- Strings. +local str = lexer.range("'", true) +local multiline_str = lexer.range("'''") +lex:add_rule('string', lex:tag(lexer.STRING, multiline_str + str)) + +-- Comments. +lex:add_rule('comment', lex:tag(lexer.COMMENT, lexer.to_eol('#', true))) + +-- Numbers. +local oct_num = '0o' * lpeg.R('07') +local integer = S('+-')^-1 * (lexer.hex_num + lexer.bin_num + oct_num + lexer.dec_num) +lex:add_rule('number', lex:tag(lexer.NUMBER, integer)) + +-- Operators. +lex:add_rule('operator', lex:tag(lexer.OPERATOR, S('()[]{}-=+/%:.,?<>'))) + +-- Word lists +lex:set_word_list(lexer.KEYWORD, { + 'and', 'or', 'not', 'if', 'elif', 'else', 'endif', 'foreach', 'break', 'continue', 'endforeach' +}) + +lex:set_word_list(lexer.FUNCTION_METHOD, { -- array -- 'contains', 'get', 'length', -- boolean -- @@ -69,14 +104,9 @@ local method_names = word_match{ 'found', 'get_variable', -- run result object -- 'compiled', 'returncode', 'stderr', 'stdout' -} --- A method call must be followed by an opening parenthesis. -lex:add_rule('method', token('method', method_names * #(lexer.space^0 * '('))) -lex:add_style('method', lexer.styles['function']) +}) --- Function. --- https://mesonbuild.com/Reference-manual.html#functions -local func_names = word_match{ +lex:set_word_list(lexer.FUNCTION_BUILTIN, { 'add_global_arguments', 'add_global_link_arguments', 'add_languages', 'add_project_arguments', 'add_project_link_arguments', 'add_test_setup', 'alias_targ', 'assert', 'benchmark', 'both_libraries', 'build_target', 'configuration_data', 'configure_file', 'custom_target', @@ -86,41 +116,14 @@ local func_names = word_match{ 'is_disabler', 'is_variable', 'jar', 'join_paths', 'library', 'message', 'warning', 'summary', 'project', 'run_command', 'run_targ', 'set_variable', 'shared_library', 'shared_module', 'static_library', 'subdir', 'subdir_done', 'subproject', 'test', 'vcs_tag' -} --- A function call must be followed by an opening parenthesis. The matching of function calls --- instead of just their names is needed to not falsely highlight function names which can also --- be keyword arguments. For example 'include_directories' can be a function call itself or a --- keyword argument of an 'executable' or 'library' function call. -lex:add_rule('function', token(lexer.FUNCTION, func_names * #(lexer.space^0 * '('))) - --- Builtin objects. --- https://mesonbuild.com/Reference-manual.html#builtin-objects -lex:add_rule('object', - token('object', word_match('meson build_machine host_machine target_machine'))) -lex:add_style('object', lexer.styles.type) +}) --- Constants. -lex:add_rule('constant', token(lexer.CONSTANT, word_match('false true'))) - --- Identifiers. -lex:add_rule('identifier', token(lexer.IDENTIFIER, lexer.word)) +lex:set_word_list(lexer.VARIABLE_BUILTIN, { + 'meson', 'build_machine', 'host_machine', 'target_machine' +}) --- Strings. -local str = lexer.range("'", true) -local multiline_str = lexer.range("'''") -lex:add_rule('string', token(lexer.STRING, multiline_str + str)) +lex:set_word_list(lexer.CONSTANT_BUILTIN, {'false', 'true'}) --- Comments. -lex:add_rule('comment', token(lexer.COMMENT, lexer.to_eol('#', true))) - --- Numbers. -local dec = R('19')^1 * R('09')^0 -local bin = '0b' * S('01')^1 -local oct = '0o' * R('07')^1 -local integer = S('+-')^-1 * (bin + lexer.hex_num + oct + dec) -lex:add_rule('number', token(lexer.NUMBER, integer)) - --- Operators. -lex:add_rule('operator', token(lexer.OPERATOR, S('()[]{}-=+/%:.,?<>'))) +lexer.property['scintillua.comment'] = '#' return lex |
