X-Git-Url: http://plrg.eecs.uci.edu/git/?p=cdsspec-compiler.git;a=blobdiff_plain;f=src%2Fedu%2Fuci%2Feecs%2FspecCompiler%2FspecExtraction%2FSpecExtractor.java;h=ac6de02b405f06a4db25b1a184009eb6d150c0a9;hp=e1fae7ef35081ecd04c4d1744303b315b32bc586;hb=570d67c87af73f80a04e584ffacf2c395c570450;hpb=809787d83de53a464887c48b0a083d4903e0734e;ds=sidebyside diff --git a/src/edu/uci/eecs/specCompiler/specExtraction/SpecExtractor.java b/src/edu/uci/eecs/specCompiler/specExtraction/SpecExtractor.java index e1fae7e..ac6de02 100644 --- a/src/edu/uci/eecs/specCompiler/specExtraction/SpecExtractor.java +++ b/src/edu/uci/eecs/specCompiler/specExtraction/SpecExtractor.java @@ -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; + /** *

* 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. *

+ * * @author peizhaoo - * + * */ public class SpecExtractor { private ArrayList _constructs; private int _beginLineNum, _endLineNum; private String _beginLine; - + SpecExtractor() { _constructs = new ArrayList(); } - + /** *

- * 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. *

+ * * @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");