Files

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);