joe/syntax/ruby.jsf
2024-10-16 10:58:52 +08:00

704 lines
11 KiB
Plaintext

# JOE syntax highlight file for Ruby
# Glitches:
# <<EOF1, <<EOF2 is not working. Only EOF1 is seen. It should wait for the
# EOF2.
=Idle
=Comment
=Constant
=Number +Constant
=String +Constant
=StringEscape +Escape
=StringVariable +StringEscape
=Regex +String
=RegexEscape +StringEscape
=Boolean +Constant
=Escape
=Type
=Keyword
=Statement +Keyword
=Operator +Keyword
=Conditional +Statement
=Loop +Statement
=Label +DefinedIdent
=StorageClass +Type +Keyword
=Structure +Statement
=Bad
=Brace
=Symbol +Constant +DefinedIdent
=SymbolEscape +Escape
=ProcArg +DefinedIdent
=GlobalVar +Builtin # TODO: No good class for this.
=DefinedType +DefinedIdent +Ident
=DefinedFunction +DefinedIdent +Ident
=ClassMember +Variable +DefinedIdent
=POD +Preproc
# Detect pod
:pre_idle Idle
* NULL noeat call=.ruby()
.subr ruby
:idle Idle
* rest noeat
"=" pod_start
# Rest of line
:rest Idle
* rest
"(" after_term call=.ruby(paren)
"[" after_term call=.ruby(brack)
"{" do_brace recolor=-1 noeat
.ifdef paren
")" rest return
.else
")" stray recolor=-1
.endif
.ifdef brack
"]" rest return
.else
"]" stray recolor=-1
.endif
.ifdef squiggly
"}" brace recolor=-1 return
.else
"}" stray recolor=-1
.endif
"#" line_comment recolor=-1
.ifdef haml
"\n" NULL return
.else
"\n" idle
.endif
"0" first_digit recolor=-1
"1-9" decimal recolor=-1
"." ident_no_kw
"\"" string recolor=-1
"'" char recolor=-1
"`" backtick recolor=-1
"/" regex recolor=-1
"<" maybe_inc
"$" not_string buffer
"%" pstring
"\i" ident buffer
"?" opr
# higher level, ruby specific
":" maybe_symbol
# "|" proc_arg
"@" class_member1
:opr Idle
* rest noeat
"/" rest
"%" rest
:do_brace Brace
* rest noeat
"{" brace call=.ruby(squiggly)
:brace Brace
* after_term noeat
:stray Bad
* rest
# / / regex not allowed after terms
:after_term Idle
* rest noeat
" \t" after_term
.ifdef erb
"/" rest
"%" after_term_erb_end
.else
"/%" rest
.endif
:after_term_erb_end Idle
* rest noeat
">" NULL recolor=-2 return
:pod_start Idle
* pod_start
"\n" pod_block
:pod_block POD
* pod_block
"=" pod_ident buffer
:pod_ident POD
* pod_block noeat strings
"=end" rest
done
"\c" pod_ident
:maybe_inc Idle
* after_term noeat
"<" maybe_inc1
:maybe_inc1 Idle
* after_term noeat
"-" allow_space
"'\"" quoted_inc_start save_c recolor=-1
"\i" inc buffer noeat
:allow_space Idle
* after_term noeat
"'\"" quoted_inc_start_allow save_c recolor=-1
"\i" inc_allow buffer noeat
:quoted_inc_start StringVariable string
* quoted_inc buffer
:quoted_inc_start_allow StringVariable string
* quoted_inc_allow buffer
:quoted_inc StringVariable string
* quoted_inc
& skipline save_s
:quoted_inc_allow StringVariable string
* quoted_inc_allow
& skipline_allow save_s
:inc StringVariable string
* skipline save_s noeat
"\c" inc
:inc_allow StringVariable string
* skipline_allow save_s noeat
"\c" inc_allow
# Should be treated as a normal line here...
:skipline Idle
* skipline
"\n" next_line
:skipline_allow Idle
* skipline_allow
"\n" next_line_allow
:todelim String string
* todelim
"\n" next_line strings
"&" founddelim
done
:todelim_allow String string
* todelim_allow
"\n" next_line_allow strings
"&" founddelim
done
# eat \n so it's not in string.
:next_line String string
* todelim buffer
"\n" next_line
:next_line_allow String string
* todelim_allow buffer
" \t\n" next_line_allow
:founddelim StringEscape string
* idle noeat
:regex Regex string
* regex
"\\" regex_quote recolor=-1
"/" after_term
:regex_quote RegexEscape string
* regex
:not_string Idle
* rest noeat
"\c" global_var recolor=-2
"\"'`#/" rest
:brace Brace
* rest noeat
:line_comment Comment comment
* line_comment
.ifdef erb
"%" line_comment_maybe_erb_end
.endif
"BFHNTX" line_comment noeat call=comment_todo.comment_todo()
.ifdef haml
"\n" NULL return
.else
"\n" idle
.endif
:line_comment_maybe_erb_end Comment comment
">" NULL recolor=-2 return
:end_of_file_comment Comment comment
* end_of_file_comment
:first_digit Number
* after_term noeat
"x" hex
"b" binary
"." maybe_float
"eE" epart
"0-7" octal
"89" bad_number recolor=-1
:bad_number Bad
* after_term noeat
"0-9" bad_number
:octal Number
* after_term noeat
"0-7_" octal
"89" bad_number recolor=-1
:binary Number
* after_term noeat
"01_" binary
"2-9" bad_number recolor=-1
:hex Number
* after_term noeat
"0-9A-Fa-f_" hex
:decimal Number
* after_term noeat
"0-9_" decimal
"eE" epart
"." maybe_float
:maybe_float Idle
* after_term noeat recolor=-2
"0-9" float noeat
:float Number
* after_term noeat
"eE" epart
"0-9_" float
:epart Number
* after_term noeat
"0-9+\-" enum
:enum Number
* after_term noeat
"0-9_" enum
:string String string
* string
"\"" after_term
"\\" string_escape recolor=-1
"#" maybe_string_subst recolor=-1
:maybe_string_subst String string
* string noeat
"{" string_subst_begin recolor=-2
:string_subst_begin StringEscape string
* string_subst noeat call=.ruby(squiggly)
:string_subst StringEscape string
* string noeat
:string_escape Escape
* string
"x" string_hex1
"c" string_ctrl
"N" string_named
"0-7" string_octal2
"\n" string recolor=-2
:string_named Escape
* string
"{" string_named_rest
:string_named_rest Escape
* string_named_rest
"}" string
:string_ctrl Escape
* string
:string_hex1 Escape
* string noeat
"{" string_unicode
"0-9a-fA-F" string_hex2
:string_unicode Escape
* string_unicode
"}" string
:string_hex2 Escape
* string noeat
"0-9a-fA-F" string
:string_octal2 Escape
* string noeat
"0-7" string_octal3
:string_octal3 Escape
* string noeat
"0-7" string
# Only \\ and \' allowed in single quoted strings
:char String string
* char
"\n" reset
"'" after_term
"\\" char_escape recolor=-1
:char_escape Escape
* char recolor=-2
"\\'" char
:backtick String string
* backtick
"`" after_term
"\\" backtick_escape recolor=-1
"$@" backtick_subst recolor=-1
:backtick_subst Escape
* backtick noeat recolor=-1
"\c" backtick_subst
:backtick_escape Escape
* backtick
"x" backtick_hex1
"c" backtick_ctrl
"N" backtick_named
"0-7" backtick_octal2
"\n" backtick recolor=-2
:backtick_named Escape
* backtick
"{" backtick_named_rest
:backtick_named_rest Escape
* backtick_named_rest
"}" backtick
:backtick_ctrl Escape
* backtick
:backtick_hex1 Escape
* backtick noeat
"{" backtick_unicode
"0-9a-fA-F" backtick_hex2
:backtick_unicode Escape
* backtick_unicode
"}" backtick
:backtick_hex2 Escape
* backtick noeat
"0-9a-fA-F" backtick
:backtick_octal2 Escape
* backtick noeat
"0-7" backtick_octal3
:backtick_octal3 Escape
* backtick noeat
"0-7" backtick
:ident_no_kw Idle
* after_term noeat
"0" first_digit recolor=-2
"1-9" decimal recolor=-2
"\i" ident_no_kw1
:ident_no_kw1 Idle
* after_term noeat
"\c?!" ident_no_kw1
:ident Idle
* after_term noeat strings
"BEGIN" kw
"END" kw
"alias" kw_after
"and" oper
"begin" kw
"break" loop
"case" label
"catch" stmt
"class" kw_class
"def" kw_def
"defined" kw
"do" loop
"else" cond
"elsif" cond
"end" kw
"ensure" kw
"fail" kw
"false" bool
"for" loop
"if" cond
"in" oper
"lambda" kw
"module" kw_class
"next" kw
"nil" const
"not" oper
"or" oper
"private" storage
"proc" kw
"protected" storage
"public" storage
"raise" stmt
"redo" kw
"rescue" kw
"retry" stmt
"return" stmt
"self" kw_after
"super" kw
"then" cond
"throw" stmt
"true" bool
"undef" stmt
"unless" cond
"until" loop
"when" loop
"while" loop
"yield" stmt
# quasi-keywords (Module or Kernel methods)
"require" kw
"autoload" kw
"extend" kw
"include" kw
"puts" kw
"exit" kw
"attr_accessor" kw
"attr_reader" kw
"attr_writer" kw
"module_function" kw
done
# allowing ?! is not nearly correct but fixes more than
# it destructs
"\c?!" ident
:bool Boolean
* rest noeat
:loop Loop
* rest noeat
:cond Conditional
* rest noeat
:oper Operator
* rest noeat
:kw Keyword
* rest noeat
:label Label
* rest noeat
:const Constant
* rest noeat
:storage StorageClass
* rest noeat
:struct Structure
* rest noeat
:const Constant
* rest noeat
:stmt Statement
* rest noeat
# Handle case of def /
:kw_after Keyword
* after_term noeat
:kw_def Structure
* after_term noeat
" \t\n" kw_def_space
:kw_def_space Idle
* rest noeat
"\i" kw_func_decl noeat
" \t\n" kw_def_space
:kw_func_decl DefinedFunction
* rest noeat
"\c!?" kw_func_decl
:kw_class Structure
* rest noeat
" \t\n" kw_class_space
:kw_class_space Idle
* rest noeat
# first char should be uppercase letter
"\i" kw_class_decl noeat
" \t\n" kw_class_space
:kw_class_decl DefinedType
* rest noeat
"\c!?" kw_class_decl
:pstring Idle
* match noeat
" \t" after_term noeat
"xrsqQwW" match
.ifdef erb
">" NULL recolor=-2 return
.endif
:match Idle
* inmatch save_c recolor=-1
" \t" match
:inmatch Regex string
* inmatch
& after_term
% inmatch call=.inmatch_recur()
"#" inmatch_maybe_subst
"\\" inmatch_quote recolor=-1
:inmatch_maybe_subst Regex string
* inmatch noeat
"{" inmatch_subst recolor=-2 call=.ruby(squiggly)
:inmatch_subst Idle
* inmatch noeat
:inmatch_quote RegexEscape string
* inmatch
:subst Idle
* insubst save_c recolor=-1
"<([{`" delim_insubst save_c recolor=-1
" \t" subst
:insubst Regex string
* insubst
& inrepl
"\\" insubst_quote recolor=-1
:insubst_quote RegexEscape string
* insubst
:inrepl Regex string
* inrepl
& after_term
"\\" inrepl_quote
:inrepl_quote RegexEscape string
* inrepl
:delim_insubst Regex string
* delim_insubst
& delim_repl
"\\" delim_quote
:delim_quote RegexEscape string
* delim_insubst
:delim_repl Regex string
* repl save_c recolor=-1
" \t" delim_repl
:repl Regex string
* repl
& after_term
"\\" repl_quote
:repl_quote RegexEscape string
* repl
:maybe_symbol Idle
* rest noeat
# prevent wrong Module::Member detection
":" rest
# first char mustn't be 0-9
"\i" symbol recolor=-2
"\"" symbol_str recolor=-2
"'" symbol_str_sq recolor=-2
"/" rest
:symbol Symbol
* rest noeat
"\c?!" symbol
:symbol_str Symbol
* symbol_str
"\"" after_term
"#" symbol_maybe_str_subst recolor=-1
:symbol_maybe_str_subst Symbol
* symbol_str
"{" symbol_str_subst recolor=-2 call=.ruby(squiggly)
:symbol_str_subst Idle
* symbol_str noeat
:symbol_str_sq Symbol
* symbol_str_sq
"'" after_term
:proc_arg ProcArg
* rest noeat
"," proc_arg_sep noeat
"\i" proc_arg
:proc_arg_sep Idle
* proc_arg
:class_member1 Idle
* rest noeat
"\i" class_member recolor=-2
"@" class_member2
:class_member2 ClassMember
* rest noeat
"\i" class_member recolor=-3
:class_member ClassMember
* after_term noeat
"\c" class_member
:global_var GlobalVar
* after_term noeat
"\c" global_var
.end
.subr inmatch_recur
:inmatch Constant
* inmatch
& after_term return
% inmatch call=.inmatch_recur()
"#" inmatch_maybe_subst
"\\" inmatch_quote recolor=-1
:inmatch_maybe_subst Constant
* inmatch noeat
"{" inmatch_subst recolor=-2 call=.ruby(squiggly)
:inmatch_subst Idle
* inmatch noeat
:inmatch_quote Escape
* inmatch
.end