private TechniqueSyntax ParseTechnique()
{
var technique = NextToken();
SyntaxToken name = null;
if (Current.Kind == SyntaxKind.IdentifierToken)
name = Match(SyntaxKind.IdentifierToken);
AnnotationsSyntax annotations = null;
if (Current.Kind == SyntaxKind.LessThanToken)
annotations = ParseAnnotations();
var openBrace = Match(SyntaxKind.OpenBraceToken);
var passes = new List<PassSyntax>();
while (Current.Kind != SyntaxKind.CloseBraceToken)
{
if (Current.Kind == SyntaxKind.PassKeyword)
{
passes.Add(ParsePass());
}
else
{
var action = SkipBadTokens(
p => p.Current.Kind != SyntaxKind.PassKeyword,
p => p.IsTerminator(),
SyntaxKind.CloseBraceToken);
if (action == PostSkipAction.Abort)
break;
}
}
var closeBrace = Match(SyntaxKind.CloseBraceToken);
var semicolon = NextTokenIf(SyntaxKind.SemiToken);
return new TechniqueSyntax(technique, name, annotations, openBrace, passes, closeBrace, semicolon);
}