Re: struct inheritance: full listing
Neill wrote:
For a course on "Compiler Design" we were giving the listing from below, I
have to write:
1) constuctors & destructors (easy!)
2) a function int Stm::maxargs() that tells the maximum number of
arguments of any print statement within any subexpression of a given
statement. For example, maxargs(prog) is 2. Is that even possible???
Yes. Add virtual functions.
-----------------------------
#include <iostream>
#include <string>
using namespace std;
struct Stm_ {
virtual int maxargs ( void ) = 0;
};
struct Exp_ {
virtual int maxargs ( void ) = 0;
};
struct ExpList_ {
virtual int maxargs ( void ) = 0;
virtual int size ( void ) = 0;
};
In each of the derived classes, provide the right implementation. Since the
number of arguments to a PrintStm could depend on the length of the list of
arguments, you will also need the size() member for ExpList_.
typedef Stm_* Stm;
typedef Exp_* Exp;
typedef ExpList_* ExpList;
struct AssignStm : public Stm_
{
string id;
Exp exp;
AssignStm(string i, Exp e);
};
struct PrintStm : public Stm_
{
ExpList exps;
PrintStm(ExpList es);
};
struct CompoundStm : public Stm_
{
Stm stm1, stm2;
CompoundStm(Stm s1, Stm s2);
};
struct IdExp : public Exp_
{
string id;
IdExp(string i);
};
struct NumExp : public Exp_
{
int num;
NumExp(int n);
};
typedef enum {Plus, Minus, Times, Div} Binop;
struct OpExp : public Exp_
{
Exp left, right;
Binop oper;
OpExp(Exp l, Binop op, Exp r);
};
struct EseqExp : public Exp_
{
Stm stm;
Exp exp;
EseqExp(Stm s, Exp e);
};
struct PairExpList : public ExpList_
{
Exp head;
ExpList tail;
PairExpList(Exp h, ExpList t);
};
struct LastExpList : public ExpList_
{
Exp last;
LastExpList(Exp l);
};
int main()
{
Stm prog =
new CompoundStm(
new AssignStm(
"a",
new OpExp(new NumExp(5), Plus, new NumExp(3))),
new CompoundStm(
new AssignStm(
"b",
new EseqExp(
new PrintStm(
new PairExpList(
new IdExp("a"),
new LastExpList(
new OpExp(new IdExp("a"), Minus, new NumExp(1))))),
new OpExp(new NumExp(10), Times, new IdExp("a")))),
new PrintStm(new LastExpList(new IdExp("b")))));
return 0;
}
Best
Kai-Uwe Bux