JP van Oosten

Flexc++ textmate language

18 Jun 2008

While working on our replacement for flex / flex++, I was getting lost in all the comments and regular expressions in our lexer-file. I needed syntax highlighting badly.

So, I opened up the bundle editor and wrote a language-file for flexc++. Because it’s basically the same syntax, it also works on lexers for flex.

If someone’s interested, drop me a line at jp@thisdomain, and I’ll send the bundle to you (to save you some cut’n’paste work :)

{	scopeName = 'source.flexc++';
	fileTypes = ( );
	foldingStartMarker = '/\*\*|[^%]\{\s*$';
	foldingStopMarker = '\*\*/|^\s*\}';
	patterns = (
		{	name = 'comment.block.flexc++';
			begin = '\s*/\*';
			end = '\*/\s*';
		},
		{	name = 'meta.codeblock.flexc++';
			begin = '%\{';
			end = '%\}';
			patterns = ( { include = 'source.c++'; } );
		},
		{	name = 'constant.other.namedefinition.flexc++';
			match = '^\s*[A-Z_0-9]+';
		},
		{	name = 'string.regexp.namedefinition.flexc++';
			match = '(?<=[A-Z_0-9])\s+.+$';
		},
		{	name = 'meta.rulessection.flexc++';
			begin = '^%%$';
			end = '%%';
			patterns = (
				{	name = 'meta.blankline.flexc++';
					match = '^$';
				},
				{	name = 'comment.block.rulessection.flexc++';
					begin = '\s*/\*';
					end = '\*/\s*';
				},
				{	name = 'entity.name.other.startconditionlist.flexc++';
					match = '^\s*<[a-zA-Z_,]+>';
				},
				{	name = 'string.regexp.flexc++';
					begin = '^\s*(?=[^\s\n])|(?<=>)(?=[^\s])';
					end = '(?=\s|\n)';
					patterns = (
						{	name = 'string.regexp.characterclass.flexc++';
							match = '\[.+\]';
						},
						{	name = 'string.regexp.escape.flexc++';
							match = '\\.';
						},
						{	name = 'string.regexp.string.flexc++';
							begin = '"';
							end = '"';
							patterns = (
								{	name = 'string.regexp.string.escapechar.flexc++';
									match = '\\.';
								},
							);
						},
						{	name = 'constant.other.name.flexc++';
							match = '\{[A-Z_0-9]*[A-Z_][A-Z_0-9]+\}';
						},
					);
				},
				{	name = 'meta.actionblock.flexc++';
					begin = '\{';
					end = '\}';
					patterns = (
						{	name = 'entity.name.function.builtin.flexc++';
							match = '\b(BEGIN)\b';
						},
						{	name = 'meta.actionblock.source.flexc++';
							include = 'source.c++';
						},
					);
				},
				{	name = 'entity.function.builtin.flexc++';
					match = '\b(BEGIN)\b';
				},
				{	name = 'meta.action.flexc++';
					contentName = 'source.c++';
					match = '(?<=[^\s\n])\s+.+$';
					include = 'source.c++';
				},
			);
		},
		{	name = 'entity.other.attribute-name.flexc++';
			match = '^%[^ ]+';
		},
	);
}