1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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