From 4fd5ee9cc59cf445e3e99b6672b36a9487620bc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesper=20=C3=96qvist?= <jesper.oqvist@cs.lth.se> Date: Mon, 6 Feb 2017 11:14:06 +0100 Subject: [PATCH] Add attribute statistics option Added a nonstandard option to write attribute statistics to a CSV file. --- ChangeLog | 7 +++++++ src/jastadd/ast/JastAddCodeGen.jadd | 24 +++++++++++++++++++++++- src/java/org/jastadd/Configuration.java | 19 +++++++++++++++++++ src/java/org/jastadd/JastAdd.java | 4 ++++ src/java/org/jastadd/JastAddTask.java | 4 ++++ 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index a40811f5..eebd77c0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2017-02-06 Jesper Öqvist <jesper.oqvist@cs.lth.se> + + * Added --statistics=FILE option. If specified, attribute statistics are + written in CSV format to the specified file. The number of synthesized, + inherited, and collection attribute declarations and equations written + for each AST class. + 2016-10-24 Jesper Öqvist <jesper.oqvist@cs.lth.se> * Changed default name of the AST state class from ASTNode$State to diff --git a/src/jastadd/ast/JastAddCodeGen.jadd b/src/jastadd/ast/JastAddCodeGen.jadd index 2ac7cdb8..81bcce10 100644 --- a/src/jastadd/ast/JastAddCodeGen.jadd +++ b/src/jastadd/ast/JastAddCodeGen.jadd @@ -123,6 +123,29 @@ aspect JastAddCodeGen { } } + /** + * @param filename filepath to a CSV file to write to + */ + public void Grammar.writeStatistics(String filename) throws IOException { + System.out.println("Writing attribute statistics to " + filename); + File csv = new File(filename); + PrintStream out = new PrintStream(new FileOutputStream(csv)); + out.println("node,syndecl,syneq,inhdecl,inheq,colldecl,colleq"); + for (int i = 0; i < getNumTypeDecl(); i++) { + getTypeDecl(i).writeStatistics(out); + } + out.close(); + } + + public void TypeDecl.writeStatistics(PrintStream out) { + } + + public void ASTDecl.writeStatistics(PrintStream out) { + out.format("%s,%d,%d,%d,%d,%d,%d%n", name(), getNumSynDecl(), getNumSynEq(), + getNumInhDecl(), inhAttrSet().size(), + getNumCollDecl(), getNumCollEq()); + } + public String TypeDecl.modifiers = ""; syn String TypeDecl.modifiers() { @@ -307,7 +330,6 @@ aspect JastAddCodeGen { } } - public void ASTDecl.jastAddGen(boolean publicModifier) { File file = grammar().targetJavaFile(name()); try { diff --git a/src/java/org/jastadd/Configuration.java b/src/java/org/jastadd/Configuration.java index c3c9426d..7c4e7583 100644 --- a/src/java/org/jastadd/Configuration.java +++ b/src/java/org/jastadd/Configuration.java @@ -333,6 +333,11 @@ public class Configuration { FlagOption printNonStandardOptionsOption = new FlagOption("X", "print list of non-standard options and halt"); + Option<String> statisticsOption = new ValueOption("statistics", + "write attribute statistics to a CSV file") + .acceptAnyValue() + .nonStandard(); + ValueOption indentOption = new ValueOption("indent", "indentation used in generated code") .addDefaultValue("2space", "two spaces") .addAcceptedValue("4space", "four spaces") @@ -462,6 +467,9 @@ public class Configuration { // New since 2.2.1: allOptions.add(safeLazyOption); + // New since 2.2.3: + allOptions.add(statisticsOption); + // Deprecated in 2.1.5. allOptions.add(doxygenOption); allOptions.add(cacheAllOption); @@ -792,6 +800,17 @@ public class Configuration { return printNonStandardOptionsOption.value(); } + /** + * @return <code>true</code> if attribute statistics should be generated + */ + public boolean shouldWriteStatistics() { + return !statisticsOption.value().isEmpty(); + } + + public String statisticsFile() { + return statisticsOption.value(); + } + /** * @return <code>true</code> if the --tracing option is enabled */ diff --git a/src/java/org/jastadd/JastAdd.java b/src/java/org/jastadd/JastAdd.java index 8b615f15..c6ed20bd 100644 --- a/src/java/org/jastadd/JastAdd.java +++ b/src/java/org/jastadd/JastAdd.java @@ -232,6 +232,10 @@ public class JastAdd { grammar.jastAddGen(config.getPublicModifier()); + if (config.shouldWriteStatistics()) { + grammar.writeStatistics(config.statisticsFile()); + } + } catch(NullPointerException e) { e.printStackTrace(); throw e; diff --git a/src/java/org/jastadd/JastAddTask.java b/src/java/org/jastadd/JastAddTask.java index 0a6c8e78..2cdeb4b6 100644 --- a/src/java/org/jastadd/JastAddTask.java +++ b/src/java/org/jastadd/JastAddTask.java @@ -286,6 +286,10 @@ public class JastAddTask extends Task { setOption(config.safeLazyOption, enable); } + public void setStatistics(String arg) { + setOption(config.statisticsOption, arg); + } + @Override public void execute() throws BuildException { System.err.println("generating node types and weaving aspects"); -- GitLab