Пример #1
0
		/// <summary>
		/// 收集子标签。
		/// </summary>
		/// <param name="tag">指定一个标签实例。</param>
		/// <param name="index">指定标签索引。</param>
		/// <returns>Tag</returns>
		private Tag CollectForTag(Tag tag, ref int index)
		{
			if (tag.IsClosed) return tag;
			if (string.Compare(tag.Name, "if", true) == 0) tag = new TagIf(tag.Line, tag.Col, tag.AttributeValue("test"));

			Tag collectTag = tag;

			for (index++; index < _Elements.Count; index++)
			{
				Element elem = _Elements[index];

				if (elem is Text)
					collectTag.InnerElements.Add(elem);
				else if (elem is Expression)
					collectTag.InnerElements.Add(elem);
				else if (elem is Tag)
				{
					Tag innerTag = (Tag)elem;
					if (string.Compare(innerTag.Name, "else", true) == 0)
					{
						if (collectTag is TagIf)
						{
							((TagIf)collectTag).FalseBranch = innerTag;
							collectTag = innerTag;
						}
						else
							throw new ParseException("else 标签必须包含在 if 或 elseif 之内。", innerTag.Line, innerTag.Col);

					}
					else if (string.Compare(innerTag.Name, "elseif", true) == 0)
					{
						if (collectTag is TagIf)
						{
							Tag newTag = new TagIf(innerTag.Line, innerTag.Col, innerTag.AttributeValue("test"));
							((TagIf)collectTag).FalseBranch = newTag;
							collectTag = newTag;
						}
						else
							throw new ParseException("elseif 标签位置不正确。", innerTag.Line, innerTag.Col);
					}
					else
						collectTag.InnerElements.Add(CollectForTag(innerTag, ref index));
				}
				else if (elem is TagClose)
				{
					TagClose tagClose = (TagClose)elem;
					if (string.Compare(tag.Name, tagClose.Name, true) == 0)
						return tag;

					throw new ParseException("没有为闭合标签 " + tagClose.Name + " 找到合适的开始标签。", elem.Line, elem.Col);
				}
				else
					throw new ParseException("无效标签: " + elem.GetType().ToString(), elem.Line, elem.Col);
			}

			throw new ParseException("没有为开始标签 " + tag.Name + " 找到合适的闭合标签。", tag.Line, tag.Col);
		}
Пример #2
0
		/// <summary>
		/// 处理 If 语句。
		/// </summary>
		/// <param name="tagIf">包含 if 语句的标签实例。</param>
		protected void ProcessIf(TagIf tagIf)
		{
			bool condition = false;

			try
			{
				object value = this.EvalExpression(tagIf.Test);

				condition = Utility.ToBool(value);
			}
			catch (Exception ex)
			{
				this.DisplayError("遭遇非法的 If 语句。" + ex.Message,
					tagIf.Line, tagIf.Col);
				return;
			}

			if (condition)
				this.ProcessElements(tagIf.InnerElements);
			else
				this.ProcessElement(tagIf.FalseBranch);
		}