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