// Use this for initialization
 void Start()
 {
     pointValue            = 100;
     health                = 1;
     AnchorInstance        = (GameObject)Instantiate(PathAnchor, transform.position, Quaternion.Euler(0, 0, 180));
     ThisAnchor            = AnchorInstance.GetComponent <PathAnchor>();
     ThisAnchor.ParentShip = this;
     Physics2D.IgnoreCollision(GetComponent <Collider2D>(), ThisAnchor.GetComponent <Collider2D>());
 }
        public HierarchicalExpression(PathAnchor anchor, string[] segments, IMemberExpression accessor)
        {
            this.Anchor   = anchor;
            this.Accessor = accessor;
            this.Segments = segments ?? Array.Empty <string>();

            switch (anchor)
            {
            case PathAnchor.Root:
                if (segments == null || segments.Length == 0)
                {
                    this.Path = HierarchicalNode.PathSeparatorChar.ToString();
                }
                else
                {
                    this.Path = HierarchicalNode.PathSeparatorChar + string.Join(HierarchicalNode.PathSeparatorChar, segments);
                }
                break;

            case PathAnchor.Current:
                if (segments == null || segments.Length == 0)
                {
                    this.Path = ".";
                }
                else
                {
                    this.Path = "." + HierarchicalNode.PathSeparatorChar + string.Join(HierarchicalNode.PathSeparatorChar, segments);
                }
                break;

            case PathAnchor.Parent:
                if (segments == null || segments.Length == 0)
                {
                    this.Path = "..";
                }
                else
                {
                    this.Path = ".." + HierarchicalNode.PathSeparatorChar + string.Join(HierarchicalNode.PathSeparatorChar, segments);
                }
                break;

            default:
                if (segments == null || segments.Length == 0)
                {
                    this.Path = string.Empty;
                }
                else
                {
                    this.Path = string.Join(HierarchicalNode.PathSeparatorChar, Segments);
                }
                break;
            }
        }
Example #3
0
        /// <summary>
        /// 尝试解析路径。
        /// </summary>
        /// <param name="text">指定要解析的路径文本。</param>
        /// <param name="scheme">返回解析成功的路径对应的文件系统<see cref="IFileSystem.Scheme"/>方案。</param>
        /// <param name="path">返回解析成功的完整路径,更多信息请参考<see cref="Path.FullPath"/>属性文档。</param>
        /// <param name="anchor">返回解析成功的路径锚点。</param>
        /// <returns>如果解析成功则返回真(True),否则返回假(False)。</returns>
        public static bool TryParse(string text, out string scheme, out string path, out PathAnchor anchor)
        {
            path = null;
            string[] segments;

            if (ParseCore(text, false, out scheme, out segments, out anchor))
            {
                path = GetAnchorString(anchor, true) + string.Join("/", segments);
                return(true);
            }

            return(false);
        }
Example #4
0
        private static string GetAnchorString(PathAnchor anchor, bool slashed)
        {
            switch (anchor)
            {
            case PathAnchor.Root:
                return("/");

            case PathAnchor.Current:
                return(slashed ? "./" : ".");

            case PathAnchor.Parent:
                return(slashed ? "../" : "..");

            default:
                return(string.Empty);
            }
        }
Example #5
0
        private Path(string scheme, string[] segments, PathAnchor anchor)
        {
            _scheme   = scheme;
            _segments = segments;
            _anchor   = anchor;

            //计算并保存路径全称
            _fullPath = GetAnchorString(anchor, true) + string.Join("/", segments);

            if (segments.Length == 0)
            {
                _fileName      = string.Empty;
                _directoryName = GetAnchorString(anchor, true);
            }
            else
            {
                if (string.IsNullOrEmpty(segments[segments.Length - 1]))
                {
                    _fileName      = string.Empty;
                    _directoryName = _fullPath;
                }
                else
                {
                    _fileName = segments[segments.Length - 1];

                    if (segments.Length == 1)
                    {
                        _directoryName = GetAnchorString(anchor, true);
                    }
                    else
                    {
                        _directoryName = GetAnchorString(anchor, true) + string.Join("/", segments, 0, segments.Length - 1) + "/";
                    }
                }
            }
        }
Example #6
0
 private Path(string scheme, PathAnchor anchor, string[] segments)
 {
     _scheme   = scheme;
     _segments = segments;
     _anchor   = anchor;
 }
