Math.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Linq.Expressions;
  6. namespace System.Linq.jvm
  7. {
  8. class Math
  9. {
  10. private static readonly Type NULLABLE_TYPE = typeof(Nullable<>);
  11. public static object Evaluate(object a, object b, Type t, ExpressionType et)
  12. {
  13. TypeCode tc = Type.GetTypeCode(t);
  14. if (tc == TypeCode.Object)
  15. {
  16. if (t.GetGenericTypeDefinition() != NULLABLE_TYPE)
  17. {
  18. throw new NotImplementedException(
  19. string.Format(
  20. "Expression with Node type {0} for type {1}",
  21. t.FullName,
  22. tc));
  23. }
  24. return EvaluateNullable(a, b, Type.GetTypeCode(t.GetGenericArguments()[0]), et);
  25. }
  26. return Evaluate(a, b, tc, et);
  27. }
  28. public static object EvaluateNullable(object a, object b, TypeCode tc, ExpressionType et)
  29. {
  30. object o = null;
  31. if (a == null || b == null)
  32. {
  33. if (tc != TypeCode.Boolean)
  34. {
  35. return null;
  36. }
  37. switch (et)
  38. {
  39. case ExpressionType.And:
  40. o = And(a, b);
  41. break;
  42. case ExpressionType.Or:
  43. o = Or(a, b);
  44. break;
  45. case ExpressionType.ExclusiveOr:
  46. o = ExclusiveOr(a, b);
  47. break;
  48. }
  49. }
  50. else
  51. {
  52. o = Evaluate(a, b, tc, et);
  53. }
  54. return Convert2Nullable(o, tc);
  55. }
  56. private static object ExclusiveOr(object a, object b)
  57. {
  58. if (a == null || b == null)
  59. {
  60. return null;
  61. }
  62. return (bool)a ^ (bool)b;
  63. }
  64. public static object Or(object a, object b)
  65. {
  66. if (a == null)
  67. {
  68. if (b == null || !((bool)b))
  69. {
  70. return null;
  71. }
  72. return true;
  73. }
  74. if (b == null)
  75. {
  76. if (a == null || !((bool)a))
  77. {
  78. return null;
  79. }
  80. return true;
  81. }
  82. return (bool)a || (bool)b;
  83. }
  84. public static object And(object a, object b)
  85. {
  86. if (a == null)
  87. {
  88. if (b == null || (bool)b)
  89. {
  90. return null;
  91. }
  92. return false;
  93. }
  94. if (b == null)
  95. {
  96. if (a == null || (bool)a)
  97. {
  98. return null;
  99. }
  100. return false;
  101. }
  102. return (bool)a && (bool)b;
  103. }
  104. private static object Convert2Nullable(object o, TypeCode tc)
  105. {
  106. if (o == null)
  107. {
  108. return null;
  109. }
  110. switch (tc)
  111. {
  112. case TypeCode.Char:
  113. return new Nullable<Char>((Char)o);
  114. case TypeCode.Byte:
  115. return new Nullable<Byte>((Byte)o);
  116. case TypeCode.Decimal:
  117. return new Nullable<Decimal>((Decimal)o);
  118. case TypeCode.Double:
  119. return new Nullable<Double>((Double)o);
  120. case TypeCode.Int16:
  121. return new Nullable<Int16>((Int16)o);
  122. case TypeCode.Int32:
  123. return new Nullable<Int32>((Int32)o);
  124. case TypeCode.Int64:
  125. return new Nullable<Int64>((Int64)o);
  126. case TypeCode.UInt16:
  127. return new Nullable<UInt16>((UInt16)o);
  128. case TypeCode.UInt32:
  129. return new Nullable<UInt32>((UInt32)o);
  130. case TypeCode.SByte:
  131. return new Nullable<SByte>((SByte)o);
  132. case TypeCode.Single:
  133. return new Nullable<Single>((Single)o);
  134. case TypeCode.Boolean:
  135. return new Nullable<Boolean>((Boolean)o);
  136. }
  137. throw new NotImplementedException(
  138. string.Format("No Convert2Nullable defined for type {0} ", tc));
  139. }
  140. public static object Evaluate(object a, object b, TypeCode tc, ExpressionType et)
  141. {
  142. switch (tc)
  143. {
  144. case TypeCode.Boolean:
  145. return Evaluate(Convert.ToBoolean(a), Convert.ToBoolean(b), et);
  146. case TypeCode.Char:
  147. return Evaluate(Convert.ToChar(a), Convert.ToChar(b), et);
  148. case TypeCode.Byte:
  149. return unchecked((Byte)Evaluate(Convert.ToByte(a), Convert.ToByte(b), et));
  150. case TypeCode.Decimal:
  151. return Evaluate(Convert.ToDecimal(a), Convert.ToDecimal(b), et);
  152. case TypeCode.Double:
  153. return Evaluate(Convert.ToDouble(a), Convert.ToDouble(b), et);
  154. case TypeCode.Int16:
  155. return unchecked((Int16)Evaluate(Convert.ToInt16(a), Convert.ToInt16(b), et));
  156. case TypeCode.Int32:
  157. return Evaluate(Convert.ToInt32(a), Convert.ToInt32(b), et);
  158. case TypeCode.Int64:
  159. return Evaluate(Convert.ToInt64(a), Convert.ToInt64(b), et);
  160. case TypeCode.UInt16:
  161. return unchecked((UInt16)Evaluate(Convert.ToUInt16(a), Convert.ToUInt16(b), et));
  162. case TypeCode.UInt32:
  163. return Evaluate(Convert.ToUInt32(a), Convert.ToUInt32(b), et);
  164. case TypeCode.UInt64:
  165. return Evaluate(Convert.ToUInt64(a), Convert.ToUInt64(b), et);
  166. case TypeCode.SByte:
  167. return unchecked((SByte)Evaluate(Convert.ToSByte(a), Convert.ToSByte(b), et));
  168. case TypeCode.Single:
  169. return Evaluate(Convert.ToSingle(a), Convert.ToSingle(b), et);
  170. }
  171. throw new NotImplementedException(
  172. string.Format("Expression with Node type {0} for type {1}", et, tc));
  173. }
  174. public static object NegeteChecked(object a, TypeCode tc)
  175. {
  176. switch (tc)
  177. {
  178. case TypeCode.Char:
  179. return checked(-Convert.ToChar(a));
  180. case TypeCode.Byte:
  181. return checked(-Convert.ToByte(a));
  182. case TypeCode.Decimal:
  183. return checked(-Convert.ToDecimal(a));
  184. case TypeCode.Double:
  185. return checked(-Convert.ToDouble(a));
  186. case TypeCode.Int16:
  187. return checked(-Convert.ToInt16(a));
  188. case TypeCode.Int32:
  189. return checked(-Convert.ToInt32(a));
  190. case TypeCode.Int64:
  191. return checked(-Convert.ToInt64(a));
  192. case TypeCode.UInt16:
  193. return checked(-Convert.ToUInt16(a));
  194. case TypeCode.UInt32:
  195. return checked(-Convert.ToUInt32(a));
  196. case TypeCode.SByte:
  197. return checked(-Convert.ToSByte(a));
  198. case TypeCode.Single:
  199. return checked(-Convert.ToSingle(a));
  200. }
  201. throw new NotImplementedException(
  202. string.Format("No NegeteChecked defined for type {0} ", tc));
  203. }
  204. public static object ConvertToTypeChecked(object a, Type fromType, Type toType)
  205. {
  206. if (Expression.IsNullable (toType) && Expression.GetNotNullableOf (toType) == fromType)
  207. return a == null ? a : Activator.CreateInstance (toType, a);
  208. if (a == null) {
  209. if (!toType.IsValueType)
  210. return a;
  211. if (Expression.IsNullable (fromType))
  212. throw new InvalidOperationException ("Nullable object must have a value");
  213. }
  214. if (IsType(toType, a)){
  215. return a;
  216. }
  217. if (Expression.IsPrimitiveConversion(fromType, toType))
  218. return Convert.ChangeType (a, toType);
  219. throw new NotImplementedException (
  220. string.Format ("No Convert defined for type {0} ", toType));
  221. }
  222. public static object ConvertToTypeUnchecked (object a, Type fromType, Type toType)
  223. {
  224. if (Expression.IsNullable (toType) && Expression.GetNotNullableOf (toType) == fromType)
  225. return a == null ? a : Activator.CreateInstance (toType, a);
  226. if (a == null) {
  227. if (!toType.IsValueType)
  228. return a;
  229. if (Expression.IsNullable (fromType))
  230. throw new InvalidOperationException ("Nullable object must have a value");
  231. }
  232. if (IsType (toType, a)) {
  233. return a;
  234. }
  235. if (Expression.IsPrimitiveConversion (fromType, toType))
  236. return Conversion.ConvertPrimitiveUnChecked (fromType, toType, a);
  237. throw new NotImplementedException (
  238. string.Format ("No Convert defined for type {0} ", toType));
  239. }
  240. public static bool IsType(Type t, Object o)
  241. {
  242. return t.IsInstanceOfType(o);
  243. }
  244. public static object Negete(object a, TypeCode tc)
  245. {
  246. switch (tc)
  247. {
  248. case TypeCode.Char:
  249. return unchecked(-Convert.ToChar(a));
  250. case TypeCode.Byte:
  251. return unchecked(-Convert.ToByte(a));
  252. case TypeCode.Decimal:
  253. return unchecked(-Convert.ToDecimal(a));
  254. case TypeCode.Double:
  255. return unchecked(-Convert.ToDouble(a));
  256. case TypeCode.Int16:
  257. return unchecked(-Convert.ToInt16(a));
  258. case TypeCode.Int32:
  259. return unchecked(-Convert.ToInt32(a));
  260. case TypeCode.Int64:
  261. return unchecked(-Convert.ToInt64(a));
  262. case TypeCode.UInt16:
  263. return unchecked(-Convert.ToUInt16(a));
  264. case TypeCode.UInt32:
  265. return unchecked(-Convert.ToUInt32(a));
  266. case TypeCode.SByte:
  267. return unchecked(-Convert.ToSByte(a));
  268. case TypeCode.Single:
  269. return unchecked(-Convert.ToSingle(a));
  270. }
  271. throw new NotImplementedException(
  272. string.Format("No Negete defined for type {0} ", tc));
  273. }
  274. public static object RightShift(object a, int n, TypeCode tc)
  275. {
  276. switch (tc)
  277. {
  278. case TypeCode.Int16:
  279. return Convert.ToInt16(a) >> n;
  280. case TypeCode.Int32:
  281. return Convert.ToInt32(a) >> n;
  282. case TypeCode.Int64:
  283. return Convert.ToInt64(a) >> n;
  284. case TypeCode.UInt16:
  285. return Convert.ToUInt16(a) >> n;
  286. case TypeCode.UInt32:
  287. return Convert.ToUInt32(a) >> n;
  288. case TypeCode.UInt64:
  289. return Convert.ToUInt64(a) >> n;
  290. }
  291. throw new NotImplementedException(
  292. string.Format("No right shift defined for type {0} ", tc));
  293. }
  294. public static object LeftShift(object a, int n, TypeCode tc)
  295. {
  296. switch (tc)
  297. {
  298. case TypeCode.Int16:
  299. return Convert.ToInt16(a) << n;
  300. case TypeCode.Int32:
  301. return Convert.ToInt32(a) << n;
  302. case TypeCode.Int64:
  303. return Convert.ToInt64(a) << n;
  304. case TypeCode.UInt16:
  305. return Convert.ToUInt16(a) << n;
  306. case TypeCode.UInt32:
  307. return Convert.ToUInt32(a) << n;
  308. case TypeCode.UInt64:
  309. return Convert.ToUInt64(a) << n;
  310. }
  311. throw new NotImplementedException(
  312. string.Format("No right shift defined for type {0} ", tc));
  313. }
  314. private static Decimal Evaluate(Decimal a, Decimal b, ExpressionType et)
  315. {
  316. switch (et)
  317. {
  318. case ExpressionType.Add:
  319. return unchecked(a + b);
  320. case ExpressionType.AddChecked:
  321. return checked(a + b);
  322. case ExpressionType.Subtract:
  323. return unchecked(a - b);
  324. case ExpressionType.SubtractChecked:
  325. return checked(a - b);
  326. case ExpressionType.Multiply:
  327. return unchecked(a * b);
  328. case ExpressionType.MultiplyChecked:
  329. return checked(a * b);
  330. case ExpressionType.Divide:
  331. return a / b;
  332. case ExpressionType.Modulo:
  333. return a % b;
  334. }
  335. throw new NotImplementedException(
  336. string.Format("Expression with Node type {0}", et));
  337. }
  338. private static Double Evaluate(Double a, Double b, ExpressionType et)
  339. {
  340. switch (et)
  341. {
  342. case ExpressionType.Add:
  343. return unchecked(a + b);
  344. case ExpressionType.AddChecked:
  345. return checked(a + b);
  346. case ExpressionType.Subtract:
  347. return unchecked(a - b);
  348. case ExpressionType.SubtractChecked:
  349. return checked(a - b);
  350. case ExpressionType.Multiply:
  351. return unchecked(a * b);
  352. case ExpressionType.MultiplyChecked:
  353. return checked(a * b);
  354. case ExpressionType.Divide:
  355. return a / b;
  356. case ExpressionType.Modulo:
  357. return a % b;
  358. case ExpressionType.Power:
  359. return System.Math.Pow(a, b);
  360. }
  361. throw new NotImplementedException(
  362. string.Format("Expression with Node type {0}", et));
  363. }
  364. private static Int32 Evaluate(Int16 a, Int16 b, ExpressionType et)
  365. {
  366. switch (et)
  367. {
  368. case ExpressionType.Add:
  369. return unchecked(a + b);
  370. case ExpressionType.AddChecked:
  371. return checked(a + b);
  372. case ExpressionType.Subtract:
  373. return unchecked(a - b);
  374. case ExpressionType.SubtractChecked:
  375. return checked(a - b);
  376. case ExpressionType.Multiply:
  377. return unchecked(a * b);
  378. case ExpressionType.MultiplyChecked:
  379. return checked(a * b);
  380. case ExpressionType.Divide:
  381. return a / b;
  382. case ExpressionType.Modulo:
  383. return a % b;
  384. case ExpressionType.ExclusiveOr:
  385. return a ^ b;
  386. case ExpressionType.And:
  387. return a & b;
  388. case ExpressionType.Or:
  389. return a | b;
  390. }
  391. throw new NotImplementedException(
  392. string.Format("Expression with Node type {0}", et));
  393. }
  394. private static Int32 Evaluate(Int32 a, Int32 b, ExpressionType et)
  395. {
  396. switch (et)
  397. {
  398. case ExpressionType.Add:
  399. return unchecked(a + b);
  400. case ExpressionType.AddChecked:
  401. return checked(a + b);
  402. case ExpressionType.Subtract:
  403. return unchecked(a - b);
  404. case ExpressionType.SubtractChecked:
  405. return checked(a - b);
  406. case ExpressionType.Multiply:
  407. return unchecked(a * b);
  408. case ExpressionType.MultiplyChecked:
  409. return checked(a * b);
  410. case ExpressionType.Divide:
  411. return a / b;
  412. case ExpressionType.Modulo:
  413. return a % b;
  414. case ExpressionType.ExclusiveOr:
  415. return a ^ b;
  416. case ExpressionType.And:
  417. return a & b;
  418. case ExpressionType.Or:
  419. return a | b;
  420. }
  421. throw new NotImplementedException(
  422. string.Format("Expression with Node type {0}", et));
  423. }
  424. private static Int64 Evaluate(Int64 a, Int64 b, ExpressionType et)
  425. {
  426. switch (et)
  427. {
  428. case ExpressionType.Add:
  429. return unchecked(a + b);
  430. case ExpressionType.AddChecked:
  431. return checked(a + b);
  432. case ExpressionType.Subtract:
  433. return unchecked(a - b);
  434. case ExpressionType.SubtractChecked:
  435. return checked(a - b);
  436. case ExpressionType.Multiply:
  437. return unchecked(a * b);
  438. case ExpressionType.MultiplyChecked:
  439. return checked(a * b);
  440. case ExpressionType.Divide:
  441. return a / b;
  442. case ExpressionType.Modulo:
  443. return a % b;
  444. case ExpressionType.ExclusiveOr:
  445. return a ^ b;
  446. case ExpressionType.And:
  447. return a & b;
  448. case ExpressionType.Or:
  449. return a | b;
  450. }
  451. throw new NotImplementedException(
  452. string.Format("Expression with Node type {0}", et));
  453. }
  454. private static Int32 Evaluate(UInt16 a, UInt16 b, ExpressionType et)
  455. {
  456. switch (et)
  457. {
  458. case ExpressionType.Add:
  459. return unchecked(a + b);
  460. case ExpressionType.AddChecked:
  461. return checked(a + b);
  462. case ExpressionType.Subtract:
  463. return unchecked(a - b);
  464. case ExpressionType.SubtractChecked:
  465. return checked((UInt16)(a - b));
  466. case ExpressionType.Multiply:
  467. return unchecked(a * b);
  468. case ExpressionType.MultiplyChecked:
  469. return checked(a * b);
  470. case ExpressionType.Divide:
  471. return a / b;
  472. case ExpressionType.Modulo:
  473. return a % b;
  474. case ExpressionType.ExclusiveOr:
  475. return a ^ b;
  476. case ExpressionType.And:
  477. return a & b;
  478. case ExpressionType.Or:
  479. return a | b;
  480. }
  481. throw new NotImplementedException(
  482. string.Format("Expression with Node type {0}", et));
  483. }
  484. private static UInt32 Evaluate(UInt32 a, UInt32 b, ExpressionType et)
  485. {
  486. switch (et)
  487. {
  488. case ExpressionType.Add:
  489. return unchecked(a + b);
  490. case ExpressionType.AddChecked:
  491. return checked(a + b);
  492. case ExpressionType.Subtract:
  493. return unchecked(a - b);
  494. case ExpressionType.SubtractChecked:
  495. return checked(a - b);
  496. case ExpressionType.Multiply:
  497. return unchecked(a * b);
  498. case ExpressionType.MultiplyChecked:
  499. return checked(a * b);
  500. case ExpressionType.Divide:
  501. return a / b;
  502. case ExpressionType.Modulo:
  503. return a % b;
  504. case ExpressionType.ExclusiveOr:
  505. return a ^ b;
  506. case ExpressionType.And:
  507. return a & b;
  508. case ExpressionType.Or:
  509. return a | b;
  510. }
  511. throw new NotImplementedException(
  512. string.Format("Expression with Node type {0}", et));
  513. }
  514. private static UInt64 Evaluate(UInt64 a, UInt64 b, ExpressionType et)
  515. {
  516. switch (et)
  517. {
  518. case ExpressionType.Add:
  519. return unchecked(a + b);
  520. case ExpressionType.AddChecked:
  521. return checked(a + b);
  522. case ExpressionType.Subtract:
  523. return unchecked(a - b);
  524. case ExpressionType.SubtractChecked:
  525. return checked(a - b);
  526. case ExpressionType.Multiply:
  527. return unchecked(a * b);
  528. case ExpressionType.MultiplyChecked:
  529. return checked(a * b);
  530. case ExpressionType.Divide:
  531. return a / b;
  532. case ExpressionType.Modulo:
  533. return a % b;
  534. case ExpressionType.ExclusiveOr:
  535. return a ^ b;
  536. case ExpressionType.And:
  537. return a & b;
  538. case ExpressionType.Or:
  539. return a | b;
  540. }
  541. throw new NotImplementedException(
  542. string.Format("Expression with Node type {0}", et));
  543. }
  544. private static object Evaluate(Char a, Char b, ExpressionType et)
  545. {
  546. switch (et)
  547. {
  548. case ExpressionType.ExclusiveOr:
  549. return a ^ b;
  550. case ExpressionType.And:
  551. return a & b;
  552. case ExpressionType.Or:
  553. return a | b;
  554. }
  555. throw new NotImplementedException(
  556. string.Format("Expression with Node type {0}", et));
  557. }
  558. private static Int32 Evaluate(SByte a, SByte b, ExpressionType et)
  559. {
  560. switch (et)
  561. {
  562. case ExpressionType.Add:
  563. return unchecked(a + b);
  564. case ExpressionType.AddChecked:
  565. return checked(a + b);
  566. case ExpressionType.Subtract:
  567. return unchecked(a - b);
  568. case ExpressionType.SubtractChecked:
  569. return checked(a - b);
  570. case ExpressionType.Multiply:
  571. return unchecked(a * b);
  572. case ExpressionType.MultiplyChecked:
  573. return checked(a * b);
  574. case ExpressionType.Divide:
  575. return a / b;
  576. case ExpressionType.Modulo:
  577. return a % b;
  578. case ExpressionType.ExclusiveOr:
  579. return a ^ b;
  580. case ExpressionType.And:
  581. return a & b;
  582. case ExpressionType.Or:
  583. return a | b;
  584. }
  585. throw new NotImplementedException(
  586. string.Format("Expression with Node type {0}", et));
  587. }
  588. private static Int32 Evaluate(Byte a, Byte b, ExpressionType et)
  589. {
  590. switch (et)
  591. {
  592. case ExpressionType.Add:
  593. return unchecked(a + b);
  594. case ExpressionType.AddChecked:
  595. return checked(a + b);
  596. case ExpressionType.Subtract:
  597. return unchecked(a - b);
  598. case ExpressionType.SubtractChecked:
  599. return checked(a - b);
  600. case ExpressionType.Multiply:
  601. return unchecked(a * b);
  602. case ExpressionType.MultiplyChecked:
  603. return checked(a * b);
  604. case ExpressionType.Divide:
  605. return a / b;
  606. case ExpressionType.Modulo:
  607. return a % b;
  608. case ExpressionType.ExclusiveOr:
  609. return a ^ b;
  610. case ExpressionType.And:
  611. return a & b;
  612. case ExpressionType.Or:
  613. return a | b;
  614. }
  615. throw new NotImplementedException(
  616. string.Format("Expression with Node type {0}", et));
  617. }
  618. private static Single Evaluate(Single a, Single b, ExpressionType et)
  619. {
  620. switch (et)
  621. {
  622. case ExpressionType.Add:
  623. return unchecked(a + b);
  624. case ExpressionType.AddChecked:
  625. return checked(a + b);
  626. case ExpressionType.Subtract:
  627. return unchecked(a - b);
  628. case ExpressionType.SubtractChecked:
  629. return checked(a - b);
  630. case ExpressionType.Multiply:
  631. return unchecked(a * b);
  632. case ExpressionType.MultiplyChecked:
  633. return checked(a * b);
  634. case ExpressionType.Divide:
  635. return a / b;
  636. case ExpressionType.Modulo:
  637. return a % b;
  638. }
  639. throw new NotImplementedException(
  640. string.Format("Expression with Node type {0}", et));
  641. }
  642. private static bool Evaluate(bool a, bool b, ExpressionType et)
  643. {
  644. switch (et)
  645. {
  646. case ExpressionType.ExclusiveOr:
  647. return a ^ b;
  648. case ExpressionType.And:
  649. return a & b;
  650. case ExpressionType.Or:
  651. return a | b;
  652. }
  653. throw new NotImplementedException(
  654. string.Format("Expression with Node type {0}", et));
  655. }
  656. }
  657. }