Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package program;
- public class Interp {
- static class Table {
- String id; int value; Table tail;
- Table(String i, int v, Table t) { id=i; value=v; tail=t; }
- Table update(String i, Table t, int v)
- {
- return new Table(i, v, t);
- }
- int lookup(String key)
- {
- if(id == key) {
- return value;
- } else {
- return tail.lookup(key);
- }
- }
- }
- static class IntAndTable
- {
- int i; Table t;
- IntAndTable(int i, Table t) { this.i = i; this.t = t; }
- static IntAndTable interpExp(Exp e, Table t)
- {
- if(e instanceof IdExp) {
- return new IntAndTable(t.lookup(((IdExp) e).id), t);
- } else if(e instanceof NumExp) {
- return new IntAndTable(((NumExp) e).num, t);
- } else if(e instanceof OpExp) {
- IntAndTable iat1 = interpExp(((OpExp) e).left, t);
- IntAndTable iat2 = interpExp(((OpExp) e).right, iat1.t);
- switch(((OpExp) e).oper) {
- case OpExp.Plus : new IntAndTable(iat1.i + iat2.i, iat2.t);
- case OpExp.Minus : new IntAndTable(iat2.i - iat2.i, iat2.t);
- case OpExp.Times : new IntAndTable(iat2.i * iat2.i, iat2.t);
- case OpExp.Div : new IntAndTable(iat2.i / iat2.i, iat2.t);
- }
- } else if(e instanceof EseqExp) {
- Table t1 = interpStm(((EseqExp) e).stm,t);
- return interpExp(((EseqExp) e).exp,t1);
- }
- return null;
- }
- }
- static Table interpStm(Stm s, Table t)
- {
- if(s instanceof CompoundStm) {
- Table t1 = interpStm(((CompoundStm) s).stm1, t);
- return interpStm(((CompoundStm) s).stm2, t1);
- } else if(s instanceof AssignStm) {
- IntAndTable iat = IntAndTable.interpExp(((AssignStm) s).exp, t);
- return new Table(((AssignStm) s).id, iat.i, iat.t);
- } else if(s instanceof PrintStm) {
- return interpExpList(((PrintStm) s).exps,t);
- }
- return null;
- }
- static Table interpExpList(ExpList l, Table t)
- {
- if(l instanceof PairExpList) {
- IntAndTable iat = IntAndTable.interpExp(((PairExpList) l).head, t);
- System.out.println(iat.i + " ");
- return interpExpList(((PairExpList) l).tail, iat.t);
- } else if(l instanceof LastExpList) {
- IntAndTable iat = IntAndTable.interpExp(((LastExpList) l).head, t);
- System.out.println(iat.i);
- return iat.t;
- }
- return null;
- }
- static void interp(Stm s)
- {
- interpStm(s,null);
- }
- static int maxargs(Stm s)
- {
- if(s instanceof CompoundStm) {
- int s1 = maxargs(((CompoundStm) s).stm1);
- int s2 = maxargs(((CompoundStm) s).stm2);
- return s1 > s2 ? s1 : s2;
- } else if(s instanceof AssignStm) {
- return maxargs(((AssignStm) s).exp);
- } else if(s instanceof PrintStm) {
- return maxargs(((PrintStm) s).exps, 0);
- }
- return 0;
- }
- static int maxargs(Exp e)
- {
- if(e instanceof IdExp){
- return 0;
- } else if(e instanceof NumExp){
- return 0;
- } else if(e instanceof OpExp) {
- int e1 = maxargs(((OpExp) e).left);
- int e2 = maxargs(((OpExp) e).right);
- return e1 > e2 ? e1 : e2;
- } else if(e instanceof EseqExp) {
- int s = maxargs(((EseqExp) e).stm);
- int exp = maxargs(((EseqExp) e).exp);
- return s > exp ? s : exp;
- }
- return 0;
- }
- static int maxargs(ExpList l, int count)
- {
- if(l instanceof PairExpList) {
- int exp = maxargs(((PairExpList) l).head);
- int expList = maxargs(((PairExpList) l).tail, count+1);
- return exp > expList ? exp : expList;
- } else if(l instanceof LastExpList) {
- return count + 1;
- }
- return 0;
- }
- public static void main(String args[]) {
- System.out.println(maxargs(Prog.prog));
- interp(Prog.prog);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement