它看起來像您需要的表單的數據結構:
public class SNode
{
public String Name { get; set; }
private readonly List<SNode> _Nodes = new List<SNode>();
public ICollection<SNode> Nodes { get { return _Nodes; } }
}
形式
public String Serialize(SNode root)
{
var sb = new StringBuilder();
Serialize(root, sb);
return sb.ToString();
}
private void Serialize(SNode node, StringBuilder sb)
{
sb.Append('(');
sb.Append(node.Name);
foreach (var item in node.Nodes)
Serialize(item, sb);
sb.Append(")");
}
和t的解串器的串行化他的形式:
public SNode Deserialize(String st)
{
if (String.IsNullOrWhiteSpace(st))
return null;
var node = new SNode();
var nodesPos = String.IndexOf('(');
var endPos = String.LastIndexOf(')');
var childrenString = st.SubString(nodesPos, endPos - nodesPos);
node.Name = st.SubString(1, (nodesPos >= 0 ? nodePos : endPos)).TrimEnd();
var childStrings = new List<string>();
int brackets = 0;
int startPos = nodesPos;
for (int pos = nodesPos; pos++; pos < endPos)
{
if (st[pos] == '(')
brackets++;
else if (st[pos] == ')')
{
brackets--;
if (brackets == 0)
{
childStrings.Add(st.SubString(startPos, pos - startPos + 1));
startPos = pos + 1;
}
}
}
foreach (var child in childStrings)
{
var childNode = Deserialize(this, child);
if (childNode != null)
node.Nodes.Add(childNode);
}
return node;
}
如果還沒有測試甚至編譯這段代碼,但是,這或多或少是如何工作的。
丹尼,感謝您的編輯(儘管我不確定爲什麼圖像是相關的,我相信,因爲您有更多的經驗)。我在你的描述中看到你知道LISP和.NET,並且我會喜歡你的建議。 –
您的意思是(de)序列化已經以* [TOP [S [S [NP [PRP I]] [VP [VBD ran] [PP [IN into] [NP [NNP Joe] [CC and] [NNP Jill]]]]] [CC and] [S [ADVP [RB then]] [NP [PRP we]] [VP [VBD去] [NP [NN購物]]]]]] *或者你是指到輸入表達式? –
我希望能夠(通常)序列化s表達式,在這種情況下,是的,我想能夠反序列化上述表達式(以及,替換(for [和] for)) –