Example #7
0
        /// <summary>
        /// 解析路径。
        /// </summary>
        /// <param name="text">指定要解析的路径文本。</param>
        /// <param name="throwException">指定无效的路径文本是否激发异常。</param>
        /// <param name="scheme">返回解析成功的路径对应的文件系统<see cref="IFileSystem.Scheme"/>方案。</param>
        /// <param name="segments">返回解析成功的路径节点数组,更多信息请参考<see cref="Path.Segments"/>属性文档。</param>
        /// <param name="anchor">返回解析成功的路径锚点。</param>
        /// <returns>如果解析成功则返回真(True),否则返回假(False)。</returns>
        private static bool ParseCore(string text, bool throwException, out string scheme, out string[] segments, out PathAnchor anchor)
        {
            const int PATH_NONE_STATE    = 0;               //状态机:初始态
            const int PATH_SLASH_STATE   = 1;               //状态机:斜杠态(路径分隔符)
            const int PATH_ANCHOR_STATE  = 2;               //状态机:锚点态
            const int PATH_SEGMENT_STATE = 3;               //状态机:内容态

            scheme   = null;
            segments = null;
            anchor   = PathAnchor.None;

            if (string.IsNullOrEmpty(text))
            {
                if (throwException)
                {
                    throw new PathException("The path text is null or empty.");
                }

                return(false);
            }

            var state  = 0;
            var spaces = 0;
            var part   = string.Empty;
            var parts  = new List <string>();

            for (int i = 0; i < text.Length; i++)
            {
                var chr = text[i];

                switch (chr)
                {
                case ' ':
                    if (state == PATH_ANCHOR_STATE && anchor == PathAnchor.Current)
                    {
                        if (throwException)
                        {
                            throw new PathException("");
                        }

                        return(false);
                    }

                    if (part.Length > 0)
                    {
                        spaces++;
                    }

                    break;

                case '\t':
                case '\n':
                case '\r':
                    break;

                case ':':
                    //注意:当首次遇到冒号时,其为Scheme定语;否则即为普通字符
                    if (parts.Count == 0)
                    {
                        if (string.IsNullOrEmpty(part))
                        {
                            if (throwException)
                            {
                                throw new PathException("The scheme of path is empty.");
                            }

                            return(false);
                        }

                        //设置路径方案
                        scheme = part;

                        //重置空格计数器
                        spaces = 0;

                        //重置内容文本
                        part = string.Empty;

                        //设置当前状态为初始态
                        state = PATH_NONE_STATE;
                    }
                    else
                    {
                        //跳转到默认分支,即做普通字符处理
                        goto default;
                    }

                    break;

                case '.':
                    switch (state)
                    {
                    case PATH_NONE_STATE:
                        anchor = PathAnchor.Current;
                        break;

                    case PATH_ANCHOR_STATE:
                        if (anchor == PathAnchor.Current)
                        {
                            anchor = PathAnchor.Parent;
                        }
                        else
                        {
                            if (throwException)
                            {
                                throw new PathException("Invalid anchor of path.");
                            }

                            return(false);
                        }

                        break;

                    default:
                        goto TEXT_LABEL;
                    }

                    state = PATH_ANCHOR_STATE;

                    break;

                case '/':
                case '\\':
                    switch (state)
                    {
                    case PATH_NONE_STATE:
                        anchor = PathAnchor.Root;
                        break;

                    case PATH_SLASH_STATE:
                        if (throwException)
                        {
                            throw new PathException("Invalid path text, it contains repeated slash character.");
                        }

                        return(false);

                    case PATH_SEGMENT_STATE:
                        if (string.IsNullOrEmpty(part))
                        {
                            if (throwException)
                            {
                                throw new PathException("Error occurred, The path parser internal error.");
                            }

                            return(false);
                        }

                        parts.Add(part);

                        break;
                    }

                    spaces = 0;
                    part   = string.Empty;
                    state  = PATH_SLASH_STATE;

                    break;

                //注意:忽略对“?”、“*”字符的检验处理,因为需要支持对通配符模式路径的链接。
                //case '?':
                //case '*':
                case '"':
                case '|':
                case '<':
                case '>':
                    if (throwException)
                    {
                        throw new ArgumentException(string.Format("Invalid path, it contains '{0}' illegal character(s).", chr));
                    }

                    return(false);

                default:
TEXT_LABEL:
                    if (spaces > 0)
                    {
                        part  += new string(' ', spaces);
                        spaces = 0;
                    }

                    part += chr;
                    state = PATH_SEGMENT_STATE;

                    break;
                }
            }

            if (state == PATH_SEGMENT_STATE && part.Length > 0)
            {
                parts.Add(part);
            }

            if (parts.Count == 0 && anchor == PathAnchor.None)
            {
                if (throwException)
                {
                    throw new PathException("The path text is all whitespaces.");
                }

                return(false);
            }

            segments = new string[parts.Count + (state == PATH_SLASH_STATE && parts.Count > 0 ? 1 : 0)];

            for (var i = 0; i < parts.Count; i++)
            {
                segments[i] = parts[i];
            }

            return(true);
        }
Example #8
0
 /// <summary>
 /// 尝试解析路径。
 /// </summary>
 /// <param name="text">指定要解析的路径文本。</param>
 /// <param name="scheme">返回解析成功的路径对应的文件系统<see cref="IFileSystem.Scheme"/>方案。</param>
 /// <param name="segments">返回解析成功的路径节点数组,更多信息请参考<see cref="Path.Segments"/>属性文档。</param>
 /// <param name="anchor">返回解析成功的路径锚点。</param>
 /// <returns>如果解析成功则返回真(True),否则返回假(False)。</returns>
 public static bool TryParse(string text, out string scheme, out string[] segments, out PathAnchor anchor)
 {
     return(ParseCore(text, false, out scheme, out segments, out anchor));
 }