vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
vb.lua
(2382B)
1 -- Copyright 2006-2025 Mitchell. See LICENSE.
2 -- VisualBasic LPeg lexer.
3
4 local lexer = lexer
5 local P, S = lpeg.P, lpeg.S
6
7 local lex = lexer.new(..., {case_insensitive_fold_points = true})
8
9 -- Keywords.
10 lex:add_rule('keyword', lex:tag(lexer.KEYWORD, lex:word_match(lexer.KEYWORD, true)))
11
12 -- Types.
13 lex:add_rule('type', lex:tag(lexer.TYPE, lex:word_match(lexer.TYPE, true)))
14
15 -- Comments.
16 lex:add_rule('comment', lex:tag(lexer.COMMENT, lexer.to_eol("'" + lexer.word_match('rem', true))))
17
18 -- Identifiers.
19 lex:add_rule('identifier', lex:tag(lexer.IDENTIFIER, lexer.word))
20
21 -- Strings.
22 lex:add_rule('string', lex:tag(lexer.STRING, lexer.range('"', true, false)))
23
24 -- Numbers.
25 lex:add_rule('number', lex:tag(lexer.NUMBER, lexer.number * S('LlUuFf')^-2))
26
27 -- Operators.
28 lex:add_rule('operator', lex:tag(lexer.OPERATOR, S('=><+-*^&:.,_()')))
29
30 -- Fold points.
31 lex:add_fold_point(lexer.KEYWORD, 'If', 'End If')
32 lex:add_fold_point(lexer.KEYWORD, 'Select', 'End Select')
33 lex:add_fold_point(lexer.KEYWORD, 'For', 'Next')
34 lex:add_fold_point(lexer.KEYWORD, 'While', 'End While')
35 lex:add_fold_point(lexer.KEYWORD, 'While', 'Wend')
36 lex:add_fold_point(lexer.KEYWORD, 'Do', 'Loop')
37 lex:add_fold_point(lexer.KEYWORD, 'With', 'End With')
38 lex:add_fold_point(lexer.KEYWORD, 'Sub', 'End Sub')
39 lex:add_fold_point(lexer.KEYWORD, 'Function', 'End Function')
40 lex:add_fold_point(lexer.KEYWORD, 'Property', 'End Property')
41 lex:add_fold_point(lexer.KEYWORD, 'Module', 'End Module')
42 lex:add_fold_point(lexer.KEYWORD, 'Class', 'End Class')
43 lex:add_fold_point(lexer.KEYWORD, 'Try', 'End Try')
44
45 -- Word lists.
46 lex:set_word_list(lexer.KEYWORD, {
47 -- Control.
48 'If', 'Then', 'Else', 'ElseIf', 'While', 'Wend', 'For', 'To', 'Each', 'In', 'Step', 'Case',
49 'Select', 'Return', 'Continue', 'Do', 'Until', 'Loop', 'Next', 'With', 'Exit',
50 -- Operators.
51 'Mod', 'And', 'Not', 'Or', 'Xor', 'Is',
52 -- Storage types.
53 'Call', 'Class', 'Const', 'Dim', 'ReDim', 'Preserve', 'Function', 'Sub', 'Property', 'End', 'Set',
54 'Let', 'Get', 'New', 'Randomize', 'Option', 'Explicit', 'On', 'Error', 'Execute', 'Module',
55 -- Storage modifiers.
56 'Private', 'Public', 'Default',
57 -- Constants.
58 'Empty', 'False', 'Nothing', 'Null', 'True'
59 })
60
61 lex:set_word_list(lexer.TYPE, {
62 'Boolean', 'Byte', 'Char', 'Date', 'Decimal', 'Double', 'Long', 'Object', 'Short', 'Single',
63 'String'
64 })
65
66 lexer.property['scintillua.comment'] = "'"
67
68 return lex