Edit file File name : 4gl.jsf Content :# JOE syntax highlight file for Progress 4GL # by Gediminas http://proc.w3.lt # Version 1.04 =Idle =Comment =Constant =String +Constant =Number +Constant =Type =Ident # conditional operators, blocks =Keyword =Conditional +Keyword =Operator +Keyword # preprocessor include, definition, reference =Preproc =Include +Preproc =PreRef +Ident :idle Idle * idle "/" slash "{" brace "&" prep buffer "a-zA-Z" ident buffer "'" string recolor=-1 "\"" string2 recolor=-1 "0-9" number recolor=-1 "?" question recolor=-1 # Comments - 2 levels of nesting allowed :slash Idle * idle noeat "*" comment recolor=-2 :comment Comment comment * comment "/" slash2 "*" maybe_end_comment "BFHNTX" comment noeat call=comment_todo.comment_todo() :maybe_end_comment Comment comment * comment "/" idle "*" maybe_end_comment :slash2 Idle * comment noeat "*" comment2 recolor=-2 :comment2 Comment comment * comment2 "*" maybe_end_comment2 "BFHNTX" comment2 noeat call=comment_todo.comment_todo() :maybe_end_comment2 Comment comment * comment2 "/" comment "*" maybe_end_comment2 # Preprocessor # Allow preprocessor name reference inside include file reference: # {include/trace {&FILE-NAME} {&LINE-NUMBER}} :brace Include * include noeat "&" scoped recolor=-2 "}" idle :include Include * include recolor=-2 "{" brace2 "}" idle :brace2 Include * include2 noeat "}" idle :include2 Include * include2 recolor=-2 "}" include :scoped PreRef * scoped "}" idle :prep Preproc * idle noeat istrings "&IF" predir "&THEN" predir "&ELSEIF" predir "&ELSE" predir "&ENDIF" predir "&SCOPED-DEFINE" predir "&SCOP" predir "&GLOBAL-DEFINE" predir "&GLOB" predir "&MESSAGE" predir "&UNDEFINE" predir "&UNDEF" predir done "-a-zA-Z0-9_" prep :predir Preproc * idle noeat # String constants, copied from pascal.jsf with " added :string String string * string "\n" idle "'" maybe_end_string :maybe_end_string String string * idle recolor=-1 noeat "'" string :string2 String string * string2 "\n" idle "\"" maybe_end_string2 :maybe_end_string2 String string * idle recolor=-1 noeat "\"" string2 # Numeric constant, same as pascal.jsf :number Number * idle noeat "0-9" number "eE" epart "." dot :dot Number * idle noeat "0-9" float :float Number * idle noeat "eE" epart "0-9" float :epart Number * idle noeat "0-9+\-" enum :enum Number * idle noeat "0-9" enum :question Constant * idle noeat # Keywords # Available jumps: cond type oper kw # TODO: This needs to be vastly expanded, it seems like every other # token in this language is a keyword. :ident Ident * idle noeat istrings "assign" cond "case" cond "cha" type "char" type "character" type "create" reserved "dat" type "date" type "dec" type "decimal" type "defined" oper "delete" reserved "do" reserved "else" cond "end" cond "find" reserved "for" reserved "function" cond "get" reserved "handle" type "if" cond "int" type "integer" type "leave" cond "log" type "logical" type "memptr" type "next" cond "otherwise" cond "param" cond "parameter" cond "procedure" cond "raw" type "rec" type "repeat" cond "reposition" reserved "return" cond "rowid" type "run" cond "then" cond "when" cond "widget-handle" type done "-a-zA-Z0-9_" ident :cond Conditional * idle noeat :type Type * idle noeat :oper Operator * idle noeat :reserved Keyword * idle noeat Save