diff --git a/src/main/scala/leon/Main.scala b/src/main/scala/leon/Main.scala index 3cac21a4d260e3a134fdbeb2dc27a44aaad04c49..325ba92decae62eb4ee43bc91966cc010294e068 100644 --- a/src/main/scala/leon/Main.scala +++ b/src/main/scala/leon/Main.scala @@ -10,6 +10,7 @@ object Main { List( frontends.scalac.ExtractionPhase, utils.TypingPhase, + FileOutputPhase, xlang.ArrayTransformation, xlang.EpsilonElimination, xlang.ImperativeCodeElimination, @@ -32,6 +33,7 @@ object Main { LeonFlagOptionDef ("xlang", "--xlang", "Support for extra program constructs (imperative,...)"), LeonFlagOptionDef ("library", "--library", "Inject Leon standard library"), LeonValueOptionDef("debug", "--debug=<sections..>", "Enables specific messages"), + LeonFlagOptionDef ("noop", "--noop", "No operation performed, just output program"), LeonFlagOptionDef ("help", "--help", "Show help") ) @@ -156,6 +158,8 @@ object Main { } } settings = settings.copy(debugSections = debugSections.toSet) + case LeonFlagOption("noop", true) => + settings = settings.copy(verify = false) case LeonFlagOption("help", true) => displayHelp(initReporter) case _ => @@ -207,7 +211,7 @@ object Main { } else if (settings.verify) { AnalysisPhase } else { - NoopPhase() + utils.FileOutputPhase } } diff --git a/src/main/scala/leon/purescala/Definitions.scala b/src/main/scala/leon/purescala/Definitions.scala index 54b43592e361d96f61a752e39671962b497ad84b..32f21b0e7747824b0b3b2b31ab2bd659733a2e9a 100644 --- a/src/main/scala/leon/purescala/Definitions.scala +++ b/src/main/scala/leon/purescala/Definitions.scala @@ -58,6 +58,15 @@ object Definitions { case d => d }))) } + + def writeScalaFile(filename: String) { + import java.io.FileWriter + import java.io.BufferedWriter + val fstream = new FileWriter(filename) + val out = new BufferedWriter(fstream) + out.write(ScalaPrinter(this)) + out.close + } } object Program { diff --git a/src/main/scala/leon/utils/FileOutputPhase.scala b/src/main/scala/leon/utils/FileOutputPhase.scala new file mode 100644 index 0000000000000000000000000000000000000000..e6b02b7afe45b794278f454d313c2446494de2ed --- /dev/null +++ b/src/main/scala/leon/utils/FileOutputPhase.scala @@ -0,0 +1,27 @@ +package leon.utils + +import leon._ +import purescala.Definitions.Program +import java.io.File + +object FileOutputPhase extends UnitPhase[Program] { + + val name = "File output" + val description = "Output parsed/generated program into a file (default: memo.out.scala)" + + override val definedOptions : Set[LeonOptionDef] = Set( + LeonValueOptionDef("o", "--o=<file>", "Output file") + ) + + def apply(ctx:LeonContext, p : Program) { + // Get the output file name from command line, or use default + val outputFile = ( for (LeonValueOption("o", file) <- ctx.options) yield file ).lastOption.getOrElse("memo.out.scala") + try { + p.writeScalaFile(outputFile) + } catch { + case _ : java.io.IOException => ctx.reporter.fatalError("Could not write on " + outputFile) + } + ctx.reporter.info("Output written on " + outputFile) + } + +}