" Vim syntax file
" Language:	CHILL
" Maintainer:	YoungSang Yoon <image@lgic.co.kr>
" Last change:	2004 Jan 21
"

" first created by image@lgic.co.kr & modified by paris@lgic.co.kr

" CHILL (CCITT High Level Programming Language) is used for
" developing software of ATM switch at LGIC (LG Information
" & Communications LTd.)


" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
if version < 600
  syntax clear
elseif exists("b:current_syntax")
  finish
endif

" A bunch of useful CHILL keywords
syn keyword	chillStatement	goto GOTO return RETURN returns RETURNS
syn keyword	chillLabel		CASE case ESAC esac
syn keyword	chillConditional	if IF else ELSE elsif ELSIF switch SWITCH THEN then FI fi
syn keyword	chillLogical	NOT not
syn keyword	chillRepeat	while WHILE for FOR do DO od OD TO to
syn keyword	chillProcess	START start STACKSIZE stacksize PRIORITY priority THIS this STOP stop
syn keyword	chillBlock		PROC proc PROCESS process
syn keyword	chillSignal	RECEIVE receive SEND send NONPERSISTENT nonpersistent PERSISTENT persistent SET set EVER ever

syn keyword	chillTodo		contained TODO FIXME XXX

" String and Character constants
" Highlight special characters (those which have a backslash) differently
syn match	chillSpecial	contained "\\x\x\+\|\\\o\{1,3\}\|\\.\|\\$"
syn region	chillString	start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=chillSpecial
syn match	chillCharacter	"'[^\\]'"
syn match	chillSpecialCharacter "'\\.'"
syn match	chillSpecialCharacter "'\\\o\{1,3\}'"

"when wanted, highlight trailing white space
if exists("chill_space_errors")
  syn match	chillSpaceError	"\s*$"
  syn match	chillSpaceError	" \+\t"me=e-1
endif

"catch errors caused by wrong parenthesis
syn cluster	chillParenGroup	contains=chillParenError,chillIncluded,chillSpecial,chillTodo,chillUserCont,chillUserLabel,chillBitField
syn region	chillParen		transparent start='(' end=')' contains=ALLBUT,@chillParenGroup
syn match	chillParenError	")"
syn match	chillInParen	contained "[{}]"

"integer number, or floating point number without a dot and with "f".
syn case ignore
syn match	chillNumber		"\<\d\+\(u\=l\=\|lu\|f\)\>"
"floating point number, with dot, optional exponent
syn match	chillFloat		"\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
"floating point number, starting with a dot, optional exponent
syn match	chillFloat		"\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
"floating point number, without dot, with exponent
syn match	chillFloat		"\<\d\+e[-+]\=\d\+[fl]\=\>"
"hex number
syn match	chillNumber		"\<0x\x\+\(u\=l\=\|lu\)\>"
"syn match chillIdentifier	"\<[a-z_][a-z0-9_]*\>"
syn case match
" flag an octal number with wrong digits
syn match	chillOctalError	"\<0\o*[89]"

if exists("chill_comment_strings")
  " A comment can contain chillString, chillCharacter and chillNumber.
  " But a "*/" inside a chillString in a chillComment DOES end the comment!  So we
  " need to use a special type of chillString: chillCommentString, which also ends on
  " "*/", and sees a "*" at the start of the line as comment again.
  " Unfortunately this doesn't very well work for // type of comments :-(
  syntax match	chillCommentSkip	contained "^\s*\*\($\|\s\+\)"
  syntax region chillCommentString	contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=chillSpecial,chillCommentSkip
  syntax region chillComment2String	contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=chillSpecial
  syntax region chillComment	start="/\*" end="\*/" contains=chillTodo,chillCommentString,chillCharacter,chillNumber,chillFloat,chillSpaceError
  syntax match  chillComment	"//.*" contains=chillTodo,chillComment2String,chillCharacter,chillNumber,chillSpaceError
else
  syn region	chillComment	start="/\*" end="\*/" contains=chillTodo,chillSpaceError
  syn match	chillComment	"//.*" contains=chillTodo,chillSpaceError
endif
syntax match	chillCommentError	"\*/"

syn keyword	chillOperator	SIZE size
syn keyword	chillType		dcl DCL int INT char CHAR bool BOOL REF ref LOC loc INSTANCE instance
syn keyword	chillStructure	struct STRUCT enum ENUM newmode NEWMODE synmode SYNMODE
"syn keyword	chillStorageClass
syn keyword	chillBlock		PROC proc END end
syn keyword	chillScope		GRANT grant SEIZE seize
syn keyword	chillEDML		select SELECT delete DELETE update UPDATE in IN seq SEQ WHERE where INSERT insert include INCLUDE exclude EXCLUDE
syn keyword	chillBoolConst	true TRUE false FALSE

