import java_cup.runtime.*;
import javax.swing.*;
import java.util.*;
import java.io.*; 



/*
OUTPUT FORMAT:____________________________________________________________
          --------------------------
                 RHF SCF CALCULATION
          --------------------------
 
     NUCLEAR ENERGY =         6.1221376700
     MAXIT =   30     NPUNCH=    2
     EXTRAP=T  DAMP=F  SHIFT=F  RSTRCT=F  DIIS=F  DEM=F  SOSCF=F
     DENSITY CONV=  1.00E-05
     MEMORY REQUIRED FOR RHF STEP=     30441 WORDS.
 
 ITER EX DEM    TOTAL ENERGY       E CHANGE  DENSITY CHANGE    DIIS ERROR
   1  0  0      -37.172577283   -37.172577283   0.380764107   0.000000000
   2  1  0      -37.227975620    -0.055398337   0.131481807   0.000000000
   3  2  0      -37.231732248    -0.003756628   0.046548652   0.000000000
   4  3  0      -37.232193210    -0.000460963   0.016847695   0.000000000

TO MONITOR:____________________________________________________________
 iteration, energy

MANUALLY ADD TO CUP-GENERATED CLASS IN SCFaParser.java:________________


//add to CUP$SCFaParser$actions
public ParseSCF2 parseSCF;

//add to the constructor of CUP$SCFaParser$actions
 parseSCF = new ParseSCF2();

*/

action code {: 
  //__________________________________
  public static boolean DEBUG = true;
  private static JTable table;               
  private static final String tableLabel = "SCF Intermediate Results:";
// private static String cycle = "0";
 
  
  public static JTable getTable() {
    return table;
  }

  public static String getTableLabel() {
    return tableLabel;
  }

/*  public static void main(String[] args) throws IOException {
     File temp = new File("temporary");
     boolean append = true;
     try{ 
     FileWriter temp1 = new FileWriter(temp, append);
     PrintWriter temp2 = new PrintWriter(temp1);}

     catch (FileNotFoundException e)  {
          System.out.println("no file, dude!");
       }  */
//   }
:}




terminal            FOUNDITER, SCFDONE;
terminal Integer     INT1, INT2, INT3, INTCycle;
terminal Float     FLOAT, FLOAT1, FLOAT2, FLOAT3, ENERGY;
non terminal  startpt, scfintro, scfpat, scfcycle, en;




/* ___________
   The grammer */

startpt ::= scfintro
           scfpat 
            SCFDONE
            {: if (DEBUG) System.out.println("CUP:gscfa:  end of parse tree "); 
 	       table = new JTable();
	
//       table = parseSCF.getTable();
 	     :}
             ;




scfintro ::=
   FOUNDITER 
   {: if (DEBUG) System.out.println("CUP:gscfa:  found start of SCF Iteration"); :}
;

scfpat ::= scfpat scfcycle
   {: if (DEBUG) System.out.println("CUP:gscfa: in scfpat"); :}
   |
   scfcycle
;

scfcycle ::=
INTCycle:c
{: //___________________________________________________________________
   if (DEBUG) System.out.println("CUP:gscfa:scfcycle:  ITERATION "+c);
//  temp2.print(c);
//   temp2.print(" "); 
//  cycle = c;
 
//  parseSCF.putField("iteration "+cycle, cycle);
 :}
INT1 INT2
en
FLOAT1 FLOAT2 FLOAT3
;




en ::= 
ENERGY:e 
{: //___________________________________________________________________
   if (DEBUG) System.out.println("CUP:gscfa:scfcycle:  ENERGY "+e); 
//   temp2.println(e);
//  parseSCF.putField("iteration "+cycle, "energy", e);
 :}
 ;
