diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2015-10-16 12:36:47 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2015-11-08 13:35:36 +0100 |
| commit | 039042f2e323c1f982f1de61b702c88fb33d6ccb (patch) | |
| tree | 67dea69de9462e0c27ea2a743b4c5d1798eaa057 /lexers/makefile.lua | |
| parent | b1ec60061623601ca6185a16d77c6c6c62135e95 (diff) | |
| download | vis-039042f2e323c1f982f1de61b702c88fb33d6ccb.tar.gz vis-039042f2e323c1f982f1de61b702c88fb33d6ccb.tar.xz | |
Import LPeg based lexers from Scintillua 3.6.1-1
These are Copyright (c) 2007-2015 Mitchell and released under the
MIT license.
Diffstat (limited to 'lexers/makefile.lua')
| -rw-r--r-- | lexers/makefile.lua | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/lexers/makefile.lua b/lexers/makefile.lua new file mode 100644 index 0000000..480e032 --- /dev/null +++ b/lexers/makefile.lua @@ -0,0 +1,108 @@ +-- Copyright 2006-2015 Mitchell mitchell.att.foicica.com. See LICENSE. +-- Makefile LPeg lexer. + +local l = require('lexer') +local token, word_match = l.token, l.word_match +local P, R, S = lpeg.P, lpeg.R, lpeg.S + +local M = {_NAME = 'makefile'} + +-- Whitespace. +local ws = token(l.WHITESPACE, l.space^1) + +-- Comments. +local comment = token(l.COMMENT, '#' * l.nonnewline^0) + +-- Keywords. +local keyword = token(l.KEYWORD, P('!')^-1 * l.word_match({ + -- GNU Make conditionals. + 'ifeq', 'ifneq', 'ifdef', 'ifndef', 'else', 'endif', + -- Other conditionals. + 'if', 'elseif', 'elseifdef', 'elseifndef', + -- Directives and other keywords. + 'define', 'endef', 'export', 'include', 'override', 'private', 'undefine', + 'unexport', 'vpath' +}, nil, true)) + +-- Functions. +local func = token(l.FUNCTION, l.word_match({ + -- Functions for String Substitution and Analysis. + 'subst', 'patsubst', 'strip', 'findstring', 'filter', 'filter-out', 'sort', + 'word', 'wordlist', 'words', 'firstword', 'lastword', + -- Functions for File Names. + 'dir', 'notdir', 'suffix', 'basename', 'addsuffix', 'addprefix', 'join', + 'wildcard', 'realpath', 'abspath', + -- Functions for Conditionals. + 'if', 'or', 'and', + -- Miscellaneous Functions. + 'foreach', 'call', 'value', 'eval', 'origin', 'flavor', 'shell', + -- Functions That Control Make. + 'error', 'warning', 'info' +}), '-') + +-- Variables. +local word_char, assign = l.any - l.space - S(':#=(){}'), S(':+?')^-1 * '=' +local expanded_var = '$' * ('(' * word_char^1 * ')' + '{' * word_char^1 * '}') +local auto_var = '$' * S('@%<?^+|*') +local special_var = l.word_match({ + 'MAKEFILE_LIST', '.DEFAULT_GOAL', 'MAKE_RESTARTS', '.RECIPEPREFIX', + '.VARIABLES', '.FEATURES', '.INCLUDE_DIRS', + 'GPATH', 'MAKECMDGOALS', 'MAKESHELL', 'SHELL', 'VPATH' +}, '.') * #(ws^0 * assign) +local implicit_var = l.word_match{ + -- Some common variables. + 'AR', 'AS', 'CC', 'CXX', 'CPP', 'FC', 'M2C', 'PC', 'CO', 'GET', 'LEX', 'YACC', + 'LINT', 'MAKEINFO', 'TEX', 'TEXI2DVI', 'WEAVE', 'CWEAVE', 'TANGLE', 'CTANGLE', + 'RM', + -- Some common flag variables. + 'ARFLAGS', 'ASFLAGS', 'CFLAGS', 'CXXFLAGS', 'COFLAGS', 'CPPFLAGS', 'FFLAGS', + 'GFLAGS', 'LDFLAGS', 'LFLAGS', 'YFLAGS', 'PFLAGS', 'RFLAGS', 'LINTFLAGS', + -- Other. + 'DESTDIR', 'MAKE', 'MAKEFLAGS', 'MAKEOVERRIDES', 'MFLAGS' +} * #(ws^0 * assign) +local computed_var = token(l.OPERATOR, '$' * S('({')) * func +local variable = token(l.VARIABLE, + expanded_var + auto_var + special_var + implicit_var) + + computed_var + +-- Targets. +local special_target = token(l.CONSTANT, l.word_match({ + '.PHONY', '.SUFFIXES', '.DEFAULT', '.PRECIOUS', '.INTERMEDIATE', '.SECONDARY', + '.SECONDEXPANSION', '.DELETE_ON_ERROR', '.IGNORE', '.LOW_RESOLUTION_TIME', + '.SILENT', '.EXPORT_ALL_VARIABLES', '.NOTPARALLEL', '.ONESHELL', '.POSIX' +}, '.')) +local normal_target = token('target', (l.any - l.space - S(':#='))^1) +local target = l.starts_line((special_target + normal_target) * ws^0 * + #(':' * -P('='))) + +-- Identifiers. +local identifier = token(l.IDENTIFIER, word_char^1) + +-- Operators. +local operator = token(l.OPERATOR, assign + S(':$(){}')) + +M._rules = { + {'whitespace', ws}, + {'keyword', keyword}, + {'target', target}, + {'variable', variable}, + {'operator', operator}, + {'identifier', identifier}, + {'comment', comment}, +} + +M._tokenstyles = { + target = l.STYLE_LABEL +} + +M._LEXBYLINE = true + +-- Embedded Bash. +local bash = l.load('bash') +bash._RULES['variable'] = token(l.VARIABLE, '$$' * word_char^1) + + bash._RULES['variable'] + variable +local bash_start_rule = token(l.WHITESPACE, P('\t')) + token(l.OPERATOR, P(';')) +local bash_end_rule = token(l.WHITESPACE, P('\n')) +l.embed_lexer(M, bash, bash_start_rule, bash_end_rule) + +return M |
