Beispiel #1
0
        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);
        }