Пример #1
0
        void ParseMessage(FileNode filenode)
        {
            var node = new MessageNode();

            // message的头注释
            ParseCommentAndEOL(node);

            Consume(TokenType.Message);
            MarkLocation(node);

            node.Name = FetchToken(TokenType.Identifier, "require message type name").Value;

            _tool.CheckDuplicate(node.Loc, filenode.Package, node.Name);

            filenode.AddMessage(node);

            _fileNode.AddSymbol(filenode.Package, node.Name, node);


            TryConsume(TokenType.EOL);
            ParseCommentAndEOL(node);
            Consume(TokenType.LBrace);
            TryConsume(TokenType.EOL);


            while (CurrToken.Type != TokenType.RBrace)
            {
                ParseCommentAndEOL(node);

                // 内嵌枚举
                while (CurrToken.Type == TokenType.Enum)
                {
                    _fileNode.EnterScope();
                    ParseEnum(filenode, node);
                    _fileNode.LeaveScope();

                    ParseCommentAndEOL(node);
                }

                if (CurrToken.Type == TokenType.RBrace)
                {
                    break;
                }

                ParseField(filenode, node);
            }

            Consume(TokenType.RBrace); TryConsume(TokenType.EOL);

            FillFieldNumber(node);
        }