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

80 lines
2.8 KiB
Lua
Raw Permalink Normal View History

2023-02-20 16:44:45 +00:00
-- Copyright 2006-2019 gwash. See License.txt.
-- Archlinux PKGBUILD 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('pkgbuild')
-- Whitespace.
lex:add_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1))
-- Comments.
lex:add_rule('comment', token(lexer.COMMENT, '#' * lexer.nonnewline^0))
-- Strings.
local sq_str = lexer.delimited_range("'", false, true)
local dq_str = lexer.delimited_range('"')
local ex_str = lexer.delimited_range('`')
local heredoc = '<<' * P(function(input, index)
local s, e, _, delimiter =
input:find('(["\']?)([%a_][%w_]*)%1[\n\r\f;]+', index)
if s == index and delimiter then
local _, e = input:find('[\n\r\f]+'..delimiter, e)
return e and e + 1 or #input + 1
end
end)
lex:add_rule('string', token(lexer.STRING, sq_str + dq_str + ex_str + heredoc))
-- Numbers.
lex:add_rule('number', token(lexer.NUMBER, lexer.float + lexer.integer))
-- Keywords.
lex:add_rule('keyword', token(lexer.KEYWORD, word_match[[
patch cd make patch mkdir cp sed install rm if then elif else fi case in esac
while for do done continue local return git svn co clone gconf-merge-schema
msg echo ln
-- Operators.
-a -b -c -d -e -f -g -h -k -p -r -s -t -u -w -x -O -G -L -S -N -nt -ot -ef -o
-z -n -eq -ne -lt -le -gt -ge -Np -i
]]))
-- Functions.
lex:add_rule('function', token(lexer.FUNCTION, word_match[[
build check package pkgver prepare
]] * '()'))
-- Constants.
lex:add_rule('constant', token(lexer.CONSTANT, word_match[[
-- We do *not* list pkgver srcdir and startdir here.
-- These are defined by makepkg but user should not alter them.
arch backup changelog checkdepends conflicts depends epoch groups install
license makedepends md5sums noextract optdepends options pkgbase pkgdesc
pkgname pkgrel pkgver provides replaces sha1sums sha256sums sha384sums
sha512sums source url validpgpkeys
]]))
-- Identifiers.
lex:add_rule('identifier', token(lexer.IDENTIFIER, lexer.word))
-- Variables.
lex:add_rule('variable', token(lexer.VARIABLE,
'$' * (S('!#?*@$') +
lexer.delimited_range('()', true, true) +
lexer.delimited_range('[]', true, true) +
lexer.delimited_range('{}', true, true) +
lexer.delimited_range('`', true, true) +
lexer.digit^1 +
lexer.word)))
-- Operators.
lex:add_rule('operator', token(lexer.OPERATOR, S('=!<>+-/*^~.,:;?()[]{}')))
-- Fold points.
lex:add_fold_point(lexer.OPERATOR, '(', ')')
lex:add_fold_point(lexer.OPERATOR, '{', '}')
lex:add_fold_point(lexer.COMMENT, '#', lexer.fold_line_comments('#'))
return lex