import Jakarta.util.*;
import java.util.*;
import java.io.*;
class outeqns implements GVisitor {
boolean debug = false; // turn on for debugging
PrintStream ps = null;
Stack stack;
LinkedList eqn;
// output queued layer names -- we have to go to these hoops
// so that the base term goes first (sigh)
void outputEqn() {
int z = eqn.size();
for (int i = 0; i<z; i++) {
String x = (String) eqn.removeLast();
ps.print(x + " " );
}
ps.println();
eqn = new LinkedList();
}
outeqns( File fl ) {
try {
ps = (debug) ? System.out :
new PrintStream( new FileOutputStream( fl, true/*append*/));
ps.println();
stack = new Stack();
eqn = new LinkedList();
}
catch (Exception e) {
Util.fatalError( "File not found");
}
}
public void action( grammar n ) {
if (!Main.equationFormat) ps.print("this = ");
n.traverse(this);
outputEqn();
while (!stack.empty()) {
production p = (production) stack.pop();
if (!Main.equationFormat) ps.print(p.name + " = ");
p.traverse(this);
outputEqn();
}
ps.close();
}
public void action( optprim n ) {
if (n.var.value == variable.T){
eqn.add(n.var.out);
}
}
public void action( optprod n ) {
if (n.var.value == variable.T) {
production p = production.find(n.name);
action(p);
}
}
public void action( pattern n ) {
if (n.var.value == variable.T)
n.traverse(this);
}
public void action( plus n ) {
if (n.var.value == variable.T) {
production p = production.find(n.name);
action(p);
}
}
public void action( prim n ) {
if (n.var.value == variable.T){
eqn.add(n.var.out);
}
}
public void action( prod n ) {
if (n.var.value == variable.T) {
production p = production.find(n.name);
action(p);
}
}
public void action( star n ) {
if (n.var.value == variable.T) {
production p = production.find(n.name);
action(p);
}
}
public void action( production n ) {
if (n.var.eqn) {
eqn.add(n.name);
stack.push(n);
return;
}
if (n.var.value == variable.T) {
production p = production.find(n.name);
p.traverse(this);
}
}
public void action( term n ) {
System.err.println( "outeqns.term should not be called" );
}
public void action( variable n ) {
System.err.println( "outeqns.variable should not be called" );
}
}