Я работал над переводчиком для языка с другом, и мы начали с решения, которое, как мне кажется, было не слишком мудрым: сначала мы сделали все элементы для выполнения (практически дерево, сделанное из разных классов); но теперь, глядя на примеры повышения, я запутался в том, как объединить их. Я знаю, с чего начать (грамматика), я знаю, чего достичь (экземпляры классов владеют друг другом), я не знаю, как этого достичь.
Мы начали с выражений без переменных, поэтому мы рассмотрели примеры калькулятора спирта; но я не понимаю, когда создавать экземпляры элементов.
Пример элементов выражения:
namespace exp
{
class op
{
private:
public:
virtual double exec(function_scope &fs);
};
class operand : public op
{
private:
double value;
public:
operand(double value);
double exec(function_scope &fs);
};
class op_bin : public op
{
private:
public:
op * ll;
op* rr;
op_bin(op* ll, op* rr);
~op_bin();
};
namespace bin
{
class sum : public op_bin
{
public:
sum(op* ll, op* rr);
double exec(function_scope &fs);
};
}
}
Игнорировать функцию exec, она используется во время выполнения.
Например, код 5 + (2 + 1) должен привести к окончательному эквиваленту:
new exp::bin::sum(new exp::operand(5), new exp::bin::sum(new exp::operand(2), new exp::operand(1))
Как только я понял, как это сделать, я практически сделал.