Index: tools/vscode/uwaterloo.cforall-0.1.0/syntaxes/cfa.tmLanguage.json
===================================================================
--- tools/vscode/uwaterloo.cforall-0.1.0/syntaxes/cfa.tmLanguage.json	(revision a768220035832b529ae9bece1cc40c750a135490)
+++ tools/vscode/uwaterloo.cforall-0.1.0/syntaxes/cfa.tmLanguage.json	(revision a768220035832b529ae9bece1cc40c750a135490)
@@ -0,0 +1,188 @@
+{
+	"scopeName": "source.cfa",
+	"patterns": [
+		{ "include": "#comments"},
+		{ "include": "#preprocessor"},
+		{ "include": "#extern"},
+		{ "include": "#test"}
+	],
+	"repository": {
+		"directive.punctuation": {
+			"match": "#",
+			"name": "punctuation.definition.directive.cfa"
+		},
+		"directive.pragma": {
+			"name": "meta.preprocessor.pragma.cfa",
+			"match": "^\\s*(#\\s*pragma)\\s+(((?!//|/\\*).)*)",
+			"captures":{
+				"1": {
+					"name": "keyword.control.directive.pragma.cfa",
+					"patterns":[{ "include": "#directive.punctuation"} ]
+				},
+				"2": {"name": "keyword.control.directive.pragma.argument.cfa"}
+			}
+		},
+		"directive.include.string": {
+			"begin": "<|\"",
+			"end": ">|\"",
+			"beginCaptures": {
+				"0": { "name": "punctuation.definition.string.begin.cfa" }
+			},
+			"endCaptures": {
+				"0": { "name": "punctuation.definition.string.end.cfa" }
+			},
+			"name": "string.quoted.include.cfa"
+		},
+		"directive.include": {
+			"name": "meta.preprocessor.include.cfa",
+			"match": "^\\s*(#\\s*include)\\s+(<.*>|\".*\")",
+			"captures": {
+				"1": {
+					"name": "keyword.control.directive.include.cfa",
+					"patterns":[{ "include": "#directive.punctuation"} ]
+				},
+				"2": {"patterns": [{ "include": "#directive.include.string"}]}
+			}
+		},
+		"directive.macro.name": {
+			"name": "entity.name.function.preprocessor.cfa",
+			"match": "[A-z0-9_]+"
+		},
+		"directive.define": {
+			"name": "meta.preprocessor.macro.cfa",
+			"match": "^\\s*(#\\s*define)\\s+([A-z0-9_]+)(\\(.*\\))?\\s+(.*)?",
+			"captures": {
+				"1": {
+					"name": "keyword.control.directive.define.cfa",
+					"patterns":[{ "include": "#directive.punctuation"} ]
+				},
+				"2": {"patterns": [{ "include": "#directive.macro.name"}]},
+				"3": {"name":"meta.define.C"},
+				"4": {"name":"meta.define.D"}
+			}
+		},
+		"directive.undef": {
+			"name": "meta.preprocessor.macro.cfa",
+			"match": "^\\s*(#\\s*undef)\\s+([A-z0-9_]+)",
+			"captures": {
+				"1": {
+					"name": "keyword.control.directive.undef.cfa",
+					"patterns":[{ "include": "#directive.punctuation"} ]
+				},
+				"2": {"name":"meta.define.B", "patterns": [{ "include": "#directive.macro.name"}]}
+			}
+		},
+		"directive.isdef": {
+			"match": "(defined)\\s*\\(\\s*([A-z0-9_]+)\\s*\\)",
+			"captures": {
+				"1": {
+					"name": "keyword.control.directive.conditional.cfa",
+					"match": "defined"
+				},
+				"2": {"patterns": [{ "include": "#directive.macro.name"}]}
+			}
+		},
+		"directive.ifdef": {
+			"name": "meta.preprocessor.cfa",
+			"match": "^\\s*(#\\s*ifdef)\\s+([A-z0-9_]+)",
+			"captures": {
+				"1": {
+					"name": "keyword.control.directive.conditional.cfa",
+					"patterns":[{ "include": "#directive.punctuation"} ]
+				},
+				"2": {"patterns": [{ "include": "#directive.macro.name"}]}
+			}
+		},
+		"directive.condition.arg": {
+			"name": "meta.preprocessor.cfa",
+			"match": "^\\s*(#\\s*if|#\\s*elif)\\s+(.*)",
+			"captures": {
+				"1": {
+					"name": "keyword.control.directive.conditional.cfa",
+					"patterns":[{ "include": "#directive.punctuation"} ]
+				},
+				"2": {"patterns":[
+					{ "include": "#expression"},
+					{ "include": "#directive.isdef"}
+				]}
+			}
+		},
+		"directive.condition.noargs": {
+			"name": "meta.preprocessor.cfa",
+			"match": "^\\s*(#\\s*endif|#\\s*else)\\s+",
+			"captures": {
+				"1": {
+					"name": "keyword.control.directive.conditional.cfa",
+					"patterns":[{ "include": "#directive.punctuation"} ]
+				}
+			}
+		},
+		"preprocessor": {
+			"patterns":[
+				{ "include": "#directive.pragma" },
+				{ "include": "#directive.include" },
+				{ "include": "#directive.define" },
+				{ "include": "#directive.undef" },
+				{ "include": "#directive.ifdef" },
+				{ "include": "#directive.condition.arg" },
+				{ "include": "#directive.condition.noargs" }
+			]
+		},
+		"comments.line":{
+			"name": "comment.line.double-slash.cfa",
+			"match": "(\/\/).*",
+			"captures": {
+				"1": {"name": "punctuation.definition.comment.c", "match": "\/\/"}
+			}
+		},
+		"comments.block":{
+			"name": "comment.block.cfa",
+			"begin": "/\\*",
+			"end": "\\*/",
+			"beginCaptures": {
+				"0": { "name": "punctuation.definition.comment.begin.cfa" }
+			},
+			"endCaptures": {
+				"0": { "name": "punctuation.definition.comment.end.cfa" }
+			}
+		},
+		"comments": {
+			"patterns":[
+				{ "include": "#comments.line"},
+				{ "include": "#comments.block"}
+			]
+		},
+		"extern.head.string": {
+			"begin": "\"",
+			"end": "\"",
+			"beginCaptures": {
+				"0": { "name": "punctuation.definition.string.begin.cfa" }
+			},
+			"endCaptures": {
+				"0": { "name": "punctuation.definition.string.end.cfa" }
+			},
+			"name": "string.quoted.extern.cfa"
+		},
+		"extern.head": {
+			"match": "(extern)\\s+(.*)\\s+(\\{)",
+			"captures": {
+				"1": { "name": "storage.modifier.cfa" },
+				"2": { "patterns":[{ "include": "#extern.head.string"}] },
+				"3": { "name": "punctuation.section.block.begin.bracket.curly.extern.cfa" }
+			}
+		},
+		"extern": {
+			"name": "meta.block.extern.cfa",
+			"begin": "(extern\\s+.*\\s+\\{)",
+			"end": "(\\})",
+			"beginCaptures": {
+				"0": { "name": "meta.head.extern.cfa", "patterns":[{ "include": "#extern.head" }] }
+			},
+			"endCaptures": {
+				"0": { "name": "punctuation.section.block.end.bracket.curly.extern.cfa" }
+			},
+			"contentName": "meta.body.extern.cfa",
+			"patterns": [{ "include": "$self" }]
+		}
+	}
+}
