public void ResolvingAmbiguities() { using (var interp = new Interpreter<AmbiguousCalculator>()) { interp.Parse("2+8/2"); Assert.AreEqual(6, interp.Context.Result.Value); interp.Parse("8/4/2"); Assert.AreEqual(1, interp.Context.Result.Value); interp.Parse("2+3"); // can be interpreted as a "2 * (+3)" Assert.AreEqual(5, interp.Context.Result.Value); // Check that implicit multiplication works interp.Parse("2 3"); Assert.AreEqual(6, interp.Context.Result.Value); // A lot of ambiguities: interp.Parse("1+-+6/3"); Assert.AreEqual(-1, interp.Context.Result.Value); #if false using (var g = new GvGraphView("expr.tmp.gv")) { interp.BuildTree("1+-+6/3").WriteGraph(g, interp.Grammar, true); } #endif } }
public void Test() { using (var interp = new Interpreter<MyCalc>()) { Assert.IsTrue(interp.Parse("1 + 2 * 3")); Assert.AreEqual(7, interp.Context.Outcome); } using (var freezer = new CilFreezer<MyCalc>()) { Pipe<MyCalc> code = freezer.Compile("1 + 2 * 3"); var context = new MyCalc(); Assert.AreEqual(7, code(context).Outcome); } }
public static void Main(string[] args) { var context = new NestedCommentSyntax(); using (var interp = new Interpreter<NestedCommentSyntax>(context)) { interp.LoggingKind = LoggingKind.Console; const string text = "/*/* /* foo *//* middle */ * / * */ bar */"; bool success = interp.Parse(text); if (success) { Console.WriteLine("Comment text is:"); Console.WriteLine(context.Result); } } }
public void Test() { var context = new SAdBLang(); using (var interp = new Interpreter<SAdBLang>(context)) { interp.Parse("d"); Assert.IsTrue(context.IsFinalRuleCalledLast); Assert.IsTrue(context.WasMergeCalled); // with SPPF producer var sppf = interp.BuildTree("d"); using (var graph = new GvGraphView(typeof(SAdBLang).Name + "_sppf.gv")) { sppf.WriteGraph(graph, interp.Grammar, true); } } }
public void HeatupTest() { var filePath = DataSamples.CompileSample1FilePath; var source = new StreamReader(filePath); ILanguageRuntime lang; // Get language { var timer0 = new Stopwatch(); timer0.Start(); lang = Language.Get(typeof(ILLanguage)); timer0.Stop(); Trace.WriteLine("get lang: " + timer0.Elapsed); } // Cold state: Slow because of loading big methods: { var timer0 = new Stopwatch(); using (var interp = new Interpreter(lang)) { interp.LoggingKind = LoggingKind.None; timer0.Start(); interp.Parse(""); timer0.Stop(); } Trace.WriteLine("heatup: " + timer0.Elapsed); } // Hot state: should be fast { var timer0 = new Stopwatch(); using (var interp = new Interpreter(lang)) { interp.LoggingKind = LoggingKind.None; timer0.Start(); interp.Parse(""); timer0.Stop(); } Trace.WriteLine("heatup: " + timer0.Elapsed); } }
public void Test() { var lang = Language.Get(typeof(MyParser)); foreach (var value in new[] {0, 1, 2, 3, 4}) { using (var interp = new Interpreter<MyParser>()) { string input = value.ToString(); if (value == 2 || value == 4) { input = Prefix + input + Suffix; } interp.Parse(input); Assert.AreEqual(value, interp.Context.StartChoice); } } }
public static int Main(string[] args) { if (args.Length != 1) { Console.ForegroundColor = ConsoleColor.Red; Console.Error.WriteLine("Argument should be path to the BNF file."); Console.ResetColor(); return 1; } string path = args[0]; if (!File.Exists(path)) { Console.ForegroundColor = ConsoleColor.Red; Console.Error.WriteLine("File does not exist."); Console.ResetColor(); return 1; } string destBaseName = Path.GetFileNameWithoutExtension(path); using (var interpreter = new Interpreter<BnfLanguage>(Bnf2CSharpConverter.Create(destBaseName))) using (var input = new StreamReader(path)) { interpreter.LoggingKind = LoggingKind.Console; if (interpreter.Parse(input, path)) { Console.WriteLine("Conversion succeeded!"); } else { Console.WriteLine( "============= {0} errors, {1} warnings ===========", interpreter.ErrorCount, interpreter.WarningCount); } } return 0; }
public static void Main(string[] args) { var context = new Calculator(); using (var interp = new Interpreter<Calculator>(context)) { interp.LoggingKind = LoggingKind.Console; while (true) { Console.Write("calc>"); var expr = Console.ReadLine(); try { interp.Parse(expr); if (context.Done) { break; } if (interp.ErrorCount == 0) { Console.WriteLine(context.Result); } } catch (Exception error) { while (error.InnerException != null) { error = error.InnerException; } Console.WriteLine(error.Message); } } } }
private void Parse(ILanguageRuntime lang, string input) { using (var interp = new Interpreter(context, lang)) { interp.LoggingKind = LoggingKind.Collect; interp.Parse(input); errorCount = interp.ErrorCount; } }
private static void Benchmarks( string path, string title, Type langDef, int trialCount = 1, BenchFlags flags = BenchFlags.All) { var timer = new Stopwatch(); timer.Start(); var lang = Language.Get(langDef); using (var interp = new Interpreter(lang)) { interp.Parse("a+a"); } timer.Stop(); Log("--------------- " + title + " ---------------"); Log("heatup time = {0}", timer.Elapsed); timer.Reset(); using (var testFile = new StreamReader(path)) { timer.Start(); testFile.ReadToEnd(); timer.Stop(); Log("read time = {0}", timer.Elapsed); } using (var interp = new Interpreter(lang)) { for (int trial = 0; trial != trialCount; ++trial) { timer.Reset(); using (var testFile = new StreamReader(path)) { timer.Start(); int count = interp.Scan(testFile, path).Count(); timer.Stop(); Log("scan time = {0} tokenCount = {1}", timer.Elapsed, count); } } // Recognize if ((flags & BenchFlags.Recognize) == BenchFlags.Recognize) { for (int trial = 0; trial != trialCount; ++trial) { timer.Reset(); using (var testFile = new StreamReader(path)) { timer.Start(); bool success = interp.Recognize(testFile, path); timer.Stop(); Assert.IsTrue(success); Log("parse (recognize) = {0}", timer.Elapsed); } } } // Parse actions if ((flags & BenchFlags.ParseActions) == BenchFlags.ParseActions) { for (int trial = 0; trial != trialCount; ++trial) { timer.Reset(); using (var testFile = new StreamReader(path)) { timer.Start(); bool success = interp.Parse(testFile, path); timer.Stop(); Assert.IsTrue(success); Log("parse (actions) = {0}", timer.Elapsed); } } } // Parse tree if ((flags & BenchFlags.ParseTree) == BenchFlags.ParseTree) { for (int trial = 0; trial != trialCount; ++trial) { timer.Reset(); using (var testFile = new StreamReader(path)) { timer.Start(); interp.BuildTree(testFile, path); timer.Stop(); Log("parse (tree) = {0}", timer.Elapsed); } } } } }
private static string BuildAndRun(string filePath) { ILLanguage backend = new CecilBackendLanguage(filePath); using (var interpreter = new Interpreter<ILLanguage>(backend)) using (var source = new StreamReader(filePath)) { if (!interpreter.Parse(source, filePath)) { throw new AssertionException("Parsing of file " + filePath + " failed!"); } } backend.Save(); return ProgramExecutor.Execute(Path.GetFileNameWithoutExtension(filePath) + ".exe"); }
private AstNode GetAst(string pattern) { var context = new ScannerSyntax(); using (var interp = new Interpreter<ScannerSyntax>(context)) { interp.CustomLogging = this.logging; if (!interp.Parse(pattern)) { return AstNode.Stub; } AstNode root = context.Result.Node; return root; } }