暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

LogicalExpression.cs 8.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. using System;
  2. using System.Text;
  3. namespace Unity.VisualScripting.Dependencies.NCalc
  4. {
  5. public abstract class LogicalExpression
  6. {
  7. public BinaryExpression And(LogicalExpression operand)
  8. {
  9. return new BinaryExpression(BinaryExpressionType.And, this, operand);
  10. }
  11. public BinaryExpression And(object operand)
  12. {
  13. return new BinaryExpression(BinaryExpressionType.And, this, new ValueExpression(operand));
  14. }
  15. public BinaryExpression DividedBy(LogicalExpression operand)
  16. {
  17. return new BinaryExpression(BinaryExpressionType.Div, this, operand);
  18. }
  19. public BinaryExpression DividedBy(object operand)
  20. {
  21. return new BinaryExpression(BinaryExpressionType.Div, this, new ValueExpression(operand));
  22. }
  23. public BinaryExpression EqualsTo(LogicalExpression operand)
  24. {
  25. return new BinaryExpression(BinaryExpressionType.Equal, this, operand);
  26. }
  27. public BinaryExpression EqualsTo(object operand)
  28. {
  29. return new BinaryExpression(BinaryExpressionType.Equal, this, new ValueExpression(operand));
  30. }
  31. public BinaryExpression GreaterThan(LogicalExpression operand)
  32. {
  33. return new BinaryExpression(BinaryExpressionType.Greater, this, operand);
  34. }
  35. public BinaryExpression GreaterThan(object operand)
  36. {
  37. return new BinaryExpression(BinaryExpressionType.Greater, this, new ValueExpression(operand));
  38. }
  39. public BinaryExpression GreaterOrEqualThan(LogicalExpression operand)
  40. {
  41. return new BinaryExpression(BinaryExpressionType.GreaterOrEqual, this, operand);
  42. }
  43. public BinaryExpression GreaterOrEqualThan(object operand)
  44. {
  45. return new BinaryExpression(BinaryExpressionType.GreaterOrEqual, this, new ValueExpression(operand));
  46. }
  47. public BinaryExpression LesserThan(LogicalExpression operand)
  48. {
  49. return new BinaryExpression(BinaryExpressionType.Lesser, this, operand);
  50. }
  51. public BinaryExpression LesserThan(object operand)
  52. {
  53. return new BinaryExpression(BinaryExpressionType.Lesser, this, new ValueExpression(operand));
  54. }
  55. public BinaryExpression LesserOrEqualThan(LogicalExpression operand)
  56. {
  57. return new BinaryExpression(BinaryExpressionType.LesserOrEqual, this, operand);
  58. }
  59. public BinaryExpression LesserOrEqualThan(object operand)
  60. {
  61. return new BinaryExpression(BinaryExpressionType.LesserOrEqual, this, new ValueExpression(operand));
  62. }
  63. public BinaryExpression Minus(LogicalExpression operand)
  64. {
  65. return new BinaryExpression(BinaryExpressionType.Minus, this, operand);
  66. }
  67. public BinaryExpression Minus(object operand)
  68. {
  69. return new BinaryExpression(BinaryExpressionType.Minus, this, new ValueExpression(operand));
  70. }
  71. public BinaryExpression Modulo(LogicalExpression operand)
  72. {
  73. return new BinaryExpression(BinaryExpressionType.Modulo, this, operand);
  74. }
  75. public BinaryExpression Modulo(object operand)
  76. {
  77. return new BinaryExpression(BinaryExpressionType.Modulo, this, new ValueExpression(operand));
  78. }
  79. public BinaryExpression NotEqual(LogicalExpression operand)
  80. {
  81. return new BinaryExpression(BinaryExpressionType.NotEqual, this, operand);
  82. }
  83. public BinaryExpression NotEqual(object operand)
  84. {
  85. return new BinaryExpression(BinaryExpressionType.NotEqual, this, new ValueExpression(operand));
  86. }
  87. public BinaryExpression Or(LogicalExpression operand)
  88. {
  89. return new BinaryExpression(BinaryExpressionType.Or, this, operand);
  90. }
  91. public BinaryExpression Or(object operand)
  92. {
  93. return new BinaryExpression(BinaryExpressionType.Or, this, new ValueExpression(operand));
  94. }
  95. public BinaryExpression Plus(LogicalExpression operand)
  96. {
  97. return new BinaryExpression(BinaryExpressionType.Plus, this, operand);
  98. }
  99. public BinaryExpression Plus(object operand)
  100. {
  101. return new BinaryExpression(BinaryExpressionType.Plus, this, new ValueExpression(operand));
  102. }
  103. public BinaryExpression Mult(LogicalExpression operand)
  104. {
  105. return new BinaryExpression(BinaryExpressionType.Times, this, operand);
  106. }
  107. public BinaryExpression Mult(object operand)
  108. {
  109. return new BinaryExpression(BinaryExpressionType.Times, this, new ValueExpression(operand));
  110. }
  111. public BinaryExpression BitwiseOr(LogicalExpression operand)
  112. {
  113. return new BinaryExpression(BinaryExpressionType.BitwiseOr, this, operand);
  114. }
  115. public BinaryExpression BitwiseOr(object operand)
  116. {
  117. return new BinaryExpression(BinaryExpressionType.BitwiseOr, this, new ValueExpression(operand));
  118. }
  119. public BinaryExpression BitwiseAnd(LogicalExpression operand)
  120. {
  121. return new BinaryExpression(BinaryExpressionType.BitwiseAnd, this, operand);
  122. }
  123. public BinaryExpression BitwiseAnd(object operand)
  124. {
  125. return new BinaryExpression(BinaryExpressionType.BitwiseAnd, this, new ValueExpression(operand));
  126. }
  127. public BinaryExpression BitwiseXOr(LogicalExpression operand)
  128. {
  129. return new BinaryExpression(BinaryExpressionType.BitwiseXOr, this, operand);
  130. }
  131. public BinaryExpression BitwiseXOr(object operand)
  132. {
  133. return new BinaryExpression(BinaryExpressionType.BitwiseXOr, this, new ValueExpression(operand));
  134. }
  135. public BinaryExpression LeftShift(LogicalExpression operand)
  136. {
  137. return new BinaryExpression(BinaryExpressionType.LeftShift, this, operand);
  138. }
  139. public BinaryExpression LeftShift(object operand)
  140. {
  141. return new BinaryExpression(BinaryExpressionType.LeftShift, this, new ValueExpression(operand));
  142. }
  143. public BinaryExpression RightShift(LogicalExpression operand)
  144. {
  145. return new BinaryExpression(BinaryExpressionType.RightShift, this, operand);
  146. }
  147. public BinaryExpression RightShift(object operand)
  148. {
  149. return new BinaryExpression(BinaryExpressionType.RightShift, this, new ValueExpression(operand));
  150. }
  151. public override string ToString()
  152. {
  153. var serializer = new SerializationVisitor();
  154. Accept(serializer);
  155. return serializer.Result.ToString().TrimEnd(' ');
  156. }
  157. // This method is not just syntactic sugar.
  158. // It chooses the proper overload of Visit() based on the current type.
  159. public virtual void Accept(LogicalExpressionVisitor visitor)
  160. {
  161. throw new NotImplementedException();
  162. }
  163. private const char BS = '\\';
  164. private static string ExtractString(string text)
  165. {
  166. var sb = new StringBuilder(text);
  167. var startIndex = 1; // Skip initial quote
  168. var slashIndex = -1;
  169. while ((slashIndex = sb.ToString().IndexOf(BS, startIndex)) != -1)
  170. {
  171. var escapeType = sb[slashIndex + 1];
  172. switch (escapeType)
  173. {
  174. case 'u':
  175. var hcode = String.Concat(sb[slashIndex + 4], sb[slashIndex + 5]);
  176. var lcode = String.Concat(sb[slashIndex + 2], sb[slashIndex + 3]);
  177. var unicodeChar = Encoding.Unicode.GetChars(new[] { Convert.ToByte(hcode, 16), Convert.ToByte(lcode, 16) })[0];
  178. sb.Remove(slashIndex, 6).Insert(slashIndex, unicodeChar);
  179. break;
  180. case 'n':
  181. sb.Remove(slashIndex, 2).Insert(slashIndex, '\n');
  182. break;
  183. case 'r':
  184. sb.Remove(slashIndex, 2).Insert(slashIndex, '\r');
  185. break;
  186. case 't':
  187. sb.Remove(slashIndex, 2).Insert(slashIndex, '\t');
  188. break;
  189. case '\'':
  190. sb.Remove(slashIndex, 2).Insert(slashIndex, '\'');
  191. break;
  192. case '\\':
  193. sb.Remove(slashIndex, 2).Insert(slashIndex, '\\');
  194. break;
  195. default:
  196. throw new ApplicationException("Unvalid escape sequence: \\" + escapeType);
  197. }
  198. startIndex = slashIndex + 1;
  199. }
  200. sb.Remove(0, 1);
  201. sb.Remove(sb.Length - 1, 1);
  202. return sb.ToString();
  203. }
  204. }
  205. }