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, FLOAT4; 
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 
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); 
 :} 
 ; 
