edited 20050429: Added states to improve comment identification at the beginning of a line. Also Isolated single-quote characters to keep them from messing up other highlighting.
Might have a few more bugs with strings, but I'm working on them.
Code: Select all
// Macroquest2 TSyntaxMemo
// -----------------------
// Author : echoism
// Date : 29 April 2005
// Language: TSyntaxMemo
#define ss_DEFAULT 0
#define ss_LINESTART 1
#define ss_PARSED 2
#define mq_DIRECTIVE 10
#define mq_IDENTIFIER 11
#define mq_NUMBER 12
#define mq_OPERATOR 13
#define mq_DELIMIT 14
#define mq_STRING 15
#define mq_CHAR 16
#define mq_WHITESPACE 17
#define mq_NEWLINE 18
#define mq_COMMENT 20
#define mq_COMMENT_LINE 21
#define mq_COMMENT_BLOCK 22
#define mq_TLO 30
#define mq_IMMEDIATE 31
#define mq_REFERENCE 32
#define mq_INDEPENDENT 33
#define mq_MEMBER 34
#define mq_PARAM 35
#define mq_LABEL 40
#define mq_COMMAND 41
#define mq_KEYWORD 42
#define _non_alpha_ '[^_A-Za-z0-9]'
#define _all_chars_ '[\x00-\xFF]'
#define _no_chars_ '[]'
#define _dont_care_ _all_chars_
#define _DEFAULT_BACKGROUND clWhite
#define _DEFAULT_FOREGROUND clBlack
%%language
Name = 'Macroquest2 Script'
Case = __SENSITIVE
Options = __DEFAULT_OPTIONS
WordWrapColumn = _EDGE
Gutter = _DEFAULT_GUTTER
StartState = [ss_LINESTART]
ExampleText = '|** Comment **|\n\
\#include spell_routines.inc\n\
\/declare i int local 0\n\
\/echo ${i}\n'
EditableStyles ('Comment', mq_COMMENT),
('Directive', mq_DIRECTIVE),
('Command', mq_COMMAND),
('Keyword', mq_KEYWORD),
('Operator', mq_OPERATOR),
('Delimiter', mq_DELIMIT),
('Identifier', mq_IDENTIFIER),
('Number', mq_NUMBER),
('String', mq_STRING),
('Label', mq_LABEL),
('Default', ss_DEFAULT)
%%words
'+' _dont_care_ mq_OPERATOR
'-' _dont_care_ mq_OPERATOR
'*' _dont_care_ mq_OPERATOR
'&' _dont_care_ mq_OPERATOR
'!' _dont_care_ mq_OPERATOR
'~' _dont_care_ mq_OPERATOR
'%' _dont_care_ mq_OPERATOR
'>' _dont_care_ mq_OPERATOR
'<' _dont_care_ mq_OPERATOR
'>>' _dont_care_ mq_OPERATOR
'<<' _dont_care_ mq_OPERATOR
'>=' _dont_care_ mq_OPERATOR
'<=' _dont_care_ mq_OPERATOR
'==' _dont_care_ mq_OPERATOR
'=' _dont_care_ mq_OPERATOR
'!=' _dont_care_ mq_OPERATOR
'^^' _dont_care_ mq_OPERATOR
'^' _dont_care_ mq_OPERATOR
'&&' _dont_care_ mq_OPERATOR
'||' _dont_care_ mq_OPERATOR
';' _dont_care_ mq_DELIMIT [ss_LINESTART ss_DEFAULT]
'(' _dont_care_ mq_DELIMIT [ss_LINESTART ss_DEFAULT]
')' _dont_care_ mq_DELIMIT [ss_LINESTART ss_DEFAULT]
'[' _dont_care_ mq_DELIMIT [ss_LINESTART ss_DEFAULT]
']' _dont_care_ mq_DELIMIT [ss_LINESTART ss_DEFAULT]
'{' _dont_care_ mq_DELIMIT [ss_LINESTART ss_DEFAULT]
'}' _dont_care_ mq_DELIMIT [ss_LINESTART ss_DEFAULT]
'$' '{' mq_DELIMIT [ss_DEFAULT]
'|**' _dont_care_ mq_COMMENT_BLOCK [ss_LINESTART]
'#turbo' _dont_care_ mq_DIRECTIVE [ss_LINESTART]
'#define' _dont_care_ mq_DIRECTIVE [ss_LINESTART]
'#include' _dont_care_ mq_DIRECTIVE [ss_LINESTART]
'#event' _dont_care_ mq_DIRECTIVE [ss_LINESTART]
'#chat' _dont_care_ mq_DIRECTIVE [ss_LINESTART]
'debug' _non_alpha_ mq_KEYWORD [ss_DEFAULT]
'else' _non_alpha_ mq_KEYWORD [ss_DEFAULT]
'local' _non_alpha_ mq_KEYWORD [ss_DEFAULT]
'outer' _non_alpha_ mq_KEYWORD [ss_DEFAULT]
'global' _non_alpha_ mq_KEYWORD [ss_DEFAULT]
'[mM][aA][iI][nN]' _non_alpha_ mq_KEYWORD [ss_DEFAULT]
'off' _non_alpha_ mq_KEYWORD [ss_DEFAULT]
'on' _non_alpha_ mq_KEYWORD [ss_DEFAULT]
'to' _non_alpha_ mq_KEYWORD [ss_DEFAULT]
'Param' _non_alpha_ mq_PARAM [ss_DEFAULT]
'pc' _non_alpha_ mq_PARAM [ss_DEFAULT]
'npc' _non_alpha_ mq_PARAM [ss_DEFAULT]
'pet' _non_alpha_ mq_PARAM [ss_DEFAULT]
'nopet' _non_alpha_ mq_PARAM [ss_DEFAULT]
//'corpse' _non_alpha_ mq_PARAM
'trigger' _non_alpha_ mq_PARAM [ss_DEFAULT]
'untargetable' _non_alpha_ mq_PARAM [ss_DEFAULT]
'trap' _non_alpha_ mq_PARAM [ss_DEFAULT]
'check' _non_alpha_ mq_PARAM [ss_DEFAULT]
//'timer' _non_alpha_ mq_PARAM
'any' _non_alpha_ mq_PARAM [ss_DEFAULT]
'next' _non_alpha_ mq_PARAM [ss_DEFAULT]
'prev' _non_alpha_ mq_PARAM [ss_DEFAULT]
'lfg' _non_alpha_ mq_PARAM [ss_DEFAULT]
'gm' _non_alpha_ mq_PARAM [ss_DEFAULT]
//'group' _non_alpha_ mq_PARAM
'trader' _non_alpha_ mq_PARAM [ss_DEFAULT]
'range' _non_alpha_ mq_PARAM [ss_DEFAULT]
'loc' _non_alpha_ mq_PARAM [ss_DEFAULT]
'id' _non_alpha_ mq_PARAM [ss_DEFAULT]
'radius' _non_alpha_ mq_PARAM [ss_DEFAULT]
//'body' _non_alpha_ mq_PARAM
//'class' _non_alpha_ mq_PARAM
//'race' _non_alpha_ mq_PARAM
'light' _non_alpha_ mq_PARAM [ss_DEFAULT]
'GUILD' _non_alpha_ mq_PARAM [ss_DEFAULT]
'guild' _non_alpha_ mq_PARAM [ss_DEFAULT]
'noguild' _non_alpha_ mq_PARAM [ss_DEFAULT]
'alert' _non_alpha_ mq_PARAM [ss_DEFAULT]
'noalert' _non_alpha_ mq_PARAM [ss_DEFAULT]
'notnearalert' _non_alpha_ mq_PARAM [ss_DEFAULT]
'nearalert' _non_alpha_ mq_PARAM [ss_DEFAULT]
'zradius' _non_alpha_ mq_PARAM [ss_DEFAULT]
'notid' _non_alpha_ mq_PARAM [ss_DEFAULT]
'nopcnear' _non_alpha_ mq_PARAM [ss_DEFAULT]
'named' _non_alpha_ mq_PARAM [ss_DEFAULT]
'AltAbility' _non_alpha_ mq_TLO [ss_DEFAULT]
'Bool' _non_alpha_ mq_TLO [ss_DEFAULT]
'Me' _non_alpha_ mq_TLO [ss_DEFAULT]
'Corpse' _non_alpha_ mq_TLO [ss_DEFAULT]
'Cursor' _non_alpha_ mq_TLO [ss_DEFAULT]
'Defined' _non_alpha_ mq_TLO [ss_DEFAULT]
'Ground' _non_alpha_ mq_TLO [ss_DEFAULT]
'FindItem' _non_alpha_ mq_TLO [ss_DEFAULT]
'FindItemBank' _non_alpha_ mq_TLO [ss_DEFAULT]
'FineItemBankCount' _non_alpha_ mq_TLO [ss_DEFAULT]
'FindItemCount' _non_alpha_ mq_TLO [ss_DEFAULT]
'Float' _non_alpha_ mq_TLO [ss_DEFAULT]
'GameTime' _non_alpha_ mq_TLO [ss_DEFAULT]
'Group' _non_alpha_ mq_TLO [ss_DEFAULT]
'Heading' _non_alpha_ mq_TLO [ss_DEFAULT]
'If' _non_alpha_ mq_TLO [ss_DEFAULT]
'Ini' _non_alpha_ mq_TLO [ss_DEFAULT]
'Int' _non_alpha_ mq_TLO [ss_DEFAULT]
'InvSlot' _non_alpha_ mq_TLO [ss_DEFAULT]
'LastSpawn' _non_alpha_ mq_TLO [ss_DEFAULT]
'LineOfSight' _non_alpha_ mq_TLO [ss_DEFAULT]
'Macro' _non_alpha_ mq_TLO [ss_DEFAULT]
'MacroQuest' _non_alpha_ mq_TLO [ss_DEFAULT]
'Math' _non_alpha_ mq_TLO [ss_DEFAULT]
'Merchant' _non_alpha_ mq_TLO [ss_DEFAULT]
'NamingSpawn' _non_alpha_ mq_TLO [ss_DEFAULT]
'NearestSpawn' _non_alpha_ mq_TLO [ss_DEFAULT]
'Plugin' _non_alpha_ mq_TLO [ss_DEFAULT]
'Raid' _non_alpha_ mq_TLO [ss_DEFAULT]
'SelecteItem' _non_alpha_ mq_TLO [ss_DEFAULT]
'Skill' _non_alpha_ mq_TLO [ss_DEFAULT]
'Spawn' _non_alpha_ mq_TLO [ss_DEFAULT]
'SpawnCount' _non_alpha_ mq_TLO [ss_DEFAULT]
'Spell' _non_alpha_ mq_TLO [ss_DEFAULT]
'String' _non_alpha_ mq_TLO [ss_DEFAULT]
'Switch' _non_alpha_ mq_TLO [ss_DEFAULT]
'Target' _non_alpha_ mq_TLO [ss_DEFAULT]
'Time' _non_alpha_ mq_TLO [ss_DEFAULT]
'Type' _non_alpha_ mq_TLO [ss_DEFAULT]
'Window' _non_alpha_ mq_TLO [ss_DEFAULT]
'Zone' _non_alpha_ mq_TLO [ss_DEFAULT]
'argb' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'bool' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'body' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'byte' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'class' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'corpse' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'deity' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'float' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'heading' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'int' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'invslot' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'ticks' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'race' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'raidmember' _non_alpha_ mq_IMMEDIATE [ss_DEFAULT]
'altability' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'array' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'buff' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'character' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'ground' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'item' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'plugin' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'skill' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'spawn' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'spell' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'string' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'switch' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'time' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'timer' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'type' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'window' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'zone' _non_alpha_ mq_REFERENCE [ss_DEFAULT]
'currentzone' _non_alpha_ mq_INDEPENDENT [ss_DEFAULT]
'macro' _non_alpha_ mq_INDEPENDENT [ss_DEFAULT]
'macroquest' _non_alpha_ mq_INDEPENDENT [ss_DEFAULT]
'math' _non_alpha_ mq_INDEPENDENT [ss_DEFAULT]
'merchant' _non_alpha_ mq_INDEPENDENT [ss_DEFAULT]
'raid' _non_alpha_ mq_INDEPENDENT [ss_DEFAULT]
'group' _non_alpha_ mq_INDEPENDENT [ss_DEFAULT]
'|' _dont_care_ mq_COMMENT_LINE [ss_LINESTART]
'Sub' _non_alpha_ mq_COMMAND [ss_LINESTART]
'sub' _non_alpha_ mq_COMMAND [ss_LINESTART]
'\'' _dont_care_ mq_IDENTIFIER [ss_DEFAULT ss_LINESTART]
%%handlers
mq_COMMENT_LINE '[^\n]'? '\n' _discard_
mq_COMMENT_BLOCK _all_chars_? '**|' _use_
mq_DIRECTIVE '[^\n]'? '\n' _discard_
%%tokens
mq_STRING __STD_C_STRING
mq_CHAR __STD_C_CHAR
mq_IDENTIFIER __STD_IDENTIFIER [ss_LINESTART ss_DEFAULT]
mq_NUMBER '[0-9]' '[0-9.]'? '[^0-9.]' _discard_
mq_LABEL '[:]' '[a-zA-Z0-9_\.]' '[^a-zA-Z0-9_\.]' _discard_ [ss_LINESTART ss_DEFAULT]
mq_COMMAND '[/]' '[_a-zA-Z0-9]' _non_alpha_ _discard_ [ss_LINESTART ss_DEFAULT]
mq_MEMBER '[.]' '[_a-zA-Z0-9]' _non_alpha_ _discard_ [ss_LINESTART ss_DEFAULT]
mq_NEWLINE '[\n]' '[\s\t\n]'? '[^\s\t\n]' _discard_ [ss_LINESTART ss_DEFAULT]
mq_WHITESPACE '[\s\t]' '[\s\t]'? '[^\s\t]' _discard_
%%states
ss_DEFAULT (-[ss_LINESTART] +[ss_DEFAULT])
mq_DIRECTIVE (-[ss_LINESTART] +[ss_DEFAULT])
mq_IDENTIFIER (-[ss_LINESTART] +[ss_DEFAULT])
mq_LABEL (-[ss_LINESTART] +[ss_DEFAULT])
mq_DELIMIT (-[ss_LINESTART] +[ss_DEFAULT])
mq_KEYWORD (-[ss_LINESTART] +[ss_DEFAULT])
mq_COMMAND (-[ss_LINESTART] +[ss_DEFAULT])
mq_NEWLINE (+[ss_LINESTART] -[ss_DEFAULT])
%%effects
ss_DEFAULT [] _DEFAULT_FOREGROUND _DEFAULT_BACKGROUND
mq_IDENTIFIER [] clOlive _DEFAULT_BACKGROUND
mq_STRING [fsItalic] clTeal _DEFAULT_BACKGROUND
mq_COMMENT [] clGreen _DEFAULT_BACKGROUND
mq_KEYWORD [] clPurple _DEFAULT_BACKGROUND
mq_COMMAND [fsBold] clPurple _DEFAULT_BACKGROUND
mq_NUMBER [] clRed _DEFAULT_BACKGROUND
mq_DIRECTIVE [] clBlue _DEFAULT_BACKGROUND
mq_OPERATOR [] _DEFAULT_FOREGROUND _DEFAULT_BACKGROUND
mq_DELIMIT [] _DEFAULT_FOREGROUND _DEFAULT_BACKGROUND
mq_LABEL [fsUnderline] clMaroon _DEFAULT_BACKGROUND
%%map
ss_DEFAULT ss_DEFAULT
mq_DIRECTIVE mq_DIRECTIVE
mq_IDENTIFIER mq_IDENTIFIER
mq_NUMBER mq_NUMBER
mq_LABEL mq_LABEL
mq_OPERATOR mq_OPERATOR
mq_DELIMIT mq_DELIMIT
mq_COMMENT mq_COMMENT
mq_COMMENT_LINE mq_COMMENT
mq_COMMENT_BLOCK mq_COMMENT
mq_KEYWORD mq_KEYWORD
mq_PARAM mq_KEYWORD
mq_TLO mq_KEYWORD
mq_IMMEDIATE mq_KEYWORD
mq_REFERENCE mq_KEYWORD
mq_INDEPENDENT mq_KEYWORD
mq_MEMBER mq_KEYWORD
mq_COMMAND mq_COMMAND
mq_STRING mq_STRING
mq_CHAR mq_STRING
mq_WHITESPACE ss_DEFAULT
mq_NEWLINE ss_DEFAULT