blob: 08a93d17fc800ce7b684bd97485af0133535406f [file] [log] [blame]
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright (C) 2001 Gerwin Klein <lsf@jflex.de> *
* Copyright (C) 2001 Bernhard Rumpe <rumpe@in.tum.de> *
* All rights reserved. *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License. See the file *
* COPYRIGHT for more information. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
* 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]);
}
}