Esempio n. 1
0
        public static bool TryParseFlag(string text, FlagMode mode, out FlagValue value)
        {
            if (string.IsNullOrEmpty(text))
            {
                value = default(FlagValue);
                return(false);
            }

            switch (mode)
            {
            case FlagMode.Char:
                value = new FlagValue(text[0]);
                return(true);

            case FlagMode.Long:
                var a = text[0];
                value = text.Length >= 2
                        ? Create(a, text[1])
                        : new FlagValue(a);
                return(true);

            case FlagMode.Num:
                return(TryParseNumberFlag(text, out value));

            case FlagMode.Uni:
            default:
                throw new NotSupportedException();
            }
        }
Esempio n. 2
0
        internal static bool TryParseFlag(StringSlice text, FlagMode mode, out FlagValue value)
        {
            if (text.IsEmpty)
            {
                value = default(FlagValue);
                return(false);
            }

            switch (mode)
            {
            case FlagMode.Char:
                value = new FlagValue(text.First());
                return(true);

            case FlagMode.Long:
                var a = text.First();
                value = text.Length >= 2
                        ? Create(a, text[1])
                        : new FlagValue(a);
                return(true);

            case FlagMode.Num:
                return(TryParseNumberFlag(text, out value));

            case FlagMode.Uni:
            default:
                throw new NotSupportedException();
            }
        }
Esempio n. 3
0
        /// <summary>
        /// 分析所有Token
        /// </summary>
        /// <returns></returns>
        public Token[] Parse()
        {
            if (this._kind != TokenKind.EOF)
            {
                do
                {
                    if (this._flagMode != FlagMode.None)
                    {
#if ALLOWCOMMENT
                        if (this._flagMode == FlagMode.Comment)
                        {
                            Next(1);
                            GetToken(TokenKind.TextData);
                            ReadCommentToken();
                        }
#else
                        if (false)
                        {
                        }
#endif
                        else
                        {
                            if (this._flagMode == FlagMode.Full)
                            {
                                Next(this._prefix.Length - 1);
                            }

                            AddToken(GetTokenKind(this._scanner.Read()));
                            switch (this._kind)
                            {
                            case TokenKind.StringStart:
                                this._pos.Push("\"");
                                break;

                            case TokenKind.LeftParentheses:
                                this._pos.Push("(");
                                break;
                            }
                            ReadToken();
                        }
                    }
                    else if (IsTagStart())
                    {
                        AddToken(TokenKind.TagStart);
                    }
                }while (Next());

                AddToken(TokenKind.EOF);


                if (this._flagMode != FlagMode.None)
                {
                    this._flagMode = FlagMode.None;
                    AddToken(new Token(TokenKind.TagEnd, String.Empty));
                }
            }

            return(this._collection.ToArray());
        }
Esempio n. 4
0
 /// <summary>
 /// Reset the <see cref="TemplateLexer"/>.
 /// </summary>
 public void Reset()
 {
     this.flagMode    = FlagMode.None;
     this.line        = 1;
     this.column      = 1;
     this.kind        = TokenKind.Text;
     this.startColumn = 1;
     this.startLine   = 1;
     this.scanner     = new CharScanner(this.document);
     this.collection  = new List <Token>();
     this.pos         = new Stack <string>();
 }
Esempio n. 5
0
 /// <summary>
 /// 重置分析器
 /// </summary>
 public void Reset()
 {
     this._flagMode    = FlagMode.None;
     this._line        = 1;
     this._column      = 1;
     this._kind        = TokenKind.Text;
     this._startColumn = 1;
     this._startLine   = 1;
     this._scanner     = new CharScanner(this._document);
     this._collection  = new List <Token>();
     this._pos         = new Stack <String>();
 }
Esempio n. 6
0
 /// <summary>
 /// 重置分析器
 /// </summary>
 public void Reset()
 {
     this._flagMode = FlagMode.None;
     this._line = 1;
     this._column = 1;
     this._kind = TokenKind.Text;
     this._startColumn = 1;
     this._startLine = 1;
     this._scanner = new CharScanner(this._document);
     this._collection = new List<Token>();
     this._pos = new Stack<String>();
 }
