private ExpressionSingleNode Evaluate(ExpressionSingleNode node)
 {
     if (node != null)
     {
         if (node is ExpressionTripletNode)
         {
             var triplet = node as ExpressionTripletNode;
             triplet.First = Evaluate(triplet.First);
             triplet.Second = Evaluate(triplet.Second);
         }
         else if (node.Value is ExpressionSingleNode)
             node.Value = Evaluate((ExpressionSingleNode) node.Value);
         else if (node.Value != null && node.Contains(FullKey))
             node.Value = KeyValue ?? string.Empty;
     }
     return node;
 }
 public static List<object> ExtractValue(ExpressionSingleNode node)
 {
     List<object> values = new List<object>();
     if (node != null)
     {
         values.Add(node.Name);
         if (node is ExpressionTripletNode)
         {
             var triplet = node as ExpressionTripletNode;
             values.AddRange(ExtractValue(triplet.First));
             values.AddRange(ExtractValue(triplet.Second));
         }
         else if (node.Value is ExpressionSingleNode)
             values.AddRange(ExtractValue((ExpressionSingleNode) node.Value));
         else if (node.Value != null)
             values.Add(node.Value);
     }
     return values;
 }