1+ namespace StringMath . Expressions ;
2+
3+ public static class Factory
4+ {
5+ public delegate Expr BinaryExprFactory ( Expr left , string op , Expr right ) ;
6+ public delegate Expr UnaryExprFactory ( string op , Expr operand ) ;
7+
8+ public static BinaryExprFactory BinaryExpr = ( left , op , right ) => op switch
9+ {
10+ "+" => new Sum ( left , right ) ,
11+ "-" => new Diff ( left , right ) ,
12+ "/" => new Div ( left , right ) ,
13+ "*" => new Mul ( left , right ) ,
14+ "^" => new Pow ( left , right ) ,
15+ "%" => new Mod ( left , right ) ,
16+ "log" => new Log ( left , right ) ,
17+ _ => new Binary ( left , op , right ) ,
18+ } ;
19+
20+ public static UnaryExprFactory UnaryExpr = ( op , operand ) => op switch
21+ {
22+ "-" => new Neg ( operand ) ,
23+ "!" => new Factorial ( operand ) ,
24+ "sin" => new Sin ( operand ) ,
25+ "cos" => new Cos ( operand ) ,
26+ "abs" => new Abs ( operand ) ,
27+ "tan" => new Tan ( operand ) ,
28+ "atan" => new Atan ( operand ) ,
29+ "sqrt" => new Sqrt ( operand ) ,
30+ "exp" => new Exp ( operand ) ,
31+ _ => new Unary ( operand , op )
32+ } ;
33+ }
34+
35+ internal static partial class ExprConversion
36+ {
37+ public static Expr Convert ( IExpression expression )
38+ {
39+ Expr result = expression switch
40+ {
41+ BinaryExpression binaryExpr => ConvertBinaryExpr ( binaryExpr ) ,
42+ ConstantExpression constantExpr => ConvertConstantExpr ( constantExpr ) ,
43+ UnaryExpression unaryExpr => ConvertUnaryExpr ( unaryExpr ) ,
44+ VariableExpression variableExpr => ConvertVariableExpr ( variableExpr ) ,
45+ _ => throw new NotImplementedException ( $ "'{ expression . Type } ' Convertor is not implemented.")
46+ } ;
47+
48+ return result ;
49+ }
50+
51+ public static Expr ConvertVariableExpr ( VariableExpression variableExpr ) => new Variable ( variableExpr . Name ) ;
52+
53+ public static Expr ConvertConstantExpr ( ConstantExpression constantExpr ) => new Number ( constantExpr . Value ) ;
54+
55+ public static Expr ConvertBinaryExpr ( BinaryExpression binaryExpr )
56+ {
57+ Expr left = Convert ( binaryExpr . Left ) ;
58+ Expr right = Convert ( binaryExpr . Right ) ;
59+
60+ return Factory . BinaryExpr ( left , binaryExpr . OperatorName , right ) ;
61+ }
62+
63+ public static Expr ConvertUnaryExpr ( UnaryExpression unaryExpr )
64+ {
65+ Expr operand = Convert ( unaryExpr . Operand ) ;
66+ return Factory . UnaryExpr ( unaryExpr . OperatorName , operand ) ;
67+ }
68+ }
69+
70+ internal partial class ExprConversion
71+ {
72+ public static IExpression Convert ( Expr expression )
73+ {
74+ IExpression result = expression switch
75+ {
76+ Binary binaryExpr => ConvertBinaryExpr ( binaryExpr ) ,
77+ Number constantExpr => ConvertConstantExpr ( constantExpr ) ,
78+ Unary unaryExpr => ConvertUnaryExpr ( unaryExpr ) ,
79+ Variable variableExpr => ConvertVariableExpr ( variableExpr ) ,
80+ _ => throw new NotImplementedException ( $ "'{ expression ? . GetType ( ) . Name } ' Convertor is not implemented.")
81+ } ;
82+
83+ return result ;
84+ }
85+
86+ public static IExpression ConvertVariableExpr ( Variable variableExpr ) => new VariableExpression ( variableExpr . Name ) ;
87+
88+ public static IExpression ConvertConstantExpr ( Number constantExpr ) => new ConstantExpression ( constantExpr . Value ) ;
89+
90+ public static IExpression ConvertBinaryExpr ( Binary binaryExpr ) => new BinaryExpression ( Convert ( binaryExpr . Left ) , binaryExpr . Op , Convert ( binaryExpr . Right ) ) ;
91+
92+ public static IExpression ConvertUnaryExpr ( Unary unaryExpr ) => new UnaryExpression ( unaryExpr . Op , Convert ( unaryExpr . Value ) ) ;
93+ }
0 commit comments