A game about forced loneliness, made by TACStudios
1using System.Globalization; 2using System.Text; 3 4namespace Unity.VisualScripting.Dependencies.NCalc 5{ 6 public class SerializationVisitor : LogicalExpressionVisitor 7 { 8 public SerializationVisitor() 9 { 10 Result = new StringBuilder(); 11 _numberFormatInfo = new NumberFormatInfo { NumberDecimalSeparator = "." }; 12 } 13 14 private readonly NumberFormatInfo _numberFormatInfo; 15 16 public StringBuilder Result { get; protected set; } 17 18 public override void Visit(TernaryExpression ternary) 19 { 20 EncapsulateNoValue(ternary.LeftExpression); 21 22 Result.Append("? "); 23 24 EncapsulateNoValue(ternary.MiddleExpression); 25 26 Result.Append(": "); 27 28 EncapsulateNoValue(ternary.RightExpression); 29 } 30 31 public override void Visit(BinaryExpression binary) 32 { 33 EncapsulateNoValue(binary.LeftExpression); 34 35 switch (binary.Type) 36 { 37 case BinaryExpressionType.And: 38 Result.Append("and "); 39 break; 40 41 case BinaryExpressionType.Or: 42 Result.Append("or "); 43 break; 44 45 case BinaryExpressionType.Div: 46 Result.Append("/ "); 47 break; 48 49 case BinaryExpressionType.Equal: 50 Result.Append("= "); 51 break; 52 53 case BinaryExpressionType.Greater: 54 Result.Append("> "); 55 break; 56 57 case BinaryExpressionType.GreaterOrEqual: 58 Result.Append(">= "); 59 break; 60 61 case BinaryExpressionType.Lesser: 62 Result.Append("< "); 63 break; 64 65 case BinaryExpressionType.LesserOrEqual: 66 Result.Append("<= "); 67 break; 68 69 case BinaryExpressionType.Minus: 70 Result.Append("- "); 71 break; 72 73 case BinaryExpressionType.Modulo: 74 Result.Append("% "); 75 break; 76 77 case BinaryExpressionType.NotEqual: 78 Result.Append("!= "); 79 break; 80 81 case BinaryExpressionType.Plus: 82 Result.Append("+ "); 83 break; 84 85 case BinaryExpressionType.Times: 86 Result.Append("* "); 87 break; 88 89 case BinaryExpressionType.BitwiseAnd: 90 Result.Append("& "); 91 break; 92 93 case BinaryExpressionType.BitwiseOr: 94 Result.Append("| "); 95 break; 96 97 case BinaryExpressionType.BitwiseXOr: 98 Result.Append("~ "); 99 break; 100 101 case BinaryExpressionType.LeftShift: 102 Result.Append("<< "); 103 break; 104 105 case BinaryExpressionType.RightShift: 106 Result.Append(">> "); 107 break; 108 } 109 110 EncapsulateNoValue(binary.RightExpression); 111 } 112 113 public override void Visit(UnaryExpression unary) 114 { 115 switch (unary.Type) 116 { 117 case UnaryExpressionType.Not: 118 Result.Append("!"); 119 break; 120 121 case UnaryExpressionType.Negate: 122 Result.Append("-"); 123 break; 124 125 case UnaryExpressionType.BitwiseNot: 126 Result.Append("~"); 127 break; 128 } 129 130 EncapsulateNoValue(unary.Expression); 131 } 132 133 public override void Visit(ValueExpression value) 134 { 135 switch (value.Type) 136 { 137 case ValueType.Boolean: 138 Result.Append(value.Value).Append(" "); 139 break; 140 141 case ValueType.DateTime: 142 Result.Append("#").Append(value.Value).Append("#").Append(" "); 143 break; 144 145 case ValueType.Float: 146 Result.Append(decimal.Parse(value.Value.ToString()).ToString(_numberFormatInfo)).Append(" "); 147 break; 148 149 case ValueType.Integer: 150 Result.Append(value.Value).Append(" "); 151 break; 152 153 case ValueType.String: 154 Result.Append("'").Append(value.Value).Append("'").Append(" "); 155 break; 156 } 157 } 158 159 public override void Visit(FunctionExpression function) 160 { 161 Result.Append(function.Identifier.Name); 162 163 Result.Append("("); 164 165 for (var i = 0; i < function.Expressions.Length; i++) 166 { 167 function.Expressions[i].Accept(this); 168 169 if (i < function.Expressions.Length - 1) 170 { 171 Result.Remove(Result.Length - 1, 1); 172 Result.Append(", "); 173 } 174 } 175 176 // Trim spaces before adding a closing parenthesis 177 while (Result[Result.Length - 1] == ' ') 178 { 179 Result.Remove(Result.Length - 1, 1); 180 } 181 182 Result.Append(") "); 183 } 184 185 public override void Visit(IdentifierExpression identifier) 186 { 187 Result.Append("[").Append(identifier.Name).Append("] "); 188 } 189 190 protected void EncapsulateNoValue(LogicalExpression expression) 191 { 192 if (expression is ValueExpression) 193 { 194 expression.Accept(this); 195 } 196 else 197 { 198 Result.Append("("); 199 expression.Accept(this); 200 201 // Trim spaces before adding a closing parenthesis 202 while (Result[Result.Length - 1] == ' ') 203 { 204 Result.Remove(Result.Length - 1, 1); 205 } 206 207 Result.Append(") "); 208 } 209 } 210 } 211}