public Tag Parse(TemplateParser parser, TokenCollection tc) { if (tc.Count > 0 && Common.ParserHelpers.IsEqual(Field.KEY_FOREACH, tc.First.Text)) { if (tc.Count > 5 && tc[1].TokenKind == TokenKind.LeftParentheses && tc[2].TokenKind == TokenKind.TextData && Common.ParserHelpers.IsEqual(tc[3].Text, Field.KEY_IN) && tc.Last.TokenKind == TokenKind.RightParentheses) { ForeachTag tag = new ForeachTag(); tag.Name = tc[2].Text; TokenCollection coll = new TokenCollection(); coll.Add(tc, 4, tc.Count - 2); tag.Source = parser.Read(coll); while (parser.MoveNext()) { tag.Children.Add(parser.Current); if (parser.Current is EndTag) { return(tag); } } throw new Exception.ParseException(String.Concat("foreach is not properly closed by a end tag:", tc), tc.First.BeginLine, tc.First.BeginColumn); } else { throw new Exception.ParseException(String.Concat("syntax error near foreach:", tc), tc.First.BeginLine, tc.First.BeginColumn); } } return(null); }
/// <summary> /// 分析标签 /// </summary> /// <param name="parser">TemplateParser</param> /// <param name="tc">Token集合</param> /// <returns></returns> public Tag Parse(TemplateParser parser, TokenCollection tc) { if (tc != null && parser != null && tc.Count > 3 && Common.Utility.IsEqual(tc.First.Text, Field.KEY_IF)) { if (tc[1].TokenKind == TokenKind.LeftParentheses && tc.Last.TokenKind == TokenKind.RightParentheses) { IfTag tag = new IfTag(); ElseifTag t = new ElseifTag(); TokenCollection coll = new TokenCollection(); coll.Add(tc, 2, tc.Count - 2); t.Test = parser.Read(coll); t.FirstToken = coll.First; //t.LastToken = coll.Last; tag.AddChild(t); while (parser.MoveNext()) { if (parser.Current is EndTag) { tag.AddChild(parser.Current); return(tag); } else if (parser.Current is ElseifTag || parser.Current is ElseTag) { tag.AddChild(parser.Current); } else { tag.Children[tag.Children.Count - 1].AddChild(parser.Current); } } throw new Exception.ParseException(String.Concat("if is not properly closed by a end tag:", tc), tc.First.BeginLine, tc.First.BeginColumn); } else { throw new Exception.ParseException(String.Concat("syntax error near if:", tc), tc.First.BeginLine, tc.First.BeginColumn); } } return(null); }
/// <summary> /// 分析标签 /// </summary> /// <param name="parser">TemplateParser</param> /// <param name="tc">Token集合</param> /// <returns></returns> public Tag Parse(TemplateParser parser, TokenCollection tc) { if (tc.Count > 3 && Common.ParserHelpers.IsEqual(Field.KEY_FOR, tc.First.Text)) { if (tc[1].TokenKind == TokenKind.LeftParentheses && tc.Last.TokenKind == TokenKind.RightParentheses) { Int32 pos = 0, start = 2, end; List <Tag> ts = new List <Tag>(3); ForTag tag = new ForTag(); for (Int32 i = 2; i < tc.Count - 1; i++) { end = i; if (tc[i].TokenKind == TokenKind.Punctuation && tc[i].Text == ";") { if (pos == 0) { TokenCollection coll = new TokenCollection(); coll.Add(tc, start, end - 1); if (coll.Count > 0) { ts.Add(parser.Read(coll)); } else { ts.Add(null); } start = i + 1; continue; } } if (tc[i].TokenKind == TokenKind.LeftParentheses) { pos++; } else if (tc[i].TokenKind == TokenKind.RightParentheses) { pos--; } if (i == tc.Count - 2) { TokenCollection coll = new TokenCollection(); coll.Add(tc, start, end); if (coll.Count > 0) { ts.Add(parser.Read(coll)); } else { ts.Add(null); } } } if (ts.Count != 3) { throw new Exception.ParseException(String.Concat("syntax error near for:", tc), tc.First.BeginLine, tc.First.BeginColumn); } tag.Initial = ts[0]; tag.Test = ts[1]; tag.Do = ts[2]; while (parser.MoveNext()) { tag.Children.Add(parser.Current); if (parser.Current is EndTag) { return(tag); } } throw new Exception.ParseException(String.Concat("for is not properly closed by a end tag:", tc), tc.First.BeginLine, tc.First.BeginColumn); } else { throw new Exception.ParseException(String.Concat("syntax error near for:", tc), tc.First.BeginLine, tc.First.BeginColumn); } } return(null); }