build: set version to 0.5
[vis.git] / lua / lexers / objective_c.lua
blob3071482d22d91757d598ba289ee51142987d7abb
1 -- Copyright 2006-2017 Mitchell mitchell.att.foicica.com. See LICENSE.
2 -- Objective C LPeg lexer.
4 local l = require('lexer')
5 local token, word_match = l.token, l.word_match
6 local P, R, S = lpeg.P, lpeg.R, lpeg.S
8 local M = {_NAME = 'objective_c'}
10 -- Whitespace.
11 local ws = token(l.WHITESPACE, l.space^1)
13 -- Comments.
14 local line_comment = '//' * l.nonnewline_esc^0
15 local block_comment = '/*' * (l.any - '*/')^0 * P('*/')^-1
16 local comment = token(l.COMMENT, line_comment + block_comment)
18 -- Strings.
19 local sq_str = P('L')^-1 * l.delimited_range("'", true)
20 local dq_str = P('L')^-1 * l.delimited_range('"', true)
21 local string = token(l.STRING, sq_str + dq_str)
23 -- Numbers.
24 local number = token(l.NUMBER, l.float + l.integer)
26 -- Preprocessor.
27 local preproc_word = word_match{
28 'define', 'elif', 'else', 'endif', 'error', 'if', 'ifdef',
29 'ifndef', 'import', 'include', 'line', 'pragma', 'undef',
30 'warning'
32 local preproc = token(l.PREPROCESSOR,
33 l.starts_line('#') * S('\t ')^0 * preproc_word *
34 (l.nonnewline_esc^1 + l.space * l.nonnewline_esc^0))
36 -- Keywords.
37 local keyword = token(l.KEYWORD, word_match({
38 -- From C.
39 'asm', 'auto', 'break', 'case', 'const', 'continue', 'default', 'do', 'else',
40 'extern', 'false', 'for', 'goto', 'if', 'inline', 'register', 'return',
41 'sizeof', 'static', 'switch', 'true', 'typedef', 'void', 'volatile', 'while',
42 'restrict', '_Bool', '_Complex', '_Pragma', '_Imaginary',
43 -- Objective C.
44 'oneway', 'in', 'out', 'inout', 'bycopy', 'byref', 'self', 'super',
45 -- Preprocessor directives.
46 '@interface', '@implementation', '@protocol', '@end', '@private',
47 '@protected', '@public', '@class', '@selector', '@encode', '@defs',
48 '@synchronized', '@try', '@throw', '@catch', '@finally',
49 -- Constants.
50 'TRUE', 'FALSE', 'YES', 'NO', 'NULL', 'nil', 'Nil', 'METHOD_NULL'
51 }, '@'))
53 -- Types.
54 local type = token(l.TYPE, word_match{
55 'apply_t', 'id', 'Class', 'MetaClass', 'Object', 'Protocol', 'retval_t',
56 'SEL', 'STR', 'IMP', 'BOOL', 'TypedStream'
59 -- Identifiers.
60 local identifier = token(l.IDENTIFIER, l.word)
62 -- Operators.
63 local operator = token(l.OPERATOR, S('+-/*%<>!=^&|?~:;.()[]{}'))
65 M._rules = {
66 {'whitespace', ws},
67 {'keyword', keyword},
68 {'type', type},
69 {'string', string},
70 {'identifier', identifier},
71 {'comment', comment},
72 {'number', number},
73 {'preproc', preproc},
74 {'operator', operator},
77 M._foldsymbols = {
78 _patterns = {'%l+', '[{}]', '/%*', '%*/', '//'},
79 [l.PREPROCESSOR] = {
80 region = 1, endregion = -1,
81 ['if'] = 1, ifdef = 1, ifndef = 1, endif = -1
83 [l.OPERATOR] = {['{'] = 1, ['}'] = -1},
84 [l.COMMENT] = {['/*'] = 1, ['*/'] = -1, ['//'] = l.fold_line_comments('//')}
87 return M