SyntaxEngine.cs 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. namespace Core.StlMes
  7. {
  8. /// <summary>
  9. /// 语法分析基类
  10. /// </summary>
  11. public class SyntaxEngine
  12. {
  13. /// <summary>
  14. /// 语法项
  15. /// </summary>
  16. public class SyntaxItem
  17. {
  18. private string FPattern; // 正则表达式
  19. private RegexOptions FOptions; // 正则表达式附加选项
  20. private string FName; // 语法名称
  21. private int FIndex; // 序号
  22. public string Pattern { get { return FPattern; } } // 正则表达式
  23. public RegexOptions Options { get { return FOptions; } } // 正则表达式附加选项
  24. public string Name { get { return FName; } } // 名称
  25. public int Index { get { return FIndex; } } // 序号
  26. public SyntaxItem(string APattern, RegexOptions AOptions,
  27. string AName, int AIndex)
  28. {
  29. FPattern = APattern;
  30. FOptions = AOptions;
  31. FName = AName;
  32. FIndex = AIndex;
  33. }
  34. }
  35. /// <summary>
  36. /// 语法分析返回项
  37. /// </summary>
  38. public class AnalyzeReslut
  39. {
  40. private SyntaxItem FItem; // 所属语法项
  41. private string FBlock; // 文字块
  42. public SyntaxItem Item { get { return FItem; } }
  43. public string Block { get { return FBlock; } }
  44. public AnalyzeReslut(SyntaxItem AItem, string ABlock)
  45. {
  46. FItem = AItem;
  47. FBlock = ABlock;
  48. }
  49. }
  50. private List<SyntaxItem> FSyntaxItems = new List<SyntaxItem>();
  51. private List<AnalyzeReslut> FAnalyzeResluts = new List<AnalyzeReslut>();
  52. public List<SyntaxItem> SyntaxItems { get { return FSyntaxItems; } }
  53. public List<AnalyzeReslut> AnalyzeResluts { get { return FAnalyzeResluts; } }
  54. /// <summary>
  55. /// 进行语法分析
  56. /// </summary>
  57. /// <param name="ACode">所分析的代码</param>
  58. /// <returns>返回分析是否成功</returns>
  59. public virtual bool Analyze(string ACode)
  60. {
  61. if (FSyntaxItems.Count <= 0)
  62. return false;
  63. if (ACode == null)
  64. return false;
  65. AnalyzeResluts.Clear();
  66. string vCode = ACode;
  67. bool vFind = true;
  68. while (vFind && (vCode.Length > 0))
  69. {
  70. vFind = false;
  71. foreach (SyntaxItem vSyntaxItem in FSyntaxItems)
  72. {
  73. bool reg = Regex.IsMatch(vCode, vSyntaxItem.Pattern, vSyntaxItem.Options);
  74. if (reg)
  75. {
  76. AnalyzeResluts.Add(new AnalyzeReslut(vSyntaxItem,
  77. Regex.Match(vCode, vSyntaxItem.Pattern,
  78. vSyntaxItem.Options).Value));
  79. vCode = Regex.Replace(vCode, vSyntaxItem.Pattern, "",
  80. vSyntaxItem.Options);
  81. vFind = true;
  82. break;
  83. }
  84. }
  85. }
  86. return true;
  87. }
  88. }
  89. }