-- Copyright 2010-2019 Jeff Stone. See License.txt. -- Inform LPeg lexer for Scintilla. -- JMS 2010-04-25. 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('inform') -- Whitespace. lex:add_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1)) -- Keywords. lex:add_rule('keyword', token(lexer.KEYWORD, word_match[[ Abbreviate Array Attribute Class Constant Default End Endif Extend Global Ifdef Iffalse Ifndef Ifnot Iftrue Import Include Link Lowstring Message Object Property Release Replace Serial StartDaemon Statusline StopDaemon Switches Verb absent action actor add_to_scope address additive after and animate article articles before bold box break cant_go capacity char class child children clothing concealed container continue creature daemon deadflag default describe description do door door_dir door_to d_to d_obj e_to e_obj each_turn edible else enterable false female first font for found_in general give grammar has hasnt held if in in_to in_obj initial inside_description invent jump last life light list_together location lockable locked male move moved multi multiexcept multiheld multiinside n_to n_obj ne_to ne_obj nw_to nw_obj name neuter new_line nothing notin noun number objectloop ofclass off on only open openable or orders out_to out_obj parent parse_name player plural pluralname print print_ret private proper provides random react_after react_before remove replace return reverse rfalseroman rtrue s_to s_obj se_to se_obj sw_to sw_obj scenery scope score scored second self short_name short_name_indef sibling spaces static string style supporter switch switchable talkable thedark time_left time_out to topic transparent true underline u_to u_obj visited w_to w_obj when_closed when_off when_on when_open while with with_key workflag worn ]])) -- Library actions. lex:add_rule('action', token('action', word_match[[ Answer Ask AskFor Attack Blow Burn Buy Climb Close Consult Cut Dig Disrobe Drink Drop Eat Empty EmptyT Enter Examine Exit Fill FullScore GetOff Give Go GoIn Insert Inv InvTall InvWide Jump JumpOver Kiss LetGo Listen LMode1 LMode2 LMode3 Lock Look LookUnder Mild No NotifyOff NotifyOn Objects Open Order Places Pray Pronouns Pull Push PushDir PutOn Quit Receive Remove Restart Restore Rub Save Score ScriptOff ScriptOn Search Set SetTo Show Sing Sleep Smell Sorry Squeeze Strong Swim Swing SwitchOff SwitchOn Take Taste Tell Think ThrowAt ThrownAt Tie Touch Transfer Turn Unlock VagueGo Verify Version Wait Wake WakeOther Wave WaveHands Wear Yes ]])) lex:add_style('action', lexer.STYLE_VARIABLE) -- Identifiers. lex:add_rule('identifier', token(lexer.IDENTIFIER, lexer.word)) -- Strings. lex:add_rule('string', token(lexer.STRING, lexer.delimited_range("'") + lexer.delimited_range('"'))) -- Comments. lex:add_rule('comment', token(lexer.COMMENT, '!' * lexer.nonnewline^0)) -- Numbers. local inform_hex = '$' * lexer.xdigit^1 local inform_bin = '$$' * S('01')^1 lex:add_rule('number', token(lexer.NUMBER, lexer.integer + inform_hex + inform_bin)) -- Operators. lex:add_rule('operator', token(lexer.OPERATOR, S('@~=+-*/%^#=<>;:,.{}[]()&|?'))) return lex