Esempio n. 7
0
        internal static       FlagValue[] ParseFlagsInOrder(StringSlice text, FlagMode mode)
        {
            switch (mode)
            {
            case FlagMode.Char: return(text.IsEmpty ? ArrayEx <FlagValue> .Empty : ConvertCharsToFlagsInOrder(text));

            case FlagMode.Long: return(ParseLongFlagsInOrder(text));

            case FlagMode.Num: return(ParseNumberFlagsInOrder(text).ToArray());

            default: throw new NotSupportedException();
            }
        }
Esempio n. 8
0
        internal static       FlagValue[] ParseFlagsInOrder(StringSlice text, FlagMode mode)
        {
            if (mode == FlagMode.Char)
            {
                return(text.Length == 0 ? ArrayEx <FlagValue> .Empty : ConvertCharsToFlagsInOrder(text));
            }
            if (mode == FlagMode.Long)
            {
                return(ParseLongFlagsInOrder(text));
            }
            if (mode == FlagMode.Num)
            {
                return(ParseNumberFlagsInOrder(text).ToArray());
            }

            throw new NotSupportedException();
        }
Esempio n. 9
0
        public static   FlagValue[] ParseFlagsInOrder(string text, FlagMode mode)
        {
            if (mode == FlagMode.Char)
            {
                return(text == null ? ArrayEx <FlagValue> .Empty : ConvertCharsToFlagsInOrder(text));
            }
            if (mode == FlagMode.Long)
            {
                return(ParseLongFlagsInOrder(text));
            }
            if (mode == FlagMode.Num)
            {
                return(ParseNumberFlagsInOrder(text).ToArray());
            }

            throw new NotSupportedException();
        }
Esempio n. 10
0
        private bool IsTagStart()
        {
            if (this.scanner.IsEnd() || this.flagMode != FlagMode.None)
            {
                return(false);
            }
            bool find = true;

            for (int i = 0; i < this.prefix.Length; i++)
            {
                if (this.prefix[i] != this.scanner.Read(i))
                {
                    find = false;
                    break;
                }
            }
            if (find)
            {
                this.flagMode = FlagMode.Full;
                return(true);
            }
            if (this.scanner.Read() == this.flag)
            {
#if ALLOWCOMMENT
                if (this.scanner.Read(1) == '*')
                {
                    this.flagMode = FlagMode.Comment;
                    return(true);
                }
#endif

                if (disableeLogogram)
                {
                    return(false);
                }

                if (char.IsLetter(this.scanner.Read(1)))
                {
                    this.flagMode = FlagMode.Logogram;
                    return(true);
                }
            }
            return(false);
        }
Esempio n. 11
0
        private Boolean ReadEndToken()
        {
            if (IsTagEnd())
            {
                Boolean add = true;
                if (this._flagMode == FlagMode.Full)
                {
                    AddToken(TokenKind.TagEnd);
                    Next(this._suffix.Length);
                }
#if ALLOWCOMMENT
                else if (this._flagMode == FlagMode.Comment)
                {
                    GetToken(TokenKind.TagEnd);
                    Next(2);
                    add = false;
                }
#endif
                else
                {
                    AddToken(TokenKind.TagEnd);
                }
                this._flagMode = FlagMode.None;
                Token token;

                if (IsTagStart())
                {
                    token = GetToken(TokenKind.TagStart);
                }
                else
                {
                    token = GetToken(TokenKind.Text);
                }

                if (add)
                {
                    AddToken(token);
                }

                return(true);
            }
            return(false);
        }
Esempio n. 12
0
        private Token GetEndToken()
        {
            var token = GetToken(TokenKind.TagEnd);

            if (this.flagMode == FlagMode.Full)
            {
                Move(this.suffix.Length - 1);
            }
#if ALLOWCOMMENT
            else if (this.flagMode == FlagMode.Comment)
            {
                Move(1);
            }
#endif
            else if (this.flagMode == FlagMode.Logogram)
            {
                Move(-1);
            }
            this.flagMode = FlagMode.None;
            return(token);
        }
