From 570d67c87af73f80a04e584ffacf2c395c570450 Mon Sep 17 00:00:00 2001 From: Peizhao Ou Date: Mon, 14 Oct 2013 19:01:08 -0700 Subject: [PATCH] parser checked --- grammer/spec-compiler.jj | 34 ++++-- .../specExtraction/SpecConstruct.java | 32 ++++-- .../specExtraction/SpecExtractor.java | 106 +++++++++++++----- 3 files changed, 125 insertions(+), 47 deletions(-) diff --git a/grammer/spec-compiler.jj b/grammer/spec-compiler.jj index 85aabff..2238268 100644 --- a/grammer/spec-compiler.jj +++ b/grammer/spec-compiler.jj @@ -71,6 +71,8 @@ package edu.uci.eecs.specCompiler.grammerParser; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -97,6 +99,15 @@ import edu.uci.eecs.specCompiler.specExtraction.ActionSubConstruct.DefineVar; e.printStackTrace(); } } + + public static Construct parseSpec(String text) + throws ParseException, TokenMgrError { + InputStream input = new ByteArrayInputStream(text.getBytes()); + SpecParser parser = new SpecParser(input); + return parser.Parse(); + } + + } PARSER_END(SpecParser) @@ -198,6 +209,8 @@ TOKEN : | +| + | | @@ -313,7 +326,7 @@ Construct Parse() : ) { - System.out.println(res); + //System.out.println(res); return res; } } @@ -354,7 +367,7 @@ String C_CPP_CODE() : ( t = | t = | t = | t = | t = | t = | t = | t = | - t = | t = | t = | t = | t = | t = | t = | + t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | t = | @@ -512,8 +525,11 @@ ActionSubConstruct Action() : { { defineVars = new ArrayList(); + code = ""; } + ( + ( ( (defineVarStr = C_CPP_CODE()) { int eqIdx = defineVarStr.indexOf('='); @@ -523,13 +539,13 @@ ActionSubConstruct Action() : expr = defineVarStr.substring(eqIdx + 2); DefineVar defineVar = new DefineVar(type, name, expr); defineVars.add(defineVar); - } - )* - (code = C_CPP_CODE()) - { - ActionSubConstruct res = new ActionSubConstruct(defineVars, code); - return res; - } + })* ( (code = C_CPP_CODE()))? ) + ) + + { + ActionSubConstruct res = new ActionSubConstruct(defineVars, code); + return res; + } } PotentialCPDefineConstruct Potential_commit_point_define() : diff --git a/src/edu/uci/eecs/specCompiler/specExtraction/SpecConstruct.java b/src/edu/uci/eecs/specCompiler/specExtraction/SpecConstruct.java index 84249e8..95650cc 100644 --- a/src/edu/uci/eecs/specCompiler/specExtraction/SpecConstruct.java +++ b/src/edu/uci/eecs/specCompiler/specExtraction/SpecConstruct.java @@ -12,33 +12,45 @@ import java.io.File; * */ public class SpecConstruct { - public enum ConstructType { - GLOBAL, INTERFACE, POTENTIAL_CP, CP_DEFINE, CP_DEFINE_CHECK - }; - public ConstructType type; public final String plainText; public final File file; public final int beginLineNum; public final int endLineNum; public final String interfaceDeclBody; + public final Construct construct; - public SpecConstruct(ConstructType type, String plainText, File file, - int beginLineNum, int endLineNum) { - this.type = type; + public SpecConstruct(String plainText, File file, + int beginLineNum, int endLineNum, Construct construct) { this.plainText = plainText; this.file = file; this.beginLineNum = beginLineNum; this.endLineNum = endLineNum; + this.construct = construct; this.interfaceDeclBody = ""; } - public SpecConstruct(ConstructType type, String plainText, File file, - int beginLineNum, int endLineNum, String interfaceDeclBody) { - this.type = type; + public SpecConstruct(String plainText, File file, + int beginLineNum, int endLineNum, Construct construct, + String interfaceDeclBody) { this.plainText = plainText; this.file = file; this.beginLineNum = beginLineNum; this.endLineNum = endLineNum; + this.construct = construct; this.interfaceDeclBody = interfaceDeclBody; } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("File: " + file.getAbsolutePath() + "\n"); + sb.append("Begin: " + + beginLineNum + " End: " + endLineNum + "\n"); + sb.append(construct); + if (construct instanceof InterfaceConstruct) { + sb.append("Function declaration: " + interfaceDeclBody); + } + boolean a = !false, b = 3 > 0 ? a : !a; + return sb.toString(); + + } } 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"); -- 2.34.1