public static bool TryParseNode(IParser parser, out TopMenuNode node) { node = null; bool result = false; if (parser.PeekToken(TokenKind.TopMenuKeyword)) { parser.NextToken(); result = true; node = new TopMenuNode(); node.StartIndex = parser.Token.Span.Start; NameExpression nameExpr; if (NameExpression.TryParseNode(parser, out nameExpr)) { node.MenuName = nameExpr; } if (parser.PeekToken(TokenKind.LeftParenthesis)) { parser.NextToken(); MenuAttribute attrib; while (MenuAttribute.TryParseNode(parser, out attrib, MenuComponent.Menu)) { node.Attributes.Add(attrib); if (!parser.PeekToken(TokenKind.Comma)) { break; } parser.NextToken(); } if (parser.PeekToken(TokenKind.RightParenthesis)) { parser.NextToken(); } else { parser.ReportSyntaxError("Expecting right-paren in menu attributes section."); } } TopMenuGroup group; while (TopMenuGroup.TryParseNode(parser, out group)) { node.Children.Add(group.StartIndex, group); } if (parser.PeekToken(TokenKind.EndKeyword)) { parser.NextToken(); node.EndIndex = parser.Token.Span.End; } else { parser.ReportSyntaxError("Expected \"end\" token."); } node.EndIndex = parser.Token.Span.End; } return(result); }