Esempio n. 13
0
        private Boolean IsTagStart()
        {
            if (this._scanner.IsEnd() || this._flagMode != FlagMode.None)
            {
                return(false);
            }
            Boolean find = true;

            for (Int32 i = 0; i < this._prefix.Length; i++)
            {
                if (this._prefix[i] != this._scanner.Read(i))
                {
                    find = false;
                    break;
                }
            }
            if (find)
            {
                this._flagMode = FlagMode.Full;
                return(true);
            }
            if (this._scanner.Read() == this._flag)
            {
#if ALLOWCOMMENT
                if (this._scanner.Read(1) == '*')
                {
                    this._flagMode = FlagMode.Comment;
                    return(true);
                }
                else
#endif
                if (Char.IsLetter(this._scanner.Read(1)))
                {
                    this._flagMode = FlagMode.Logogram;
                    return(true);
                }
            }
            return(false);
        }
Esempio n. 14
0
 public static bool TryParseFlag(string text, FlagMode mode, out FlagValue value) =>
 TryParseFlag(text.AsSpan(), mode, out value);
Esempio n. 15
0
        /// <summary>
        /// 获取下一个TOKEN
        /// </summary>
        /// <returns></returns>
        public bool MoveNext()
        {
            Token token = null;

            do
            {
                //处于非标签模式
                if (this._flagMode == FlagMode.None)
                {
                    if (IsTagStart())
                    {
                        token = GetToken(TokenKind.TagStart);
                        if (this._flagMode == FlagMode.Full && this._prefix.Length > 1)
                        {
                            Move(this._prefix.Length - 1);
                        }
#if ALLOWCOMMENT
                        else if (this._flagMode == FlagMode.Comment)
                        {
                            Move(1);
                        }
#endif
                        continue;
                    }
                    if (this._kind != TokenKind.TagEnd)
                    {
                        continue;
                    }
                }

                if (this._scanner.Read() == '"')
                {
                    if (this._pos.Count > 0 && this._pos.Peek() == "\"")
                    {
                        if (this._scanner.Read(-1) != '\\' ||
                            GetPrevCharCount('\\') % 2 == 0)
                        {
                            //if (this._kind == TokenKind.StringStart)
                            //{
                            //    token = GetToken(TokenKind.String);
                            //}
                            token = GetToken(TokenKind.StringEnd);
                            this._pos.Pop();
                        }
                        continue;
                    }
                    else
                    {
                        if (this._kind == TokenKind.TagStart ||
                            this._kind == TokenKind.LeftBracket ||
                            this._kind == TokenKind.LeftParentheses ||
                            this._kind == TokenKind.Operator ||
                            this._kind == TokenKind.Punctuation ||
                            this._kind == TokenKind.Comma ||
                            this._kind == TokenKind.Colon ||
                            this._kind == TokenKind.LeftBrace ||
                            this._kind == TokenKind.Space)
                        {
                            token = GetToken(TokenKind.StringStart);
                            this._pos.Push("\"");
                            continue;
                        }
                    }
                }

                if (this._kind == TokenKind.StringStart)
                {
                    token = GetToken(TokenKind.String);
                    continue;
                }

                if (this._kind == TokenKind.String)
                {
                    continue;
                }

                if (this._scanner.Read() == '(' || this._scanner.Read() == '[' || this._scanner.Read() == '{')
                {
                    this._pos.Push(this._scanner.Read().ToString());
                }
                else if (
                    (this._scanner.Read() == ')' && this._pos.Count > 0 && this._pos.Peek() == "(") ||
                    (this._scanner.Read() == ']' && this._pos.Count > 0 && this._pos.Peek() == "[") ||
                    (this._scanner.Read() == '}' && this._pos.Count > 0 && this._pos.Peek() == "{"))   // && this.pos.Count > 2
                {
                    this._pos.Pop();
                }
                else if (IsTagEnd())
                {
                    token = GetToken(TokenKind.TagEnd);
                    if (this._flagMode == FlagMode.Full)
                    {
                        Move(this._suffix.Length - 1);
                    }
#if ALLOWCOMMENT
                    else if (this._flagMode == FlagMode.Comment)
                    {
                        Move(1);
                    }
#endif
                    else if (this._flagMode == FlagMode.Logogram)
                    {
                        Move(-1);
                    }
                    this._flagMode = FlagMode.None;
                    continue;
                }

                TokenKind tk;
                if (this._scanner.Read() == '+' || this._scanner.Read() == '-') //正负数符号识别
                {
                    if (char.IsNumber(this._scanner.Read(1)) &&
                        (this._kind != TokenKind.Number &&
                         this._kind != TokenKind.RightBracket &&
                         this._kind != TokenKind.RightParentheses &&
                         this._kind != TokenKind.RightBrace &&
                         this._kind != TokenKind.String &&
                         this._kind != TokenKind.Tag &&
                         this._kind != TokenKind.TextData))
                    {
                        tk = TokenKind.Number;
                    }
                    else
                    {
                        tk = TokenKind.Operator;
                    }
                }
                else
                {
                    tk = GetTokenKind(this._scanner.Read());
                }
                //if (this.kind == tk || (tk == TokenKind.Number && this.kind == TokenKind.TextData))
                if (
                    ((this._kind != tk || this._kind == TokenKind.LeftParentheses || this._kind == TokenKind.RightParentheses) &&
                     (tk != TokenKind.Number || this._kind != TokenKind.TextData)
                     //&& (this.kind == TokenKind.Number && tk != TokenKind.Dot)
                    ) ||
                    (this._kind == tk && (tk == TokenKind.LeftBracket || tk == TokenKind.LeftParentheses || tk == TokenKind.LeftBrace || tk == TokenKind.RightBracket || tk == TokenKind.RightParentheses || tk == TokenKind.RightBrace))
                    )
                //|| (this.kind != TokenKind.Number && tk == TokenKind.Dot)
                {
                    if (tk == TokenKind.Dot && this._kind == TokenKind.Number)
                    {
                    }
                    else
                    {
                        token = GetToken(tk);
                    }
                }
            }while (Move() && token == null);

            if (token != null ||
                (this._flagMode != FlagMode.None && (token = new Token(TokenKind.TagEnd, string.Empty)) != null) ||
                (this._kind != TokenKind.EOF && (token = GetToken(TokenKind.EOF)) != null))
            {
                this.Current = token;
                return(true);
            }

            return(false);
        }
