package org.gridchem.client;
import java_cup.runtime.*;
import javax.swing.*;
import java.util.*;
import java.io.*; 



/*
OUTPUT FORMAT:____________________________________________________________
1NSERCH=   0    
         more text 
 SCF Done:  E(RHF) =  -7.85284496695     A.U. after    8 cycles  
         more text
 Maximum Force            0.000000     0.000450     YES
 RMS     Force            0.000000     0.000300     YES
         more text
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;
  }

//   }
:}




terminal           FOUNDITER, SCFDONE, NSearch, Energ, MaxGrad, RmsGrad;
terminal Integer     ITERATION;
terminal Float     ENERGY, MGRAD, RGRAD;
non terminal  startpt, scfintro, scfpat, scfcycle, cycle, grad1, grad2;




/* ___________
   The grammer */

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




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

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

scfcycle ::= Energ ENERGY:e
{: //___________________________________________________________________
   if (DEBUG) System.out.println("CUP:gopt:  ENERGY "+e);
 :}
|
cycle 
;




cycle ::= NSearch ITERATION:c
{: //___________________________________________________________________
   if (DEBUG) System.out.println("CUP:gopt:  ITERATION "+c); 
 :}
|
grad1
|
grad2
 ;

grad1 ::= MaxGrad  MGRAD:mg
{: //___________________________________________________________________
   if (DEBUG) System.out.println("CUP:gopt: Maximum Force "+mg);
 :}
;

grad2 ::= RmsGrad  RGRAD:rg
{: //___________________________________________________________________
   if (DEBUG) System.out.println("CUP:gopt: RMS Force "+rg);
 :}
;
