-- Copyright 2006-2025 Mitchell. See LICENSE. -- Makefile LPeg lexer. local lexer = lexer local P, S, B = lpeg.P, lpeg.S, lpeg.B local lex = lexer.new(..., {lex_by_line = true}) -- Function definition. local word = (lexer.any - lexer.space - S('$:,#=(){}'))^1 local func_name = lex:tag(lexer.FUNCTION, word) local ws = lex:get_rule('whitespace') local eq = lex:tag(lexer.OPERATOR, '=') lex:add_rule('function_def', lex:tag(lexer.KEYWORD, lexer.word_match('define')) * ws * func_name * ws^-1 * (eq + -1)) -- Keywords. lex:add_rule('keyword', lex:tag(lexer.KEYWORD, P('!')^-1 * lex:word_match(lexer.KEYWORD, true))) -- Targets. local special_target = lex:tag(lexer.CONSTANT_BUILTIN, '.' * lex:word_match('special_targets')) -- local normal_target = lex:tag('target', (lexer.any - lexer.space - S(':+?!=#'))^1) local target = special_target -- + normal_target * (ws * normal_target)^0 lex:add_rule('target', lexer.starts_line(target * ws^-1 * #(':' * lexer.space))) -- Variable and function assignments. local func_assign = func_name * ws^-1 * eq * #P(function(input, index) return input:find('%$%(%d%)', index) end) local builtin_var = lex:tag(lexer.VARIABLE_BUILTIN, lex:word_match(lexer.VARIABLE_BUILTIN)) local var_name = lex:tag(lexer.VARIABLE, word) local var_assign = (builtin_var + var_name) * ws^-1 * lex:tag(lexer.OPERATOR, S(':+?!')^-1 * '=' + '::=') lex:add_rule('assign', lexer.starts_line(func_assign + var_assign, true) + B(': ') * var_assign) -- Operators. lex:add_rule('operator', lex:tag(lexer.OPERATOR, S(':(){}|'))) -- Strings. lex:add_rule('string', lexer.range("'", true) + lexer.range('"', true)) -- Identifiers. lex:add_rule('identifier', lex:tag(lexer.IDENTIFIER, word)) -- Functions. local builtin_func = lex:tag(lexer.FUNCTION_BUILTIN, lex:word_match(lexer.FUNCTION_BUILTIN)) local call_func = lex:tag(lexer.FUNCTION_BUILTIN, 'call') * ws * func_name local func = lex:tag(lexer.OPERATOR, '$' * S('({')) * (call_func + builtin_func) lex:add_rule('function', func) -- Variables. local auto_var = lex:tag(lexer.OPERATOR, '$') * lex:tag(lexer.VARIABLE_BUILTIN, S('@%