Вы должны фактически скомпилировать или интерпретировать его в соответствии с тем, что вам нужно ..
Для калькулятора вам просто нужно рекурсивно посетить дерево и оценить проанализированное дерево, в то время как с более сложным языком вам придетсяпереведите его на промежуточный язык, который похож на ассемблер, но сохраняет абстракцию от базовой архитектуры.
Конечно, вы можете разработать свою собственную простую виртуальную машину, которая может выполнять набор инструкций, в которых ваш язык компилируется, но этобыло бы излишним в вашем случае .. просто посетите дерево разбора.Что-то вроде:
enum Operation {
PLUS, MINUS
}
interface TreeNode {
float eval();
}
class TreeFloat implements TreeNode {
float val;
float eval() { return val; }
}
class TreeBinaryOp implements TreeNode {
TreeNode first;
TreeNode second;
Operation op;
float eval() {
if (op == PLUS)
return first.eval()+second.eval();
}
Тогда вы просто вызываете функцию eval в корне дерева.Может потребоваться семантическая проверка (с созданием таблицы символов, если вы планируете иметь переменные или что-то еще).