Esempio n. 16
0
        private Boolean IsTagStart()
        {
            if (this._scanner.IsEnd() || this._flagMode != FlagMode.None)
            {
                return false;
            }
            Boolean find = true;
            for (Int32 i = 0; i < this._prefix.Length; i++)
            {
                if (this._prefix[i] != this._scanner.Read(i))
                {
                    find = false;
                    break;
                }
            }
            if (find)
            {
                this._flagMode = FlagMode.Full;
                return true;
            }
            if (this._scanner.Read() == this._flag)
            {
#if ALLOWCOMMENT
                if (this._scanner.Read(1) == '*')
                {
                    this._flagMode = FlagMode.Comment;
                    return true;
                }
                else
#endif
                    if (Char.IsLetter(this._scanner.Read(1)))
                    {
                        this._flagMode = FlagMode.Logogram;
                        return true;
                    }
            }
            return false;
        }
Esempio n. 17
0
 internal static FlagSet ParseFlags(ReadOnlySpan <char> text, FlagMode mode) =>
 FlagSet.TakeArray(ParseFlagsInOrder(text, mode));
Esempio n. 18
0
 public static FlagSet ParseFlags(string text, int startIndex, int length, FlagMode mode) =>
 FlagSet.TakeArray(ParseFlagsInOrder(text, startIndex, length, mode));
