1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright (C) 2001 Gerwin Klein <lsf@jflex.de> *
* Copyright (C) 2001 Bernhard Rumpe <rumpe@in.tum.de> *
* All rights reserved. *
* *
* License: BSD *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
* AST node for the whole program (top node).
*
* Also contains two symbol tables, one for input variables,
* one for function names.
*
* All operations like context check, symbol table build up
* etc. start here.
*/
class Tprogram implements AST {
Tparlist parlist; // input variables
Tdekllist dekllist; // function declarations
Texplist explist; // result expressions
Texplist arguments; // input values
public Tprogram(Tparlist p, Tdekllist d, Texplist e, Texplist a) {
parlist=p;
dekllist=d;
explist=e;
arguments=a;
}
public String toString() {
return("Program:\n=============\ninput "+parlist+
"\nfunctions\n"+dekllist+"\noutput "+explist+
"\narguments "+arguments+"\nend");
}
SymTab inputs; // table of input variables
SymTab functions; // table of functions
public void setSymtabs() { // calculate symbol table entries
inputs = new SymTab(); // set input variables
parlist.setSymtab(inputs, true, 0);
functions = new SymTab(inputs);
dekllist.setSymtab(functions);
}
public void printSymtabs() {
System.out.print("Input variables-\n"+inputs);
System.out.print("Functions-\n"+functions);
dekllist.printSymtabs();
}
public void checkcontext() {
dekllist.checkcontext(); // CoCo (DefFun,DefVar,Arity)
// in function bodies
explist.checkcontext(functions); // CoCo (DefFun,DefVar,Arity)
// in result expressions
arguments.checkcontext(new SymTab()); // CoCo (constants)
// in arguments
if (arguments.length()!=inputs.size())
Main.error("Argument list and input variables list differ!");
}
public void prepInterp() { // set pointers and indices
dekllist.prepInterp(functions);
explist.prepInterp(functions);
}
public void interpret() {
int[] inputEnv = new int[inputs.size()]; // set input
arguments.interpret(null,null,inputEnv,0);
System.out.println("Result:\n=============");
int[] ergebnis = new int[explist.length()];
explist.interpret(inputEnv,null,ergebnis,0); // calculate result
int i;
for (i=explist.length()-1; i > 0; i--)
System.out.print(ergebnis[i]+", ");
System.out.println(ergebnis[i]);
}
}
|