/// <summary> /// 读取文档杂注@#...#@ /// </summary> protected void ReadFileRem() { if (++CurWordIndex >= WordElements.Count) { return; } WordElement code = new WordElement(); bool shfit = false; for (++CurWordIndex; CurWordIndex < WordElements.Count; CurWordIndex++) { WordElements[CurWordIndex].SetRace(CodeItemRace.Assist, CodeItemFamily.Rem); var curElement = WordElements[CurWordIndex]; if (shfit && curElement.Char == '@') { break; } shfit = curElement.Char == '#'; code.Append(curElement); } if (code.Words.Count == 0) { return; } code.Release(); CheckConfig(code); }
/// <summary> /// 合并基本单词 /// </summary> /// <returns></returns> internal void MergeWords() { Elements.Clear(); WordUnit pre = null; WordElement cur = null; int line = 0; int col = 0; foreach (var word in Words) { word.Line = line; word.Column = col; if (word.IsLine) { line++; col = 0; } else { col += word.Lenght; } if (cur == null || !word.IsSpace || !pre.IsSpace) { Elements.Add(cur = new WordElement(word)); pre = word; continue; } cur.Append(word); } foreach (var element in Elements) { element.Release(); } }
/// <summary> /// 合并字符 /// </summary> /// <param name="codeElement">代码块</param> /// <param name="sign">字符使用哪个符号(一般都是"或')</param> protected void MergeString(WordElement codeElement, char sign) { var preShift = false; for (CurWordIndex++; CurWordIndex < WordElements.Count; CurWordIndex++) { var curElement = WordElements[CurWordIndex]; codeElement.Append(curElement); if (preShift) { preShift = false; //前方为转义字符不处理 continue; } if (curElement.Char == '\\') { preShift = true; continue; } if (curElement.Char == sign) { break; //成对出现,结束字符串识别 } } codeElement.SetRace(CodeItemRace.Value, CodeItemFamily.Constant, CodeItemType.String); }
/// <summary> /// 构造 /// </summary> /// <param name="element">节点</param> public AnalyzeElement(WordElement element) { CurrentElement = element; if (element != null) { Append(element); } }
/// <summary> /// 重置当前内容节点 /// </summary> /// <param name="element"></param> protected void ResetContentElement(WordElement element = null) { ContentElement = new AnalyzeElement(element) { IsContent = true }; TemplateElements.Add(ContentElement); }
/// <summary> /// 接入单元 /// </summary> /// <param name="idx"></param> /// <param name="element">代码的基本单元</param> public void Insert(int idx, WordElement element) { if (element == null || Elements.Contains(element)) { return; } Elements.Insert(idx, element); //if ((Start < 0 || Start > element.Start) && element.Start >= 0) // Start = element.Start; //if (End < element.End && element.End >= 0) // End = element.End; }
/// <summary> /// 合并单元 /// </summary> /// <param name="element">代码的基本单元</param> public void Append(WordElement element) { if (element == null || Elements.Contains(element)) { return; } if ((Start < 0 || Start > element.Start) && element.Start >= 0) { Start = element.Start; } if (End < element.End && element.End >= 0) { End = element.End; } Elements.Add(CurrentElement = element); }
private void CheckConfig(WordElement code) { string name = null; StringBuilder value = new StringBuilder(); int step = 0; char bc = '\0'; char prechar = '\0'; foreach (var word in code.Words) { switch (step) { case 0: //取得名称,并在出现第一个冒时时进入第二步 if (word.IsSpace) { continue; } if (!word.IsPunctuate) { name = word.Word; word.ItemRace = CodeItemRace.Variable; } else if (word.Char == ':') { step = 1; word.ItemRace = CodeItemRace.Assist; word.ItemFamily = CodeItemFamily.Range; value.Clear(); } continue; case 1: //检测值是以哪种方式存在 if (word.IsLine) //空说明,跳过 { step = 0; continue; } if (word.IsSpace) { continue; } switch (word.Char) { case '\'': case '\"': step = 3; //有引号的 bc = word.Char; prechar = '\0'; break; default: value.Append(word.Word); step = 2; //没引号的 break; } break; case 2: //没引号的,到行结束 if (word.IsLine) { SetConfig(name, value.ToString()); step = 0; name = null; break; } value.Append(word.Word); break; case 3: //有引号的,到引号结束,使用转义 if (prechar == '\\') { value.Remove(value.Length - 1, 1); value.Append(word.Word); break; } if (word.Char == bc) { SetConfig(name, value.ToString()); step = 0; name = null; break; } value.Append(word.Word); break; } word.SetRace(CodeItemRace.Value, CodeItemFamily.Constant, CodeItemType.String); } SetConfig(name, value.ToString()); }
/// <summary> /// 追加字符 /// </summary> /// <param name="word">基本单词</param> public void Append(WordElement word) { word.Words.ForEach(Append); }