parser checked
[cdsspec-compiler.git] / src / edu / uci / eecs / specCompiler / specExtraction / SpecExtractor.java
index e1fae7e..ac6de02 100644 (file)
@@ -8,6 +8,10 @@ import java.io.IOException;
 import java.io.LineNumberReader;
 import java.util.ArrayList;
 
+import edu.uci.eecs.specCompiler.grammerParser.ParseException;
+import edu.uci.eecs.specCompiler.grammerParser.SpecParser;
+import edu.uci.eecs.specCompiler.grammerParser.TokenMgrError;
+
 /**
  * <p>
  * This class represents the specification extractor of the specification. The
@@ -15,38 +19,40 @@ import java.util.ArrayList;
  * corresponding specification out, and remember its location, including the
  * file name and the line number, to help the code generation process.
  * </p>
+ * 
  * @author peizhaoo
- *
+ * 
  */
 public class SpecExtractor {
        private ArrayList<SpecConstruct> _constructs;
        private int _beginLineNum, _endLineNum;
        private String _beginLine;
-       
+
        SpecExtractor() {
                _constructs = new ArrayList<SpecConstruct>();
        }
-       
+
        /**
         * <p>
-        * Given a list of files, it scans each file and add found SpecConstrcut
-        * to the _constructs list.
+        * Given a list of files, it scans each file and add found SpecConstrcut to
+        * the _constructs list.
         * </p>
+        * 
         * @param files
-        * @throws SpecNotMatchException 
+        * @throws SpecNotMatchException
         */
        public void extract(File[] files) throws SpecNotMatchException {
                for (int i = 0; i < files.length; i++)
                        extract(files[i]);
        }
-       
+
        public void extract(File file) throws SpecNotMatchException {
+               StringBuilder specText = new StringBuilder();
                try {
                        LineNumberReader reader = new LineNumberReader(new FileReader(file));
-                       String prevLine = "", curLine, trimedLine;
-                       StringBuilder specText = new StringBuilder();
+                       String prevLine = "", curLine, trimedLine, funcDecl;
+                       SpecConstruct specConstruct;
                        boolean foundHead = false;
-                       int specIndex = 0;
                        while ((curLine = reader.readLine()) != null) {
                                if (prevLine.endsWith("\\"))
                                        continue;
@@ -61,12 +67,22 @@ public class SpecExtractor {
                                                if (trimedLine.endsWith("*/")) {
                                                        _endLineNum = reader.getLineNumber();
                                                        foundHead = false;
-                                                       //Constrcut inst = SpecParser
-                                                       
-                                                       System.out.println("Spec<" + specIndex + "> Begin: "
-                                                                       + _beginLine + "  End: " + _endLineNum);
-                                                       System.out.println(specText);
-                                                       specIndex++;
+                                                       if (isComment(specText.toString()))
+                                                               continue;
+                                                       Construct inst = SpecParser.parseSpec(specText
+                                                                       .toString());
+                                                       if (inst instanceof InterfaceConstruct) {
+                                                               funcDecl = readFunctionDecl(reader);
+                                                               specConstruct = new SpecConstruct(
+                                                                               specText.toString(), file,
+                                                                               _beginLineNum, _endLineNum, inst, funcDecl);
+                                                       } else {
+                                                               specConstruct = new SpecConstruct(
+                                                                               specText.toString(), file,
+                                                                               _beginLineNum, _endLineNum, inst);
+                                                       }
+                                                       specText = new StringBuilder();
+                                                       System.out.println(specConstruct);
                                                }
                                        }
                                } else {
@@ -75,30 +91,62 @@ public class SpecExtractor {
                                        if (trimedLine.endsWith("*/")) {
                                                _endLineNum = reader.getLineNumber();
                                                foundHead = false;
-                                               
-                                               System.out.println("Spec<" + specIndex + "> Begin: "
-                                                               + _beginLine + "  End: " + _endLineNum);
-                                               System.out.println(specText);
-                                               specIndex++;
-                                               
+                                               if (isComment(specText.toString())) {
+                                                       specText = new StringBuilder();
+                                                       continue;
+                                               }
+                                               Construct inst = SpecParser.parseSpec(specText
+                                                               .toString());
+                                               if (inst instanceof InterfaceConstruct) {
+                                                       funcDecl = readFunctionDecl(reader);
+                                                       specConstruct = new SpecConstruct(
+                                                                       specText.toString(), file,
+                                                                       _beginLineNum, _endLineNum, inst, funcDecl);
+                                               } else {
+                                                       specConstruct = new SpecConstruct(
+                                                                       specText.toString(), file,
+                                                                       _beginLineNum, _endLineNum, inst);
+                                               }
+                                               System.out.println(specConstruct);
                                                specText = new StringBuilder();
                                        }
                                }
-                       } 
+                       }
                        // At the end we can only find the head "/**" but no tail found
                        if (foundHead) {
-                               String msg = "In file \"" + file.getAbsolutePath() + "\", line: "
-                                               + _beginLineNum + "\n" + _beginLine + "\n" + "Can't find matching spec.";
+                               String msg = "In file \"" + file.getAbsolutePath()
+                                               + "\", line: " + _beginLineNum + "\n" + _beginLine
+                                               + "\n" + "Can't find matching spec.";
                                throw new SpecNotMatchException(msg);
                        }
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
+               } catch (ParseException e) {
+                       printSpecInfo(file, specText.toString());
+                       e.printStackTrace();
+               } catch (TokenMgrError e) {
+                       printSpecInfo(file, specText.toString());
+                       e.printStackTrace();
                }
        }
        
-       private String readInterfaceDecl(LineNumberReader reader) throws IOException {
+       private void printSpecInfo(File file, String text) {
+               System.out.println("Error in spec!");
+               System.out.println("File: " + file.getAbsolutePath());
+               System.out.println("Begin: "
+                               + _beginLineNum + "  End: " + _endLineNum);
+               System.out.println(text);
+       }
+       
+       private boolean isComment(String specText) {
+               if (specText.indexOf("@Begin") != -1)
+                       return false;
+               return true;
+       }
+
+       private String readFunctionDecl(LineNumberReader reader) throws IOException {
                String res = "", curLine;
                while ((curLine = reader.readLine()) != null) {
                        int braceIdx = curLine.indexOf(')');
@@ -106,11 +154,13 @@ public class SpecExtractor {
                                res = res + " " + curLine;
                        } else {
                                res = res + curLine.substring(0, braceIdx + 1);
+                               res = trimSpace(res);
+                               break;
                        }
                }
                return res;
        }
-       
+
        private String trimSpace(String line) {
                int i, j;
                char ch;
@@ -129,7 +179,7 @@ public class SpecExtractor {
                else
                        return line.substring(i, j + 1);
        }
-       
+
        public static void main(String[] argvs) {
                SpecExtractor extractor = new SpecExtractor();
                File file = new File("./grammer/spec1.txt");