392 lines
7.8 KiB
Plaintext
392 lines
7.8 KiB
Plaintext
|
# JOE syntax highlight file for SML
|
||
|
|
||
|
# A (deterministic) state machine which performs lexical analysis of SML.
|
||
|
# (This is the "assembly language" of syntax highlighting. A separate
|
||
|
# program could be used to convert a regular expression NFA syntax into this
|
||
|
# format).
|
||
|
|
||
|
# Each state begins with ':<name> <color-name>'
|
||
|
# <color-name> is the color used for characters eaten by the state
|
||
|
# (really a symbol for a user definable color).
|
||
|
|
||
|
# The first state defined is the initial state.
|
||
|
|
||
|
# Within a state, define transitions (jumps) to other states. Each
|
||
|
# jump has the form: <character-list> <target-state> [<option>s]
|
||
|
|
||
|
# There are two ways to specify <character-list>s, either * for any
|
||
|
# character not otherwise specified, or a literal list of characters within
|
||
|
# quotes (ranges and escape sequences allows). When the next character
|
||
|
# matches any in the list, a jump to the target-state is taken and the
|
||
|
# character is eaten (we advance to the next character of the file to be
|
||
|
# colored).
|
||
|
#
|
||
|
# The * transition should be the first transition specified in the state.
|
||
|
#
|
||
|
# There are several options:
|
||
|
# noeat do not eat the character, instead feed it to the next state
|
||
|
# (this tends to make the states smaller, but be careful: you
|
||
|
# can make infinite loops). 'noeat' implies 'recolor=-1'.
|
||
|
#
|
||
|
# recolor=-N Recolor the past N characters with the color of the
|
||
|
# target-state. For example once /* is recognized as the
|
||
|
# start of C comment, you want to color the /* with the C
|
||
|
# comment color.
|
||
|
#
|
||
|
# buffer start copying characters to a buffer, beginning with this
|
||
|
# one (it's ok to not terminate buffering with a matching
|
||
|
# 'strings' option- the buffer is limited to leading 19
|
||
|
# characters).
|
||
|
#
|
||
|
# strings A list of strings follows. If the buffer matches any of the
|
||
|
# given strings, a jump to the target-state in the string list
|
||
|
# is taken instead of the normal jump.
|
||
|
#
|
||
|
# istrings Same as strings, but case is ignored.
|
||
|
#
|
||
|
# hold Stop buffering string- a future 'strings' or 'istrings' will
|
||
|
# look at contents of buffer at this point. Useful for distinguishing
|
||
|
# commands and function calls in some languages 'write 7' is a command
|
||
|
# 'write (' is a function call- hold lets us stop at the space and delay
|
||
|
# the string lookup until the ( or 7.
|
||
|
#
|
||
|
# The format of the string list is:
|
||
|
#
|
||
|
# "string" <target-state> [<options>s]
|
||
|
# "string" <target-state> [<options>s]
|
||
|
# done
|
||
|
#
|
||
|
# (all of the options above are allowed except "strings", "istrings" and "noeat". noeat is
|
||
|
# always implied after a matched string).
|
||
|
#
|
||
|
# Weirdness: only states have colors, not transitions. This means that you
|
||
|
# sometimes have to make dummy states with '* next-state noeat' just to get
|
||
|
# a color specification.
|
||
|
|
||
|
# Define no. sync lines
|
||
|
# You can say:
|
||
|
# -200 means 200 lines
|
||
|
# - means always start parsing from beginning of file when we lose sync
|
||
|
# if nothing is specified, the default is -50
|
||
|
|
||
|
# Define colors
|
||
|
#
|
||
|
# bold inverse blink dim underline
|
||
|
# white cyan magenta blue yellow green red black
|
||
|
# bg_white bg_cyan bg_magenta bg_blue bg_yellow bg_green bg_red bg_black
|
||
|
|
||
|
=Expr
|
||
|
=Bad bg_red
|
||
|
=Comment green
|
||
|
=Literal cyan
|
||
|
=Escape bold cyan
|
||
|
=Type blue
|
||
|
=Keyword bold
|
||
|
=Operator bold black
|
||
|
=Control green
|
||
|
=Id
|
||
|
|
||
|
:expr Expr
|
||
|
* expr
|
||
|
".,[{})];" control recolor=-1 # . or ... both control
|
||
|
"(" bracket recolor=-1
|
||
|
"_" underline recolor=-1
|
||
|
"!%&$+/:<=>?@`^|*\-" operator buffer recolor=-1
|
||
|
"#" hash recolor=-1
|
||
|
"~" tilde recolor=-1
|
||
|
"0" zero recolor=-1
|
||
|
"1-9" decimal recolor=-1
|
||
|
"\"" string recolor=-1
|
||
|
"a-zA-Z" id buffer recolor=-1
|
||
|
|
||
|
:bad Bad
|
||
|
* expr
|
||
|
|
||
|
:control Control
|
||
|
* expr noeat
|
||
|
|
||
|
:bracket Control
|
||
|
* expr noeat
|
||
|
"*" comment1 recolor=-2
|
||
|
|
||
|
:underline Keyword
|
||
|
* expr noeat
|
||
|
"a-zA-Z" kw
|
||
|
|
||
|
:operator Operator
|
||
|
* expr noeat strings
|
||
|
":>" colon
|
||
|
":" colon
|
||
|
"::" control # can be overloaded, but you would burn in hell
|
||
|
":=" control # ditto
|
||
|
"=" control # only in some contexts is it _really_ control
|
||
|
"->" control
|
||
|
"=>" control
|
||
|
"|" control
|
||
|
done
|
||
|
"!%&$+/:<=>?@~`^|#*\-" operator
|
||
|
|
||
|
:colon Control
|
||
|
* type1 noeat
|
||
|
|
||
|
:hash Control
|
||
|
* expr noeat
|
||
|
"!%&$+/:<=>?@~`^|#*\-" operator recolor=-2
|
||
|
"\"" string recolor=-2
|
||
|
|
||
|
:tilde Operator
|
||
|
* expr noeat
|
||
|
"!%&$+/:<=>?@~`^|#*\-" operator
|
||
|
"0" zero recolor=-2
|
||
|
"1-9" decimal recolor=-2
|
||
|
|
||
|
:zero Literal
|
||
|
* expr noeat
|
||
|
"0-9" decimal
|
||
|
"w" word buffer
|
||
|
"x" hex1 buffer
|
||
|
"e" epart buffer
|
||
|
"E" epart buffer
|
||
|
"." float1
|
||
|
|
||
|
:word Literal
|
||
|
* id noeat recolor=-2
|
||
|
"0-9" decimal
|
||
|
"x" hexword
|
||
|
|
||
|
:hexword Literal
|
||
|
* id noeat recolor=-3
|
||
|
"0-9a-fA-F" hex
|
||
|
|
||
|
:hex1 Literal
|
||
|
* id noeat recolor=-2
|
||
|
"0-9a-fA-F" hex
|
||
|
|
||
|
:hex Literal
|
||
|
* expr noeat
|
||
|
"0-9a-fA-F" hex
|
||
|
|
||
|
:decimal Literal
|
||
|
* expr noeat
|
||
|
"0-9" decimal
|
||
|
"." float1
|
||
|
"e" epart buffer
|
||
|
"E" epart buffer
|
||
|
|
||
|
# trailing digits required in SML (unlike OCaml)
|
||
|
:float1 Literal
|
||
|
* bad noeat
|
||
|
"0-9" float
|
||
|
|
||
|
:float Literal
|
||
|
* expr noeat
|
||
|
"0-9" float
|
||
|
"e" epart buffer
|
||
|
"E" epart buffer
|
||
|
|
||
|
:epart Literal
|
||
|
* id noeat recolor=-2
|
||
|
"0-9" enum
|
||
|
"~" epart # bug: 3e~~3
|
||
|
|
||
|
:enum Literal
|
||
|
* expr noeat
|
||
|
"0-9" enum
|
||
|
|
||
|
:string Literal
|
||
|
* string
|
||
|
"\"" expr
|
||
|
"\n" bad
|
||
|
"\\" string_escape recolor=-1
|
||
|
|
||
|
:string_escape Escape
|
||
|
* bad noeat
|
||
|
"abfnrtv\"\\" string
|
||
|
"^" string_carret
|
||
|
"u" string_hex1
|
||
|
"0-9" string_decimal2
|
||
|
"\n\r\f\t " string_eatws
|
||
|
|
||
|
:string_carret Escape
|
||
|
* bad noeat
|
||
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZ\\^_" string
|
||
|
|
||
|
:string_eatws Escape
|
||
|
* bad noeat
|
||
|
"\n\r\f\t " string_eatws
|
||
|
"\\" string
|
||
|
|
||
|
:string_hex1 Escape
|
||
|
* bad noeat
|
||
|
"0-9a-fA-F" string_hex2
|
||
|
|
||
|
:string_hex2 Escape
|
||
|
* bad noeat
|
||
|
"0-9a-fA-F" string_hex3
|
||
|
|
||
|
:string_hex3 Escape
|
||
|
* bad noeat
|
||
|
"0-9a-fA-F" string_hex4
|
||
|
|
||
|
:string_hex4 Escape
|
||
|
* bad noeat
|
||
|
"0-9a-fA-F" string
|
||
|
|
||
|
:string_decimal2 Escape
|
||
|
* bad noeat
|
||
|
"0-9" string_decimal3
|
||
|
|
||
|
:string_decimal3 Escape
|
||
|
* bad noeat
|
||
|
"0-9" string
|
||
|
|
||
|
:id Id
|
||
|
* expr noeat strings
|
||
|
"_" kw
|
||
|
"ann" kw
|
||
|
"and" kw
|
||
|
"as" kw
|
||
|
"case" kw
|
||
|
"do" kw
|
||
|
"else" kw
|
||
|
"end" kw
|
||
|
"exception" kw
|
||
|
"fn" kw
|
||
|
"fun" kw
|
||
|
"functor" kw
|
||
|
"handle" kw
|
||
|
"if" kw
|
||
|
"in" kw
|
||
|
"include" kw
|
||
|
"infix" kw
|
||
|
"infixr" kw
|
||
|
"let" kw
|
||
|
"local" kw
|
||
|
"nil" kw
|
||
|
"nonfix" kw
|
||
|
"of" kw
|
||
|
"op" kw
|
||
|
"open" kw
|
||
|
"raise" kw
|
||
|
"rec" kw
|
||
|
"sharing" kw
|
||
|
"sig" kw
|
||
|
"signature" kw
|
||
|
"struct" kw
|
||
|
"structure" kw
|
||
|
"then" kw
|
||
|
"val" kw
|
||
|
"where" kw
|
||
|
"while" kw
|
||
|
"with" kw
|
||
|
"abstype" kwtype
|
||
|
"datatype" kwtype
|
||
|
"eqtype" kwtype
|
||
|
"type" kwtype
|
||
|
"withtype" kwtype
|
||
|
"before" operatorkw
|
||
|
"o" operatorkw
|
||
|
"orelse" operatorkw
|
||
|
"andalso" operatorkw
|
||
|
"div" operatorkw
|
||
|
"mod" operatorkw
|
||
|
done
|
||
|
"a-zA-Z0-9_'" id
|
||
|
|
||
|
:kw Keyword
|
||
|
* expr noeat
|
||
|
"a-zA-Z0-9_'" kw
|
||
|
|
||
|
:operatorkw Operator
|
||
|
* expr noeat
|
||
|
|
||
|
:kwtype Keyword
|
||
|
* kwtype1 noeat
|
||
|
|
||
|
:kwtype1 Type
|
||
|
* expr noeat
|
||
|
"=" typeval recolor=-1
|
||
|
"a-zA-Z0-9_'., :|*>\t\-" kwtype1
|
||
|
"({" kwtype2
|
||
|
|
||
|
:kwtype2 Type
|
||
|
* expr noeat
|
||
|
")}" kwtype1
|
||
|
"a-zA-Z0-9_'., :|*>\t\n\-" kwtype2
|
||
|
"({" kwtype3
|
||
|
|
||
|
:kwtype3 Type
|
||
|
* expr noeat
|
||
|
")}" kwtype2
|
||
|
"a-zA-Z0-9_'., :|*>\t\n\-" kwtype3
|
||
|
"({" expr # too deep nesting
|
||
|
|
||
|
:typeval Control
|
||
|
* type1 noeat
|
||
|
" \t\n" typeval
|
||
|
|
||
|
:type1 Type
|
||
|
* expr noeat
|
||
|
"a-zA-Z0-9_'., :|*>\t\-" type1
|
||
|
"({" type2
|
||
|
|
||
|
:type2 Type
|
||
|
* expr noeat
|
||
|
")}" type1
|
||
|
"a-zA-Z0-9_'., :|*>\t\n\-" type2
|
||
|
"({" type3
|
||
|
|
||
|
:type3 Type
|
||
|
* expr noeat
|
||
|
")}" type2
|
||
|
"a-zA-Z0-9_'., :|*>\t\n\-" type3
|
||
|
"({" type4
|
||
|
|
||
|
:type4 Type
|
||
|
* expr noeat
|
||
|
")}" type3
|
||
|
"a-zA-Z0-9_'., :|*>\t\n\-" type4
|
||
|
"({" expr # too deep nesting
|
||
|
|
||
|
:comment1 Comment
|
||
|
* comment1
|
||
|
"(" nestcomment1
|
||
|
"*" endcomment1
|
||
|
|
||
|
:nestcomment1 Comment
|
||
|
* comment1
|
||
|
"*" comment2
|
||
|
|
||
|
:endcomment1 Comment
|
||
|
* comment1
|
||
|
")" expr
|
||
|
"*" endcomment1
|
||
|
|
||
|
:comment2 Comment
|
||
|
* comment2
|
||
|
"(" nestcomment2
|
||
|
"*" endcomment2
|
||
|
|
||
|
:nestcomment2 Comment
|
||
|
* comment2
|
||
|
"*" comment3
|
||
|
|
||
|
:endcomment2 Comment
|
||
|
* comment2
|
||
|
")" comment1
|
||
|
"*" endcomment2
|
||
|
|
||
|
:comment3 Comment
|
||
|
* comment3
|
||
|
"(" nestcomment3
|
||
|
"*" endcomment3
|
||
|
|
||
|
:nestcomment3 Comment
|
||
|
* comment3
|
||
|
"*" expr # too deep nesting
|
||
|
|
||
|
:endcomment3 Comment
|
||
|
* comment3
|
||
|
")" comment2
|
||
|
"*" endcomment3
|