77 lines
3.3 KiB
Lua
Executable File
77 lines
3.3 KiB
Lua
Executable File
-- Copyright 2006-2019 Mitchell mitchell.att.foicica.com. See License.txt.
|
|
-- Rexx LPeg lexer.
|
|
|
|
local lexer = require('lexer')
|
|
local token, word_match = lexer.token, lexer.word_match
|
|
local P, R, S = lpeg.P, lpeg.R, lpeg.S
|
|
|
|
local lex = lexer.new('rexx')
|
|
|
|
-- Whitespace.
|
|
lex:add_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1))
|
|
|
|
-- Keywords.
|
|
lex:add_rule('keyword', token(lexer.KEYWORD, word_match([[
|
|
address arg by call class do drop else end exit expose forever forward guard
|
|
if interpret iterate leave method nop numeric otherwise parse procedure pull
|
|
push queue raise reply requires return routine result rc say select self sigl
|
|
signal super then to trace use when while until
|
|
]], true)))
|
|
|
|
-- Functions.
|
|
lex:add_rule('function', token(lexer.FUNCTION, word_match([[
|
|
abbrev abs address arg beep bitand bitor bitxor b2x center changestr charin
|
|
charout chars compare consition copies countstr c2d c2x datatype date delstr
|
|
delword digits directory d2c d2x errortext filespec form format fuzz insert
|
|
lastpos left length linein lineout lines max min overlay pos queued random
|
|
reverse right sign sourceline space stream strip substr subword symbol time
|
|
trace translate trunc value var verify word wordindex wordlength wordpos words
|
|
xrange x2b x2c x2d
|
|
rxfuncadd rxfuncdrop rxfuncquery rxmessagebox rxwinexec
|
|
sysaddrexxmacro sysbootdrive sysclearrexxmacrospace syscloseeventsem
|
|
sysclosemutexsem syscls syscreateeventsem syscreatemutexsem syscurpos
|
|
syscurstate sysdriveinfo sysdrivemap sysdropfuncs sysdroprexxmacro
|
|
sysdumpvariables sysfiledelete sysfilesearch sysfilesystemtype sysfiletree
|
|
sysfromunicode systounicode sysgeterrortext sysgetfiledatetime sysgetkey
|
|
sysini sysloadfuncs sysloadrexxmacrospace sysmkdir sysopeneventsem
|
|
sysopenmutexsem sysposteventsem syspulseeventsem sysqueryprocess
|
|
sysqueryrexxmacro sysreleasemutexsem sysreorderrexxmacro sysrequestmutexsem
|
|
sysreseteventsem sysrmdir syssaverexxmacrospace syssearchpath
|
|
syssetfiledatetime syssetpriority syssleep sysstemcopy sysstemdelete
|
|
syssteminsert sysstemsort sysswitchsession syssystemdirectory systempfilename
|
|
systextscreenread systextscreensize sysutilversion sysversion sysvolumelabel
|
|
syswaiteventsem syswaitnamedpipe syswindecryptfile syswinencryptfile syswinver
|
|
]], true)))
|
|
|
|
-- Identifiers.
|
|
local word = lexer.alpha * (lexer.alnum + S('@#$\\.!?_'))^0
|
|
lex:add_rule('identifier', token(lexer.IDENTIFIER, word))
|
|
|
|
-- Strings.
|
|
local sq_str = lexer.delimited_range("'", true, true)
|
|
local dq_str = lexer.delimited_range('"', true, true)
|
|
lex:add_rule('string', token(lexer.STRING, sq_str + dq_str))
|
|
|
|
-- Comments.
|
|
lex:add_rule('comment', token(lexer.COMMENT, '--' * lexer.nonnewline_esc^0 +
|
|
lexer.nested_pair('/*', '*/')))
|
|
|
|
-- Numbers.
|
|
lex:add_rule('number', token(lexer.NUMBER, lexer.float + lexer.integer))
|
|
|
|
-- Preprocessor.
|
|
lex:add_rule('preprocessor', token(lexer.PREPROCESSOR, lexer.starts_line('#') *
|
|
lexer.nonnewline^0))
|
|
|
|
-- Operators.
|
|
lex:add_rule('operator', token(lexer.OPERATOR, S('=!<>+-/\\*%&|^~.,:;(){}')))
|
|
|
|
-- Fold points
|
|
lex:add_fold_point(lexer.KEYWORD, 'do', 'end')
|
|
lex:add_fold_point(lexer.KEYWORD, 'select', 'return')
|
|
lex:add_fold_point(lexer.COMMENT, '/*', '*/')
|
|
lex:add_fold_point(lexer.COMMENT, '--', lexer.fold_line_comments('--'))
|
|
--lex:add_fold_point(lexer.OPERATOR, ':', ?)
|
|
|
|
return lex
|