Esempio n. 19
0
 public static FlagSet ParseFlags(string text, FlagMode mode) =>
 FlagSet.TakeArray(ParseFlagsInOrder(text, mode));
Esempio n. 20
0
 public static FlagSet ParseFlags(string text, FlagMode mode) =>
 ParseFlags(text.AsSpan(), mode);
Esempio n. 21
0
 public static         FlagValue[] ParseFlagsInOrder(string text, FlagMode mode) =>
 ParseFlagsInOrder(StringSlice.Create(text), mode);
Esempio n. 22
0
 public static FlagValue[] ParseFlagsInOrder(string text, int startIndex, int length, FlagMode mode) =>
 ParseFlagsInOrder(text.Subslice(startIndex, length), mode);
Esempio n. 23
0
        /// <summary>
        /// 分析所有Token
        /// </summary>
        /// <returns></returns>
        public Token[] Parse()
        {
            if (this._kind != TokenKind.EOF)
            {
                do
                {
                    if (this._flagMode != FlagMode.None)
                    {
#if ALLOWCOMMENT
                        if (this._flagMode == FlagMode.Comment)
                        {
                            Next(1);
                            GetToken(TokenKind.TextData);
                            ReadCommentToken();
                        }
#else
                        if (false)
                        {

                        }
#endif
                        else
                        {
                            if (this._flagMode == FlagMode.Full)
                            {
                                Next(this._prefix.Length - 1);
                            }

                            AddToken(GetTokenKind(this._scanner.Read()));
                            switch (this._kind)
                            {
                                case TokenKind.StringStart:
                                    this._pos.Push("\"");
                                    break;
                                case TokenKind.LeftParentheses:
                                    this._pos.Push("(");
                                    break;
                            }
                            ReadToken();
                        }

                    }
                    else if (IsTagStart())
                    {
                        AddToken(TokenKind.TagStart);
                    }
                }
                while (Next());

                AddToken(TokenKind.EOF);


                if (this._flagMode != FlagMode.None)
                {
                    this._flagMode = FlagMode.None;
                    AddToken(new Token(TokenKind.TagEnd, String.Empty));
                }

            }

            return this._collection.ToArray();

        }
Esempio n. 24
0
 public static FlagSet ParseFlags(string text, FlagMode mode) =>
 string.IsNullOrEmpty(text)
         ? FlagSet.Empty
         : FlagSet.TakeArray(ParseFlagsInOrder(text, mode));
Esempio n. 25
0
 internal static FlagSet ParseFlags(StringSlice text, FlagMode mode) =>
 FlagSet.TakeArray(ParseFlagsInOrder(text, mode));
Esempio n. 26
0
 public static bool TryParseFlag(string text, FlagMode mode, out FlagValue value) =>
 TryParseFlag(StringSlice.Create(text), mode, out value);
Esempio n. 27
0
 public static bool TryParseFlag(string text, int startIndex, int length, FlagMode mode, out FlagValue value) =>
 TryParseFlag(text.Subslice(startIndex, length), mode, out value);
Esempio n. 28
0
        private Boolean ReadEndToken()
        {
            if (IsTagEnd())
            {
                Boolean add = true;
                if (this._flagMode == FlagMode.Full)
                {
                    AddToken(TokenKind.TagEnd);
                    Next(this._suffix.Length);
                }
#if ALLOWCOMMENT
                else if (this._flagMode == FlagMode.Comment)
                {
                    GetToken(TokenKind.TagEnd);
                    Next(2);
                    add = false;
                }
#endif
                else
                {
                    AddToken(TokenKind.TagEnd);
                }
                this._flagMode = FlagMode.None;
                Token token;

                if (IsTagStart())
                {
                    token = GetToken(TokenKind.TagStart);
                }
                else
                {
                    token = GetToken(TokenKind.Text);
                }

                if (add)
                {
                    AddToken(token);
                }

                return true;
            }
            return false;
        }