1" Vim syntax file
2" Language:	PCCTS
3" Maintainer:	Scott Bigham <dsb@killerbunnies.org>
4" Last Change:	10 Aug 1999
5
6" For version 5.x: Clear all syntax items
7" For version 6.x: Quit when a syntax file was already loaded
8if version < 600
9  syntax clear
10elseif exists("b:current_syntax")
11  finish
12endif
13
14" Read the C++ syntax to start with
15if version < 600
16  syn include @cppTopLevel <sfile>:p:h/cpp.vim
17else
18  syn include @cppTopLevel syntax/cpp.vim
19endif
20
21syn region pcctsAction matchgroup=pcctsDelim start="<<" end=">>?\=" contains=@cppTopLevel,pcctsRuleRef
22
23syn region pcctsArgBlock matchgroup=pcctsDelim start="\(>\s*\)\=\[" end="\]" contains=@cppTopLevel,pcctsRuleRef
24
25syn region pcctsString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=pcctsSpecialChar
26syn match  pcctsSpecialChar "\\\\\|\\\"" contained
27
28syn region pcctsComment start="/\*" end="\*/" contains=cTodo
29syn match  pcctsComment "//.*$" contains=cTodo
30
31syn region pcctsDirective start="^\s*#header\s\+<<" end=">>" contains=pcctsAction keepend
32syn match  pcctsDirective "^\s*#parser\>.*$" contains=pcctsString,pcctsComment
33syn match  pcctsDirective "^\s*#tokdefs\>.*$" contains=pcctsString,pcctsComment
34syn match  pcctsDirective "^\s*#token\>.*$" contains=pcctsString,pcctsAction,pcctsTokenName,pcctsComment
35syn region pcctsDirective start="^\s*#tokclass\s\+[A-Z]\i*\s\+{" end="}" contains=pcctsString,pcctsTokenName
36syn match  pcctsDirective "^\s*#lexclass\>.*$" contains=pcctsTokenName
37syn region pcctsDirective start="^\s*#errclass\s\+[^{]\+\s\+{" end="}" contains=pcctsString,pcctsTokenName
38syn match pcctsDirective "^\s*#pred\>.*$" contains=pcctsTokenName,pcctsAction
39
40syn cluster pcctsInRule contains=pcctsString,pcctsRuleName,pcctsTokenName,pcctsAction,pcctsArgBlock,pcctsSubRule,pcctsLabel,pcctsComment
41
42syn region pcctsRule start="\<[a-z][A-Za-z0-9_]*\>\(\s*\[[^]]*\]\)\=\(\s*>\s*\[[^]]*\]\)\=\s*:" end=";" contains=@pcctsInRule
43
44syn region pcctsSubRule matchgroup=pcctsDelim start="(" end=")\(+\|\*\|?\(\s*=>\)\=\)\=" contains=@pcctsInRule contained
45syn region pcctsSubRule matchgroup=pcctsDelim start="{" end="}" contains=@pcctsInRule contained
46
47syn match pcctsRuleName  "\<[a-z]\i*\>" contained
48syn match pcctsTokenName "\<[A-Z]\i*\>" contained
49
50syn match pcctsLabel "\<\I\i*:\I\i*" contained contains=pcctsLabelHack,pcctsRuleName,pcctsTokenName
51syn match pcctsLabel "\<\I\i*:\"\([^\\]\|\\.\)*\"" contained contains=pcctsLabelHack,pcctsString
52syn match pcctsLabelHack "\<\I\i*:" contained
53
54syn match pcctsRuleRef "\$\I\i*\>" contained
55syn match pcctsRuleRef "\$\d\+\(\.\d\+\)\>" contained
56
57syn keyword pcctsClass     class   nextgroup=pcctsClassName skipwhite
58syn match   pcctsClassName "\<\I\i*\>" contained nextgroup=pcctsClassBlock skipwhite skipnl
59syn region pcctsClassBlock start="{" end="}" contained contains=pcctsRule,pcctsComment,pcctsDirective,pcctsAction,pcctsException,pcctsExceptionHandler
60
61syn keyword pcctsException exception nextgroup=pcctsExceptionRuleRef skipwhite
62syn match pcctsExceptionRuleRef "\[\I\i*\]" contained contains=pcctsExceptionID
63syn match pcctsExceptionID "\I\i*" contained
64syn keyword pcctsExceptionHandler	catch default
65syn keyword pcctsExceptionHandler	NoViableAlt NoSemViableAlt
66syn keyword pcctsExceptionHandler	MismatchedToken
67
68syn sync clear
69syn sync match pcctsSyncAction grouphere pcctsAction "<<"
70syn sync match pcctsSyncAction "<<\([^>]\|>[^>]\)*>>"
71syn sync match pcctsSyncRule grouphere pcctsRule "\<[a-z][A-Za-z0-9_]*\>\s*\[[^]]*\]\s*:"
72syn sync match pcctsSyncRule grouphere pcctsRule "\<[a-z][A-Za-z0-9_]*\>\(\s*\[[^]]*\]\)\=\s*>\s*\[[^]]*\]\s*:"
73
74" Define the default highlighting.
75" For version 5.7 and earlier: only when not done already
76" For version 5.8 and later: only when an item doesn't have highlighting yet
77if version >= 508 || !exists("did_pccts_syntax_inits")
78  if version < 508
79    let did_pccts_syntax_inits = 1
80    command -nargs=+ HiLink hi link <args>
81  else
82    command -nargs=+ HiLink hi def link <args>
83  endif
84
85  HiLink pcctsDelim		Special
86  HiLink pcctsTokenName		Identifier
87  HiLink pcctsRuleName		Statement
88  HiLink pcctsLabelHack		Label
89  HiLink pcctsDirective		PreProc
90  HiLink pcctsString		String
91  HiLink pcctsComment		Comment
92  HiLink pcctsClass		Statement
93  HiLink pcctsClassName		Identifier
94  HiLink pcctsException		Statement
95  HiLink pcctsExceptionHandler	Keyword
96  HiLink pcctsExceptionRuleRef	pcctsDelim
97  HiLink pcctsExceptionID	Identifier
98  HiLink pcctsRuleRef		Identifier
99  HiLink pcctsSpecialChar	SpecialChar
100
101  delcommand HiLink
102endif
103
104let b:current_syntax = "pccts"
105
106" vim: ts=8
107