using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace Core.StlMes { /// /// 语法分析基类 /// public class SyntaxEngine { /// /// 语法项 /// public class SyntaxItem { private string FPattern; // 正则表达式 private RegexOptions FOptions; // 正则表达式附加选项 private string FName; // 语法名称 private int FIndex; // 序号 public string Pattern { get { return FPattern; } } // 正则表达式 public RegexOptions Options { get { return FOptions; } } // 正则表达式附加选项 public string Name { get { return FName; } } // 名称 public int Index { get { return FIndex; } } // 序号 public SyntaxItem(string APattern, RegexOptions AOptions, string AName, int AIndex) { FPattern = APattern; FOptions = AOptions; FName = AName; FIndex = AIndex; } } /// /// 语法分析返回项 /// public class AnalyzeReslut { private SyntaxItem FItem; // 所属语法项 private string FBlock; // 文字块 public SyntaxItem Item { get { return FItem; } } public string Block { get { return FBlock; } } public AnalyzeReslut(SyntaxItem AItem, string ABlock) { FItem = AItem; FBlock = ABlock; } } private List FSyntaxItems = new List(); private List FAnalyzeResluts = new List(); public List SyntaxItems { get { return FSyntaxItems; } } public List AnalyzeResluts { get { return FAnalyzeResluts; } } /// /// 进行语法分析 /// /// 所分析的代码 /// 返回分析是否成功 public virtual bool Analyze(string ACode) { if (FSyntaxItems.Count <= 0) return false; if (ACode == null) return false; AnalyzeResluts.Clear(); string vCode = ACode; bool vFind = true; while (vFind && (vCode.Length > 0)) { vFind = false; foreach (SyntaxItem vSyntaxItem in FSyntaxItems) { bool reg = Regex.IsMatch(vCode, vSyntaxItem.Pattern, vSyntaxItem.Options); if (reg) { AnalyzeResluts.Add(new AnalyzeReslut(vSyntaxItem, Regex.Match(vCode, vSyntaxItem.Pattern, vSyntaxItem.Options).Value)); vCode = Regex.Replace(vCode, vSyntaxItem.Pattern, "", vSyntaxItem.Options); vFind = true; break; } } } return true; } } }