travis: try to fix build by using local built dependencies
[vis.git] / lexers / objective_c.lua
blobdb8a5a2d6618b3507ae7c0974a5dcf7307571f1e
1 -- Copyright 2006-2015 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