119 lines
2.9 KiB
Plaintext
119 lines
2.9 KiB
Plaintext
%parser 44.lexer // Program 4.4
|
|
|
|
%right SEMICOLON COMMA
|
|
%left PLUS MINUS
|
|
%left TIMES DIV
|
|
|
|
%symbol stm {
|
|
public virtual Table eval(Table env) { return env; }
|
|
}
|
|
|
|
%symbol exp {
|
|
public virtual int eval(Table env) { return 0; }
|
|
}
|
|
|
|
%symbol exps {
|
|
public virtual void eval(Table env) {}
|
|
}
|
|
|
|
%node NumExp : exp {
|
|
int i;
|
|
public NumExp(INT ii) { i=ii.val; }
|
|
public override int eval(Table env) { return i; }
|
|
}
|
|
|
|
%node IdExp : exp {
|
|
string id;
|
|
public IdExp(string i) { id=i; }
|
|
public override int eval(Table env) { return env.lookup(id); }
|
|
}
|
|
|
|
%node PlusExp : exp {
|
|
exp a,b;
|
|
public PlusExp(exp aa,exp bb) { a=aa; b=bb; }
|
|
public override int eval(Table env) { return a.eval(env)+b.eval(env); }
|
|
}
|
|
|
|
%node MinusExp : exp {
|
|
exp a,b;
|
|
public MinusExp(exp aa,exp bb) { a=aa; b=bb; }
|
|
public override int eval(Table env) { return a.eval(env)-b.eval(env); }
|
|
}
|
|
|
|
%node TimesExp : exp {
|
|
exp a,b;
|
|
public TimesExp(exp aa,exp bb) { a=aa; b=bb; }
|
|
public override int eval(Table env) { return a.eval(env)*b.eval(env); }
|
|
}
|
|
|
|
%node DivExp : exp {
|
|
exp a,b;
|
|
public DivExp(exp aa,exp bb) { a=aa; b=bb; }
|
|
public override int eval(Table env) { return a.eval(env)/b.eval(env); }
|
|
}
|
|
|
|
%node EseqExp : exp {
|
|
stm st;
|
|
exp ex;
|
|
public EseqExp(stm s,exp e) { st=s; ex=e; }
|
|
public override int eval(Table env) { return ex.eval(st.eval(env)); }
|
|
}
|
|
|
|
%node BrackExp : exp {
|
|
exp ex;
|
|
public BrackExp(exp e) { ex=e; }
|
|
public override int eval(Table env) { return ex.eval(env); }
|
|
}
|
|
|
|
%node CompoundStm : stm {
|
|
stm stm1, stm2;
|
|
public CompoundStm(stm s1, stm s2) { stm1=s1; stm2=s2; }
|
|
public override Table eval(Table env) { return stm2.eval(stm1.eval(env)); }
|
|
}
|
|
|
|
%node AssignStm : stm {
|
|
string id;
|
|
exp ex;
|
|
public AssignStm(ID i,exp e) { id=i.yytext; ex=e; }
|
|
public override Table eval(Table env) { return new Update(env,id,ex.eval(env)); }
|
|
}
|
|
|
|
%node PrintStm : stm {
|
|
exps es;
|
|
public PrintStm(exps e) { es=e; }
|
|
public override Table eval(Table env) {
|
|
es.eval(env); return env;
|
|
}
|
|
}
|
|
|
|
%node ExpList : exps {
|
|
exp head;
|
|
exps tail;
|
|
public ExpList(exp hd, exps tl) { head=hd; tail=tl; }
|
|
public override void eval(Table env) {
|
|
Console.Write(head.eval(env));
|
|
if (tail!=null)
|
|
tail.eval(env);
|
|
else
|
|
Console.WriteLine();
|
|
}
|
|
}
|
|
|
|
prog : stm:s { $$ = s.eval(new EmptyTable()); };
|
|
|
|
stm : stm:a SEMICOLON stm:b %CompoundStm(a,b);
|
|
stm : ID:i ASSIGN exp:e %AssignStm(i,e);
|
|
stm : PRINT LPAREN exps:e RPAREN %PrintStm(e);
|
|
|
|
exps : exp:e %ExpList(e,null);
|
|
exps : exp:e COMMA exps:es %ExpList(e,es);
|
|
|
|
exp : INT:i %NumExp(i);
|
|
exp : ID:id %IdExp(id.yytext);
|
|
exp : exp:a PLUS exp:b %PlusExp(a,b);
|
|
exp : exp:a MINUS exp:b %MinusExp(a,b);
|
|
exp : exp:a TIMES exp:b %TimesExp(a,b);
|
|
exp : exp:a DIV exp:b %DivExp(a,b);
|
|
exp : stm:s COMMA exp:e %EseqExp(s,e);
|
|
exp : LPAREN exp:e RPAREN %BrackExp(e);
|