<?xml version="1.0" encoding="utf-8"?>
<!--

Actipro Syntax Language Definition (.langdef)
  For use with Actipro SyntaxEditor and related products.
  http://www.actiprosoftware.com

'C' language created by Actipro Software LLC.
  Copyright (c) 2001-2014 Actipro Software LLC.  All rights reserved.

-->
<LanguageDefinition LanguageKey="C" LanguageDescription="C" Creator="Actipro Software LLC" Copyright="Copyright (c) 2001-2014 Actipro Software LLC.  All rights reserved." xmlns="http://schemas.actiprosoftware.com/langdef/1.0">
	<!-- Classification types -->
	<LanguageDefinition.ClassificationTypes>
		<ClassificationType Key="Keyword" DefaultStyle="#FF0000FF" />
		<ClassificationType Key="Identifier" />
		<ClassificationType Key="Operator" />
		<ClassificationType Key="Number" />
		<ClassificationType Key="String" DefaultStyle="#FF800000" />
		<ClassificationType Key="PathSpec" DefaultStyle="#FF800000" />
		<ClassificationType Key="Comment" DefaultStyle="#FF008000" />
		<ClassificationType Key="PreprocessorKeyword" Description="Preprocessor Keyword" DefaultStyle="#FF0000FF" />
	</LanguageDefinition.ClassificationTypes>
	<!-- Lexer -->
	<LanguageDefinition.Lexer>
		<DynamicLexer>
			<!-- Default state -->
			<State Key="Default" DefaultCaseSensitivity="Sensitive">
				<State.ChildStates>
					<StateRef Key="Character" />
					<StateRef Key="String" />
					<StateRef Key="MultiLineComment" />
					<StateRef Key="Comment" />
					<StateRef Key="PreprocessorDirective" />
					<StateRef Key="IncludeDirective" />
					<StateRef Key="PragmaDirective" />
				</State.ChildStates>
				<RegexPatternGroup TokenKey="Whitespace" Pattern="{Whitespace}+" />
				<RegexPatternGroup TokenKey="LineTerminator" Pattern="{LineTerminator}" />
				<ExplicitPatternGroup Key="OpenParenthesisPatternGroup" TokenKey="OpenParenthesis" Pattern="(" />
				<ExplicitPatternGroup Key="CloseParenthesisPatternGroup" TokenKey="CloseParenthesis" Pattern=")" />
				<ExplicitPatternGroup Key="OpenCurlyBracePatternGroup" TokenKey="OpenCurlyBrace" Pattern="{" />
				<ExplicitPatternGroup Key="CloseCurlyBracePatternGroup" TokenKey="CloseCurlyBrace" Pattern="}" />
				<ExplicitPatternGroup Key="OpenSquareBracePatternGroup" TokenKey="OpenSquareBrace" Pattern="[" />
				<ExplicitPatternGroup Key="CloseSquareBracePatternGroup" TokenKey="CloseSquareBrace" Pattern="]" />
				<ExplicitPatternGroup TokenKey="Punctuation">
					<ExplicitPatterns><![CDATA[
						. , : ;
					]]></ExplicitPatterns>
				</ExplicitPatternGroup>
				<ExplicitPatternGroup TokenKey="Null" ClassificationTypeKey="Keyword" Pattern="null" LookAheadPattern="{NonWord}|\z" />
				<ExplicitPatternGroup TokenKey="NativeType" ClassificationTypeKey="Keyword" LookAheadPattern="{NonWord}|\z">
					<ExplicitPatterns><![CDATA[
						char short int long __int64 float double void
					]]></ExplicitPatterns>
				</ExplicitPatternGroup>
				<ExplicitPatternGroup TokenKey="Boolean" ClassificationTypeKey="Keyword" LookAheadPattern="{NonWord}|\z">
					<ExplicitPatterns><![CDATA[
						false true
					]]></ExplicitPatterns>
				</ExplicitPatternGroup>
				<ExplicitPatternGroup TokenKey="ReservedWord" ClassificationTypeKey="Keyword" LookAheadPattern="{NonWord}|\z">
					<ExplicitPatterns><![CDATA[
						_cs _ds _es asm auto break case cdecl char const continue default do double else enum extern far float
						for fortran goto huge if int interrupt long near pascal register return short signed sizeof ss static
						struct switch typedef union unsigned void volatile while
					]]></ExplicitPatterns>
				</ExplicitPatternGroup>
				<RegexPatternGroup TokenKey="Identifier" ClassificationTypeKey="Identifier" Pattern="(_ | {Alpha})({Word})*" />
				<ExplicitPatternGroup TokenKey="Operator" ClassificationTypeKey="Operator">
					<ExplicitPatterns><![CDATA[
						!= == = ! ++ -- += -= *= /= %= -> + - * / % && || &= |= ^= & | ~ ^ <<= >>= << >> <= < >= > ?
					]]></ExplicitPatterns>
				</ExplicitPatternGroup>
				<RegexPatternGroup TokenKey="RealNumber" ClassificationTypeKey="Number" LookAheadPattern="{NonWord}|\z">
					<RegexPattern Value="{Digit}* \. {Digit}+ ([Ee] [\+\-]? {Digit}+)? [FfDdMm]?" />
					<RegexPattern Value="{Digit}+ [Ee] [\+\-]? {Digit}+ [FfDdMm]" />
				</RegexPatternGroup>
				<RegexPatternGroup TokenKey="IntegerNumber" ClassificationTypeKey="Number" Pattern="{Digit}+ (([Uu]? [Ll]?) | ([Ll]? [Uu]?))" LookAheadPattern="{NonWord}|\z" />
				<RegexPatternGroup TokenKey="HexIntegerNumber" ClassificationTypeKey="Number" Pattern="0 [xX] {HexDigit}+ (([Uu]? [Ll]?) | ([Ll]? [Uu]?))" LookAheadPattern="{NonWord}|\z" />
			</State>
			<!-- Character state -->
			<State Key="Character" DefaultTokenKey="CharacterText" DefaultClassificationTypeKey="String">
				<State.Scopes>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="CharacterStartDelimiter" Pattern="'" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="CharacterEndDelimiter" Pattern="['\n]" />
						</Scope.EndPatternGroup>
					</Scope>
				</State.Scopes>
				<RegexPatternGroup TokenKey="CharacterEscapedCharacter" Pattern="\\x {HexDigit}{1,4}" />
				<RegexPatternGroup TokenKey="CharacterEscapedCharacter" Pattern="\\u {HexDigit}{4,4}" />
				<RegexPatternGroup TokenKey="CharacterEscapedCharacter" Pattern="\\U {HexDigit}{8,8}" />
				<RegexPatternGroup TokenKey="CharacterEscapedCharacter" Pattern="\\." />
				<RegexPatternGroup TokenKey="CharacterText" Pattern="[^'\\\n]+" />
			</State>
			<!-- String state -->
			<State Key="String" DefaultTokenKey="StringText" DefaultClassificationTypeKey="String">
				<State.Scopes>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="StringStartDelimiter" Pattern="&quot;" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="StringEndDelimiter" Pattern="[\&quot;\n]" />
						</Scope.EndPatternGroup>
					</Scope>
				</State.Scopes>
				<RegexPatternGroup TokenKey="StringEscapedCharacter" Pattern="\\x {HexDigit}{1,4}" />
				<RegexPatternGroup TokenKey="StringEscapedCharacter" Pattern="\\u {HexDigit}{4,4}" />
				<RegexPatternGroup TokenKey="StringEscapedCharacter" Pattern="\\U {HexDigit}{8,8}" />
				<RegexPatternGroup TokenKey="StringEscapedCharacter" Pattern="\\." />
				<RegexPatternGroup TokenKey="StringText" Pattern="[^\&quot;\\\n]+" />
			</State>
			<!-- Comment state -->
			<State Key="Comment" DefaultTokenKey="CommentText" DefaultClassificationTypeKey="Comment">
				<State.Scopes>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="CommentStartDelimiter" Pattern="//" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="CommentEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
				</State.Scopes>
				<RegexPatternGroup TokenKey="CommentLineTerminator" Pattern="{LineTerminator} {Whitespace}* //" LookAheadPattern="[^/]" />
				<RegexPatternGroup TokenKey="CommentText" Pattern="[^\n]+" />
			</State>
			<!-- MultiLineComment state -->
			<State Key="MultiLineComment" DefaultTokenKey="MultiLineCommentText" DefaultClassificationTypeKey="Comment">
				<State.Scopes>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="MultiLineCommentStartDelimiter" Pattern="/*" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<ExplicitPatternGroup TokenKey="MultiLineCommentEndDelimiter" Pattern="*/" />
						</Scope.EndPatternGroup>
					</Scope>
				</State.Scopes>
				<RegexPatternGroup TokenKey="MultiLineCommentLineTerminator" Pattern="{LineTerminator}" />
				<RegexPatternGroup TokenKey="MultiLineCommentText" Pattern="[^*\n]+" />
			</State>
			<!-- PreprocessorDirective state -->
			<State Key="PreprocessorDirective" DefaultTokenKey="PreprocessorDirectiveText" DefaultCaseSensitivity="Sensitive">
				<State.Scopes>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="DefinePreprocessorDirective" ClassificationTypeKey="PreprocessorKeyword" Pattern="#define" LookAheadPattern="{NonWord}|\z" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PreprocessorDirectiveEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="UndefPreprocessorDirective" ClassificationTypeKey="PreprocessorKeyword" Pattern="#undef" LookAheadPattern="{NonWord}|\z" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PreprocessorDirectiveEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="IfPreprocessorDirectiveIf" ClassificationTypeKey="PreprocessorKeyword" Pattern="#if" LookAheadPattern="{NonWord}|\z" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PreprocessorDirectiveEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="IfPreprocessorDirectiveElIf" ClassificationTypeKey="PreprocessorKeyword" Pattern="#elif" LookAheadPattern="{NonWord}|\z" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PreprocessorDirectiveEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="IfPreprocessorDirectiveElse" ClassificationTypeKey="PreprocessorKeyword" Pattern="#else" LookAheadPattern="{NonWord}|\z" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PreprocessorDirectiveEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="IfPreprocessorDirectiveIfDef" ClassificationTypeKey="PreprocessorKeyword" Pattern="#ifdef" LookAheadPattern="{NonWord}|\z" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PreprocessorDirectiveEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="IfPreprocessorDirectiveIfNDef" ClassificationTypeKey="PreprocessorKeyword" Pattern="#ifndef" LookAheadPattern="{NonWord}|z" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PreprocessorDirectiveEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="IfPreprocessorDirectiveEndIf" ClassificationTypeKey="PreprocessorKeyword" Pattern="#endif" LookAheadPattern="{NonWord}|\z" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PreprocessorDirectiveEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="LinePreprocessorDirective" ClassificationTypeKey="PreprocessorKeyword" Pattern="#line" LookAheadPattern="{NonWord}|\z" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PreprocessorDirectiveEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="UsingPreprocessorDirective" ClassificationTypeKey="PreprocessorKeyword" Pattern="#using" LookAheadPattern="{NonWord}|\z" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PreprocessorDirectiveEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="ErrorPreprocessorDirective" ClassificationTypeKey="PreprocessorKeyword" Pattern="#error" LookAheadPattern="{NonWord}|\z" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PreprocessorDirectiveEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
				</State.Scopes>
				<State.ChildStates>
					<StateRef Key="PreprocessorDirectiveComment" />
				</State.ChildStates>
			</State>
			<!-- PreprocessorDirectiveComment state -->
			<State Key="PreprocessorDirectiveComment" DefaultTokenKey="CommentText" DefaultClassificationTypeKey="Comment">
				<State.Scopes>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="PreprocessorDirectiveCommentStartDelimiter" Pattern="//" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<ExplicitPatternGroup Pattern="(Enter end pattern)" />
						</Scope.EndPatternGroup>
					</Scope>
				</State.Scopes>
				<RegexPatternGroup TokenKey="CommentDefault" Pattern="{NonLineTerminator}+" />
			</State>
			<!-- IncludeDirective state -->
			<State Key="IncludeDirective">
				<State.Scopes>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="IncludePreprocessorDirective" ClassificationTypeKey="PreprocessorKeyword" Pattern="#include" LookAheadPattern="{NonWord}|\z" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PreprocessorDirectiveEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
				</State.Scopes>
				<State.ChildStates>
					<StateRef Key="String" />
					<StateRef Key="PathSpec" />
					<StateRef Key="PreprocessorDirectiveComment" />
				</State.ChildStates>
			</State>
			<!-- PathSpec state -->
			<State Key="PathSpec" DefaultTokenKey="PathSpecText" DefaultClassificationTypeKey="PathSpec">
				<State.Scopes>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="PathSpecStartDelimiter" Pattern="&lt;" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PathSpecEndDelimiter" Pattern="[&gt;\n]" />
						</Scope.EndPatternGroup>
					</Scope>
				</State.Scopes>
				<ExplicitPatternGroup TokenKey="PathSpecText" Pattern="[^&gt;\\\n]+" />
			</State>
			<!-- PragmaDirective state -->
			<State Key="PragmaDirective">
				<State.Scopes>
					<Scope>
						<Scope.StartPatternGroup>
							<ExplicitPatternGroup TokenKey="PragmaPreprocessorDirective" ClassificationTypeKey="PreprocessorKeyword" Pattern="#pragma" LookAheadPattern="{NonWord}|\z" />
						</Scope.StartPatternGroup>
						<Scope.EndPatternGroup>
							<RegexPatternGroup TokenKey="PreprocessorDirectiveEndDelimiter" Pattern="{LineTerminator}" />
						</Scope.EndPatternGroup>
					</Scope>
				</State.Scopes>
				<State.ChildStates>
					<StateRef Key="PreprocessorDirectiveComment" />
				</State.ChildStates>
				<ExplicitPatternGroup TokenKey="PragmaKeyword" ClassificationTypeKey="PreprocessorKeyword" LookAheadPattern="{NonWord}|\z" DefaultCaseSensitivity="Sensitive">
					<ExplicitPatterns><![CDATA[
						alloc_text auto_inline bss_seg check_stack code_seg comment component conform1 const_seg data_seg
						deprecated detect_mismatch fenv_access float_control fp_contract function hdrstop include_alias
						init_seg1 inline_depth inline_recursion intrinsic make_public managed message omp once optimize
						pack pointers_to_members1 pop_macro push_macro region endregion runtime_checks section setlocale
						strict_gs_check unmanaged vtordisp1 warning
					]]></ExplicitPatterns>
				</ExplicitPatternGroup>
			</State>
		</DynamicLexer>
	</LanguageDefinition.Lexer>
	<!-- Example text -->
	<LanguageDefinition.ExampleText><![CDATA[#include <stdio.h> // This is a comment
#include "stdafx.h" // This is a comment

#pragma once
#pragma warning

#ifdef NULL
	#undef NULL
#endif
#ifndef NULL
	#define NULL 0 // This is a comment
#endif
#if 1
	#define NULL 0
#elif 1
	#define NULL 0
#else 
	#define NULL 0
#endif

typedef int check

struct StructName {
	int test;
	char* test;
};

/* This
	is
	a
	multiline
	comment.
	*/
int main(void) {
	printf("This is a string.\n");
	
	// This is a single line comment.
	return 0;
}
]]></LanguageDefinition.ExampleText>
</LanguageDefinition>