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(); } }
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(); } }
/// <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()); }
/// <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>(); }
/// <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>(); }
/// <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>(); }
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(); } }
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(); }
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(); }
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); }
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); }
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); }
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); }
public static bool TryParseFlag(string text, FlagMode mode, out FlagValue value) => TryParseFlag(text.AsSpan(), mode, out value);
/// <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); }
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; }
internal static FlagSet ParseFlags(ReadOnlySpan <char> text, FlagMode mode) => FlagSet.TakeArray(ParseFlagsInOrder(text, mode));
public static FlagSet ParseFlags(string text, int startIndex, int length, FlagMode mode) => FlagSet.TakeArray(ParseFlagsInOrder(text, startIndex, length, mode));
public static FlagSet ParseFlags(string text, FlagMode mode) => FlagSet.TakeArray(ParseFlagsInOrder(text, mode));
public static FlagSet ParseFlags(string text, FlagMode mode) => ParseFlags(text.AsSpan(), mode);
public static FlagValue[] ParseFlagsInOrder(string text, FlagMode mode) => ParseFlagsInOrder(StringSlice.Create(text), mode);
public static FlagValue[] ParseFlagsInOrder(string text, int startIndex, int length, FlagMode mode) => ParseFlagsInOrder(text.Subslice(startIndex, length), mode);
/// <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(); }
public static FlagSet ParseFlags(string text, FlagMode mode) => string.IsNullOrEmpty(text) ? FlagSet.Empty : FlagSet.TakeArray(ParseFlagsInOrder(text, mode));
internal static FlagSet ParseFlags(StringSlice text, FlagMode mode) => FlagSet.TakeArray(ParseFlagsInOrder(text, mode));
public static bool TryParseFlag(string text, FlagMode mode, out FlagValue value) => TryParseFlag(StringSlice.Create(text), mode, out value);
public static bool TryParseFlag(string text, int startIndex, int length, FlagMode mode, out FlagValue value) => TryParseFlag(text.Subslice(startIndex, length), mode, out value);
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; }