aboutsummaryrefslogtreecommitdiff
path: root/lua/lexers/tcl.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/lexers/tcl.lua')
-rw-r--r--lua/lexers/tcl.lua73
1 files changed, 30 insertions, 43 deletions
diff --git a/lua/lexers/tcl.lua b/lua/lexers/tcl.lua
index 665cbd5..8686795 100644
--- a/lua/lexers/tcl.lua
+++ b/lua/lexers/tcl.lua
@@ -1,59 +1,46 @@
--- Copyright 2014-2017 Joshua Krämer. See LICENSE.
+-- Copyright 2014-2022 Joshua Krämer. See LICENSE.
-- Tcl LPeg lexer.
-- This lexer follows the TCL dodekalogue (http://wiki.tcl.tk/10259).
-- It is based on the previous lexer by Mitchell.
-local l = require('lexer')
-local token, word_match = l.token, l.word_match
-local P, R, S = lpeg.P, lpeg.R, lpeg.S
+local lexer = require('lexer')
+local token, word_match = lexer.token, lexer.word_match
+local P, S = lpeg.P, lpeg.S
-local M = {_NAME = 'tcl'}
+local lex = lexer.new('tcl')
-- Whitespace.
-local whitespace = token(l.WHITESPACE, l.space^1)
+lex:add_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1))
--- Separator (semicolon).
-local separator = token(l.CLASS, P(';'))
+-- Comment.
+lex:add_rule('comment', token(lexer.COMMENT, lexer.to_eol('#' * P(function(input, index)
+ local i = index - 2
+ while i > 0 and input:find('^[ \t]', i) do i = i - 1 end
+ if i < 1 or input:find('^[\r\n;]', i) then return index end
+end))))
--- Delimiters.
-local braces = token(l.KEYWORD, S('{}'))
-local quotes = token(l.FUNCTION, '"')
-local brackets = token(l.VARIABLE, S('[]'))
+-- Separator (semicolon).
+lex:add_rule('separator', token(lexer.CLASS, ';'))
-- Argument expander.
-local expander = token(l.LABEL, P('{*}'))
+lex:add_rule('expander', token(lexer.LABEL, '{*}'))
+
+-- Delimiters.
+lex:add_rule('braces', token(lexer.KEYWORD, S('{}')))
+lex:add_rule('quotes', token(lexer.FUNCTION, '"'))
+lex:add_rule('brackets', token(lexer.VARIABLE, S('[]')))
-- Variable substitution.
-local variable = token(l.STRING, '$' * (l.alnum + '_' + P(':')^2)^0)
+lex:add_rule('variable', token(lexer.STRING, '$' * (lexer.alnum + '_' + P(':')^2)^0))
-- Backslash substitution.
-local backslash = token(l.TYPE, '\\' * ((l.digit * l.digit^-2) +
- ('x' * l.xdigit^1) + ('u' * l.xdigit * l.xdigit^-3) +
- ('U' * l.xdigit * l.xdigit^-7) + P(1)))
+local oct = lexer.digit * lexer.digit^-2
+local hex = 'x' * lexer.xdigit^1
+local unicode = 'u' * lexer.xdigit * lexer.xdigit^-3
+lex:add_rule('backslash', token(lexer.TYPE, '\\' * (oct + hex + unicode + 1)))
--- Comment.
-local comment = token(l.COMMENT, '#' * P(function(input, index)
- local i = index - 2
- while i > 0 and input:find('^[ \t]', i) do i = i - 1 end
- if i < 1 or input:find('^[\r\n;]', i) then return index end
-end) * l.nonnewline^0)
-
-M._rules = {
- {'whitespace', whitespace},
- {'comment', comment},
- {'separator', separator},
- {'expander', expander},
- {'braces', braces},
- {'quotes', quotes},
- {'brackets', brackets},
- {'variable', variable},
- {'backslash', backslash},
-}
-
-M._foldsymbols = {
- _patterns = {'[{}]', '#'},
- [l.KEYWORD] = {['{'] = 1, ['}'] = -1},
- [l.COMMENT] = {['#'] = l.fold_line_comments('#')}
-}
-
-return M
+-- Fold points.
+lex:add_fold_point(lexer.KEYWORD, '{', '}')
+lex:add_fold_point(lexer.COMMENT, lexer.fold_consecutive_lines('#'))
+
+return lex