/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * 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]); } }