private Statement ParseTryStatement() {
Eat(TokenKind.KeywordTry);
var start = GetStart();
var mid = GetEnd();
Statement body = ParseSuite();
Statement finallySuite = null;
Statement elseSuite = null;
Statement ret;
int end;
if (MaybeEat(TokenKind.KeywordFinally)) {
finallySuite = ParseFinallySuite(finallySuite);
end = finallySuite.EndIndex;
TryStatement tfs = new TryStatement(body, null, elseSuite, finallySuite);
tfs.HeaderIndex = mid;
ret = tfs;
} else {
List<TryStatementHandler> handlers = new List<TryStatementHandler>();
TryStatementHandler dh = null;
do {
TryStatementHandler handler = ParseTryStmtHandler();
end = handler.EndIndex;
handlers.Add(handler);
if (dh != null) {
ReportSyntaxError(dh.StartIndex, dh.EndIndex, "default 'except' must be last");
}
if (handler.Test == null) {
dh = handler;
}
} while (PeekToken().Kind == TokenKind.KeywordExcept);
if (MaybeEat(TokenKind.KeywordElse)) {
elseSuite = ParseSuite();
end = elseSuite.EndIndex;
}
if (MaybeEat(TokenKind.KeywordFinally)) {
// If this function has an except block, then it can set the current exception.
finallySuite = ParseFinallySuite(finallySuite);
end = finallySuite.EndIndex;
}
TryStatement ts = new TryStatement(body, handlers.ToArray(), elseSuite, finallySuite);
ts.HeaderIndex = mid;
ret = ts;
}
ret.SetLoc(_globalParent, start, end);
return ret;
}