aboutsummaryrefslogtreecommitdiffhomepage
path: root/lexlua/moonscript.lua
diff options
context:
space:
mode:
authormitchell <unknown>2018-03-11 23:04:41 -0400
committermitchell <unknown>2018-03-11 23:04:41 -0400
commit519b7328b66c4c84f03893a31e4be5ba6b1395f2 (patch)
tree2055cd79006357e94c185f341d0df17b9a8769eb /lexlua/moonscript.lua
parentc0373e036e965a70045971e2abc582cb4bf12a4e (diff)
downloadscintilla-mirror-519b7328b66c4c84f03893a31e4be5ba6b1395f2.tar.gz
Added optional Lua lexer support.
This support is disabled by default and must be enabled via compile-time option.
Diffstat (limited to 'lexlua/moonscript.lua')
-rw-r--r--lexlua/moonscript.lua141
1 files changed, 141 insertions, 0 deletions
diff --git a/lexlua/moonscript.lua b/lexlua/moonscript.lua
new file mode 100644
index 000000000..49a98d25f
--- /dev/null
+++ b/lexlua/moonscript.lua
@@ -0,0 +1,141 @@
+-- Copyright 2016-2018 Alejandro Baez (https://keybase.io/baez). See License.txt.
+-- Moonscript LPeg lexer.
+
+local lexer = require('lexer')
+local token, word_match = lexer.token, lexer.word_match
+local P, S, R = lpeg.P, lpeg.S, lpeg.R
+
+local lex = lexer.new('moonscript', {fold_by_indentation = true})
+
+-- Whitespace.
+lex:add_rule('whitspace', token(lexer.WHITESPACE, lexer.space^1))
+
+-- Keywords.
+lex:add_rule('keyword', token(lexer.KEYWORD, word_match[[
+ -- Lua.
+ and break do else elseif false for if in local nil not or return then true
+ while
+ -- Moonscript.
+ continue class export extends from import super switch unless using when with
+]]))
+
+-- Error words.
+lex:add_rule('error', token(lexer.ERROR, word_match[[function end]]))
+
+-- Self reference.
+lex:add_rule('self_ref', token('self_ref', '@' * lexer.word + 'self'))
+lex:add_style('self_ref', lexer.STYLE_LABEL)
+
+-- Functions.
+lex:add_rule('function', token(lexer.FUNCTION, word_match[[
+ assert collectgarbage dofile error getmetatable ipairs load loadfile next
+ pairs pcall print rawequal rawget rawset require select setmetatable tonumber
+ tostring type xpcall
+ -- Added in 5.2.
+ rawlen
+]]))
+
+-- Constants.
+lex:add_rule('constant', token(lexer.CONSTANT, word_match[[
+ _G _VERSION
+ -- Added in 5.2.
+ _ENV
+]]))
+
+-- Libraries.
+lex:add_rule('library', token('library', word_match[[
+ -- Coroutine.
+ coroutine coroutine.create coroutine.resume coroutine.running coroutine.status
+ coroutine.wrap coroutine.yield
+ -- Coroutine added in 5.3.
+ coroutine.isyieldable
+ -- Module.
+ package package.cpath package.loaded package.loadlib package.path
+ package.preload
+ -- Module added in 5.2.
+ package.config package.searchers package.searchpath
+ -- UTF-8 added in 5.3.
+ utf8 utf8.char utf8.charpattern utf8.codepoint utf8.codes utf8.len utf8.offset
+ -- String.
+ string string.byte string.char string.dump string.find string.format
+ string.gmatch string.gsub string.len string.lower string.match string.rep
+ string.reverse string.sub string.upper
+ -- String added in 5.3.
+ string.pack string.packsize string.unpack
+ -- Table.
+ table table.concat table.insert table.remove table.sort
+ -- Table added in 5.2.
+ table.pack table.unpack
+ -- Table added in 5.3.
+ table.move
+ -- Math.
+ math math.abs math.acos math.asin math.atan math.ceil math.cos math.deg
+ math.exp math.floor math.fmod math.huge math.log math.max math.min math.modf
+ math.pi math.rad math.random math.randomseed math.sin math.sqrt math.tan
+ -- Math added in 5.3.
+ math.maxinteger math.mininteger math.tointeger math.type math.ult
+ -- IO.
+ io io.close io.flush io.input io.lines io.open io.output io.popen io.read
+ io.stderr io.stdin io.stdout io.tmpfile io.type io.write
+ -- OS.
+ os os.clock os.date os.difftime os.execute os.exit os.getenv os.remove
+ os.rename os.setlocale os.time os.tmpname
+ -- Debug.
+ debug debug.debug debug.gethook debug.getinfo debug.getlocal
+ debug.getmetatable debug.getregistry debug.getupvalue debug.sethook
+ debug.setlocal debug.setmetatable debug.setupvalue debug.traceback
+ -- Debug added in 5.2.
+ debug.getuservalue debug.setuservalue debug.upvalueid debug.upvaluejoin
+
+ --- MoonScript 0.3.1 standard library.
+ -- Printing functions.
+ p
+ -- Table functions.
+ run_with_scope defaultbl extend copy
+ -- Class/object functions.
+ is_object bind_methods mixin mixin_object mixin_table
+ -- Misc functions.
+ fold
+ -- Debug functions.
+ debug.upvalue
+]]))
+lex:add_style('library', lexer.STYLE_TYPE)
+
+-- Identifiers.
+local identifier = token(lexer.IDENTIFIER, lexer.word)
+local proper_ident = token('proper_ident', R('AZ') * lexer.word)
+local tbl_key = token('tbl_key', lexer.word * ':' + ':' * lexer.word )
+lex:add_rule('identifier', tbl_key + proper_ident + identifier)
+lex:add_style('proper_ident', lexer.STYLE_CLASS)
+lex:add_style('tbl_key', lexer.STYLE_REGEX)
+
+local longstring = lpeg.Cmt('[' * lpeg.C(P('=')^0) * '[',
+ function(input, index, eq)
+ local _, e = input:find(']'..eq..']', index, true)
+ return (e or #input) + 1
+ end)
+
+-- Strings.
+local sq_str = lexer.delimited_range("'", false, true)
+local dq_str = lexer.delimited_range('"', false, true)
+lex:add_rule('string', token(lexer.STRING, sq_str + dq_str) +
+ token('longstring', longstring))
+lex:add_style('longstring', lexer.STYLE_STRING)
+
+-- Comments.
+lex:add_rule('comment', token(lexer.COMMENT, '--' * (longstring +
+ lexer.nonnewline^0)))
+
+-- Numbers.
+lex:add_rule('number', token(lexer.NUMBER, lexer.float + lexer.integer))
+
+-- Function definition.
+lex:add_rule('fndef', token('fndef', P('->') + '=>'))
+lex:add_style('fndef', lexer.STYLE_PREPROCESSOR)
+
+-- Operators.
+lex:add_rule('operator', token(lexer.OPERATOR, S('+-*!\\/%^#=<>;:,.')))
+lex:add_rule('symbol', token('symbol', S('(){}[]')))
+lex:add_style('symbol', lexer.STYLE_EMBEDDED)
+
+return lex