--- a
+++ b/syntax/4gl.jsf
@@ -0,0 +1,219 @@
+# 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
×
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.