N
Neill
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???
-----------------------------
#include <iostream>
#include <string>
using namespace std;
struct Stm_ {};
struct Exp_ {};
struct 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;
}
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???
-----------------------------
#include <iostream>
#include <string>
using namespace std;
struct Stm_ {};
struct Exp_ {};
struct 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;
}