" Vim syntax file
" Language:	Simula
" Maintainer:	Haakon Riiser <haakon@riiser.net>
" Last Change:	2001 Apr 25

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

" No case sensitivity in Simula
syn case	ignore

syn match	simulaComment		"^%.*$" contains=simulaTodo
syn region	simulaComment		start="!\|\<comment\>" end=";" contains=simulaTodo

" Text between the keyword 'end' and either a semicolon or one of the
" keywords 'end', 'else', 'when' or 'otherwise' is also a comment
syn region	simulaComment		start="\<end\>"lc=3 matchgroup=Statement end=";\|\<\(end\|else\|when\|otherwise\)\>"

syn match	simulaCharError		"'.\{-2,}'"
syn match	simulaCharacter		"'.'"
syn match	simulaCharacter		"'!\d\{-}!'" contains=simulaSpecialChar
syn match	simulaString		'".\{-}"' contains=simulaSpecialChar,simulaTodo

syn keyword	simulaBoolean		true false
syn keyword	simulaCompound		begin end
syn keyword	simulaConditional	else if otherwise then until when
syn keyword	simulaConstant		none notext
syn keyword	simulaFunction		procedure
syn keyword	simulaOperator		eq eqv ge gt imp in is le lt ne new not qua
syn keyword	simulaRepeat		while for
syn keyword	simulaReserved		activate after at before delay go goto label prior reactivate switch to
syn keyword	simulaStatement		do inner inspect step this
syn keyword	simulaStorageClass	external hidden name protected value
syn keyword	simulaStructure		class
syn keyword	simulaType		array boolean character integer long real short text virtual
syn match	simulaAssigned		"\<\h\w*\s*\((.*)\)\=\s*:\(=\|-\)"me=e-2
syn match	simulaOperator		"[&:=<>+\-*/]"
syn match	simulaOperator		"\<and\(\s\+then\)\=\>"
syn match	simulaOperator		"\<or\(\s\+else\)\=\>"
syn match	simulaReferenceType	"\<ref\s*(.\{-})"
syn match	simulaSemicolon		";"
syn match	simulaSpecial		"[(),.]"
syn match	simulaSpecialCharErr	"!\d\{-4,}!" contained
syn match	simulaSpecialCharErr	"!!" contained
syn match	simulaSpecialChar	"!\d\{-}!" contains=simulaSpecialCharErr contained
syn match	simulaTodo		"xxx\+" contained

" Integer number (or float without `.')
syn match	simulaNumber		"-\=\<\d\+\>"
" Real with optional exponent
syn match	simulaReal		"-\=\<\d\+\(\.\d\+\)\=\(&&\=[+-]\=\d\+\)\=\>"
" Real starting with a `.', optional exponent
syn match	simulaReal		"-\=\.\d\+\(&&\=[+-]\=\d\+\)\=\>"

if version >= 508 || !exists("did_simula_syntax_inits")
    if version < 508
	let did_simula_syntax_inits = 1
	command -nargs=+ HiLink hi link <args>
    else
	command -nargs=+ HiLink hi def link <args>
    endif

    HiLink simulaAssigned		Identifier
    HiLink simulaBoolean		Boolean
    HiLink simulaCharacter		Character
    HiLink simulaCharError		Error
    HiLink simulaComment		Comment
    HiLink simulaCompound		Statement
    HiLink simulaConditional		Conditional
    HiLink simulaConstant		Constant
    HiLink simulaFunction		Function
    HiLink simulaNumber			Number
    HiLink simulaOperator		Operator
    HiLink simulaReal			Float
    HiLink simulaReferenceType		Type
    HiLink simulaRepeat			Repeat
    HiLink simulaReserved		Error
    HiLink simulaSemicolon		Statement
    HiLink simulaSpecial		Special
    HiLink simulaSpecialChar		SpecialChar
    HiLink simulaSpecialCharErr		Error
    HiLink simulaStatement		Statement
    HiLink simulaStorageClass		StorageClass
    HiLink simulaString			String
    HiLink simulaStructure		Structure
    HiLink simulaTodo			Todo
    HiLink simulaType			Type

    delcommand HiLink
endif

let b:current_syntax = "simula"
" vim: sts=4 sw=4 ts=8