syn region	chillPreCondit	start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=chillComment,chillString,chillCharacter,chillNumber,chillCommentError,chillSpaceError
syn region	chillIncluded	contained start=+"+ skip=+\\\\\|\\"+ end=+"+
syn match	chillIncluded	contained "<[^>]*>"
syn match	chillInclude	"^\s*#\s*include\>\s*["<]" contains=chillIncluded
"syn match chillLineSkip	"\\$"
syn cluster	chillPreProcGroup	contains=chillPreCondit,chillIncluded,chillInclude,chillDefine,chillInParen,chillUserLabel
syn region	chillDefine		start="^\s*#\s*\(define\>\|undef\>\)" skip="\\$" end="$" contains=ALLBUT,@chillPreProcGroup
syn region	chillPreProc	start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" contains=ALLBUT,@chillPreProcGroup

" Highlight User Labels
syn cluster	chillMultiGroup	contains=chillIncluded,chillSpecial,chillTodo,chillUserCont,chillUserLabel,chillBitField
syn region	chillMulti		transparent start='?' end=':' contains=ALLBUT,@chillMultiGroup
" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
syn match	chillUserCont	"^\s*\I\i*\s*:$" contains=chillUserLabel
syn match	chillUserCont	";\s*\I\i*\s*:$" contains=chillUserLabel
syn match	chillUserCont	"^\s*\I\i*\s*:[^:]"me=e-1 contains=chillUserLabel
syn match	chillUserCont	";\s*\I\i*\s*:[^:]"me=e-1 contains=chillUserLabel

syn match	chillUserLabel	"\I\i*" contained

" Avoid recognizing most bitfields as labels
syn match	chillBitField	"^\s*\I\i*\s*:\s*[1-9]"me=e-1
syn match	chillBitField	";\s*\I\i*\s*:\s*[1-9]"me=e-1

syn match	chillBracket	contained "[<>]"
if !exists("chill_minlines")
  let chill_minlines = 15
endif
exec "syn sync ccomment chillComment minlines=" . chill_minlines

" Define the default highlighting.
" For version 5.7 and earlier: only when not done already
" For version 5.8 and later: only when an item doesn't have highlighting yet
if version >= 508 || !exists("did_ch_syntax_inits")
  if version < 508
    let did_ch_syntax_inits = 1
    command -nargs=+ HiLink hi link <args>
  else
    command -nargs=+ HiLink hi def link <args>
  endif

  HiLink chillLabel	Label
  HiLink chillUserLabel	Label
  HiLink chillConditional	Conditional
  " hi chillConditional	term=bold ctermfg=red guifg=red gui=bold

  HiLink chillRepeat	Repeat
  HiLink chillProcess	Repeat
  HiLink chillSignal	Repeat
  HiLink chillCharacter	Character
  HiLink chillSpecialCharacter chillSpecial
  HiLink chillNumber	Number
  HiLink chillFloat	Float
  HiLink chillOctalError	chillError
  HiLink chillParenError	chillError
  HiLink chillInParen	chillError
  HiLink chillCommentError	chillError
  HiLink chillSpaceError	chillError
  HiLink chillOperator	Operator
  HiLink chillStructure	Structure
  HiLink chillBlock	Operator
  HiLink chillScope	Operator
  "hi chillEDML     term=underline ctermfg=DarkRed guifg=Red
  HiLink chillEDML	PreProc
  "hi chillBoolConst	term=bold ctermfg=brown guifg=brown
  HiLink chillBoolConst	Constant
  "hi chillLogical	term=bold ctermfg=brown guifg=brown
  HiLink chillLogical	Constant
  HiLink chillStorageClass	StorageClass
  HiLink chillInclude	Include
  HiLink chillPreProc	PreProc
  HiLink chillDefine	Macro
  HiLink chillIncluded	chillString
  HiLink chillError	Error
  HiLink chillStatement	Statement
  HiLink chillPreCondit	PreCondit
  HiLink chillType	Type
  HiLink chillCommentError	chillError
  HiLink chillCommentString chillString
  HiLink chillComment2String chillString
  HiLink chillCommentSkip	chillComment
  HiLink chillString	String
  HiLink chillComment	Comment
  " hi chillComment	term=None ctermfg=lightblue guifg=lightblue
  HiLink chillSpecial	SpecialChar
  HiLink chillTodo	Todo
  HiLink chillBlock	Statement
  "HiLink chillIdentifier	Identifier
  HiLink chillBracket	Delimiter

  delcommand HiLink
endif

let b:current_syntax = "chill"

" vim: ts=8
