lots of change and add notes
[cdsspec-compiler.git] / src / edu / uci / eecs / specCompiler / specExtraction / SpecExtractor.java
index dc24b28167d0f2c63adb875d0ec348af7dd30e8e..1d34199ea2fcd5e1adcdfd81b3515df488448416 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() {
+
+       public 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,11 +67,25 @@ 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()))
+                                                               continue;
+                                                       Construct inst = SpecParser.parseSpec(specText
+                                                                       .toString());
+                                                       if (inst instanceof InterfaceConstruct
+                                                                       || inst instanceof InterfaceDefineConstruct) {
+                                                               funcDecl = readFunctionDecl(reader);
+                                                               specConstruct = new SpecConstruct(
+                                                                               specText.toString(), file,
+                                                                               _beginLineNum, _endLineNum, inst,
+                                                                               funcDecl);
+                                                       } else {
+                                                               specConstruct = new SpecConstruct(
+                                                                               specText.toString(), file,
+                                                                               _beginLineNum, _endLineNum, inst);
+                                                       }
+                                                       _constructs.add(specConstruct);
+                                                       specText = new StringBuilder();
+                                                       // System.out.println(specConstruct);
                                                }
                                        }
                                } else {
@@ -74,29 +94,77 @@ 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
+                                                               || inst instanceof InterfaceDefineConstruct) {
+                                                       funcDecl = readFunctionDecl(reader);
+                                                       specConstruct = new SpecConstruct(
+                                                                       specText.toString(), file, _beginLineNum,
+                                                                       _endLineNum, inst, funcDecl);
+                                               } else {
+                                                       specConstruct = new SpecConstruct(
+                                                                       specText.toString(), file, _beginLineNum,
+                                                                       _endLineNum, inst);
+                                               }
+                                               _constructs.add(specConstruct);
                                                specText = new StringBuilder();
+                                               // System.out.println(specConstruct);
                                        }
                                }
                        }
                        // 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 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(')');
+                       if (braceIdx == -1) {
+                               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;
@@ -115,7 +183,11 @@ public class SpecExtractor {
                else
                        return line.substring(i, j + 1);
        }
-       
+
+       public ArrayList<SpecConstruct> getConstructs() {
+               return this._constructs;
+       }
+
        public static void main(String[] argvs) {
                SpecExtractor extractor = new SpecExtractor();
                File file = new File("./grammer/spec1.txt");