ui: add support for blink style attribute
[vis.git] / lexers / objective_c.lua
blob4722c2c94fa1190ee7f6233b9663dde25a39227a
1 -- Copyright 2006-2016 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