Я думаю, что понял ваше требование, но не совсем уверен.
У вас есть выражения в префиксной нотации, поэтому это в основном загрузка префиксного выражения, которое есть в вашем файле дампа, в двоичном дереве.
Вот псевдокод, описывающий процесс загрузки выражений в дерево.
tree_node make_tree (string dump)
{
tok1 = get_tok (dump);
tok2 = get_tok (dump);
tok3 = get_tok (dump);
if (tok1 == operand)
{
node = make_new_node_with (tok1);
return node;
}
node = make_new_node_with (tok1);
node->left = make_tree (tok2);
node->right = make_tree (tok3);
return node;
}
Рекурсивный вызов 1 с (AndExp TVal(OrExp FValTVal))
tok1 = AndExp
делает новый узел1
tok2 = TVal
tok3 = (OrExp FValTVal)
Рекурсивный вызов 2 с TVal
возвращает node2 к вызову 1 , который связывает его с левым указателем node1.
Рекурсивный вызов 3 с (OrExp FValTVal)
из вызова 1.
tok1 = ORExp
делает новый узел3
tok2 = FVal
tok3 = TVal
Рекурсивный вызов 3 с FVal
и вызов 4 с TVal
соответственно возвращает node4 и node5 со значениями операндов, которые связаны слева и справа ссылки узла 3 из звонка 3.
Больше не нужно рассматривать подвыражение, рекурсия возвращается к исходной точке. У вас есть корень дерева.
( node1 )
|AndExp |
+---+---+
|
+------------+------------+
| |
( node2 ) ( node3 )
| TVal | | ORExp |
+---+---+ +---+---+
|
+-----------+-----------+
| |
( node4 ) ( node5 )
| FVal | | TVal |
+---+---+ +---+---+
Если имеется более двух операндов, обработку можно выполнить аналогичным образом, добавив дополнительные ссылки на узлы дерева.
Для каждого выражения в вашем файле дампа, которые разделены запятыми, будут иметь отдельные деревья, которые после создания могут быть пройдены.