From f7165325f7a24871d29c9e785be5709670116c8b Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Sun, 20 Oct 2013 02:30:59 +0000 Subject: [PATCH 01/54] Created team project folder $/csmic via the Team Project Creation Wizard From c41167bfc43ff715f75df296e957212a92bc871b Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Sun, 20 Oct 2013 03:46:38 +0000 Subject: [PATCH 02/54] Migrating from Sourceforge to Codeplex. Initial checkin starting with version 1.1.5.0 source code. --- CS-MIC/csmic/CSMICTests/AuthoringTests.txt | 136 +++ CS-MIC/csmic/CSMICTests/CSMICTests.csproj | 120 +++ .../csmic/CSMICTests/CSMICTests.csproj.vspscc | 10 + .../csmic/CSMICTests/InputInterpreterTest.cs | 216 +++++ .../CSMICTests/Properties/AssemblyInfo.cs | 35 + .../CSMICTests/Test References/csmic.accessor | 2 + CS-MIC/csmic/HelpFile/HelpFile.shfbproj | 87 ++ .../csmic/HelpFile/HelpFile.shfbproj.vspscc | 10 + CS-MIC/csmic/csmic.sln | 54 ++ CS-MIC/csmic/csmic.vssscc | 10 + CS-MIC/csmic/csmic/CodedFunctionFactory.cs | 24 + CS-MIC/csmic/csmic/CodedFunctions/CF_Abs.cs | 49 ++ CS-MIC/csmic/csmic/CodedFunctions/CF_Cos.cs | 49 ++ CS-MIC/csmic/csmic/CodedFunctions/CF_Exp.cs | 49 ++ CS-MIC/csmic/csmic/CodedFunctions/CF_Log.cs | 57 ++ .../csmic/CodedFunctions/CF_Precision.cs | 50 ++ CS-MIC/csmic/csmic/CodedFunctions/CF_Round.cs | 49 ++ CS-MIC/csmic/csmic/CodedFunctions/CF_Sin.cs | 49 ++ CS-MIC/csmic/csmic/CodedFunctions/CF_Sqrt.cs | 49 ++ CS-MIC/csmic/csmic/CodedFunctions/CF_Tan.cs | 49 ++ CS-MIC/csmic/csmic/Computable/Computable.cs | 182 ++++ .../csmic/csmic/Extensions/CSMICExtension.cs | 178 ++++ CS-MIC/csmic/csmic/GenericCodedFunction.cs | 76 ++ CS-MIC/csmic/csmic/ICodedFunction.cs | 73 ++ CS-MIC/csmic/csmic/InputInterpreter.cs | 502 +++++++++++ CS-MIC/csmic/csmic/InterpretedFunction.cs | 151 ++++ .../csmic/InterpretedFunctionArgument.cs | 84 ++ .../csmic/csmic/InterpreterParser/CSMIC.atg | 369 ++++++++ .../csmic/csmic/InterpreterParser/Parser.cs | 534 ++++++++++++ .../csmic/InterpreterParser/Parser.frame | 160 ++++ .../csmic/csmic/InterpreterParser/Scanner.cs | 491 +++++++++++ .../csmic/InterpreterParser/Scanner.frame | 383 +++++++++ CS-MIC/csmic/csmic/MacroBuilder.cs | 337 ++++++++ CS-MIC/csmic/csmic/MacroOperation.cs | 149 ++++ CS-MIC/csmic/csmic/Properties/AssemblyInfo.cs | 36 + CS-MIC/csmic/csmic/ScriptParser/Parser.cs | 798 ++++++++++++++++++ CS-MIC/csmic/csmic/ScriptParser/Parser.frame | 160 ++++ CS-MIC/csmic/csmic/ScriptParser/Scanner.cs | 637 ++++++++++++++ CS-MIC/csmic/csmic/ScriptParser/Scanner.frame | 383 +++++++++ CS-MIC/csmic/csmic/ScriptParser/Scripting.atg | 525 ++++++++++++ CS-MIC/csmic/csmic/Variable.cs | 100 +++ CS-MIC/csmic/csmic/csmic.csproj | 136 +++ CS-MIC/csmic/csmic/csmic.csproj.vspscc | 10 + CS-MIC/csmic/csmic/csmic_open.snk | Bin 0 -> 596 bytes 44 files changed, 7608 insertions(+) create mode 100644 CS-MIC/csmic/CSMICTests/AuthoringTests.txt create mode 100644 CS-MIC/csmic/CSMICTests/CSMICTests.csproj create mode 100644 CS-MIC/csmic/CSMICTests/CSMICTests.csproj.vspscc create mode 100644 CS-MIC/csmic/CSMICTests/InputInterpreterTest.cs create mode 100644 CS-MIC/csmic/CSMICTests/Properties/AssemblyInfo.cs create mode 100644 CS-MIC/csmic/CSMICTests/Test References/csmic.accessor create mode 100644 CS-MIC/csmic/HelpFile/HelpFile.shfbproj create mode 100644 CS-MIC/csmic/HelpFile/HelpFile.shfbproj.vspscc create mode 100644 CS-MIC/csmic/csmic.sln create mode 100644 CS-MIC/csmic/csmic.vssscc create mode 100644 CS-MIC/csmic/csmic/CodedFunctionFactory.cs create mode 100644 CS-MIC/csmic/csmic/CodedFunctions/CF_Abs.cs create mode 100644 CS-MIC/csmic/csmic/CodedFunctions/CF_Cos.cs create mode 100644 CS-MIC/csmic/csmic/CodedFunctions/CF_Exp.cs create mode 100644 CS-MIC/csmic/csmic/CodedFunctions/CF_Log.cs create mode 100644 CS-MIC/csmic/csmic/CodedFunctions/CF_Precision.cs create mode 100644 CS-MIC/csmic/csmic/CodedFunctions/CF_Round.cs create mode 100644 CS-MIC/csmic/csmic/CodedFunctions/CF_Sin.cs create mode 100644 CS-MIC/csmic/csmic/CodedFunctions/CF_Sqrt.cs create mode 100644 CS-MIC/csmic/csmic/CodedFunctions/CF_Tan.cs create mode 100644 CS-MIC/csmic/csmic/Computable/Computable.cs create mode 100644 CS-MIC/csmic/csmic/Extensions/CSMICExtension.cs create mode 100644 CS-MIC/csmic/csmic/GenericCodedFunction.cs create mode 100644 CS-MIC/csmic/csmic/ICodedFunction.cs create mode 100644 CS-MIC/csmic/csmic/InputInterpreter.cs create mode 100644 CS-MIC/csmic/csmic/InterpretedFunction.cs create mode 100644 CS-MIC/csmic/csmic/InterpretedFunctionArgument.cs create mode 100644 CS-MIC/csmic/csmic/InterpreterParser/CSMIC.atg create mode 100644 CS-MIC/csmic/csmic/InterpreterParser/Parser.cs create mode 100644 CS-MIC/csmic/csmic/InterpreterParser/Parser.frame create mode 100644 CS-MIC/csmic/csmic/InterpreterParser/Scanner.cs create mode 100644 CS-MIC/csmic/csmic/InterpreterParser/Scanner.frame create mode 100644 CS-MIC/csmic/csmic/MacroBuilder.cs create mode 100644 CS-MIC/csmic/csmic/MacroOperation.cs create mode 100644 CS-MIC/csmic/csmic/Properties/AssemblyInfo.cs create mode 100644 CS-MIC/csmic/csmic/ScriptParser/Parser.cs create mode 100644 CS-MIC/csmic/csmic/ScriptParser/Parser.frame create mode 100644 CS-MIC/csmic/csmic/ScriptParser/Scanner.cs create mode 100644 CS-MIC/csmic/csmic/ScriptParser/Scanner.frame create mode 100644 CS-MIC/csmic/csmic/ScriptParser/Scripting.atg create mode 100644 CS-MIC/csmic/csmic/Variable.cs create mode 100644 CS-MIC/csmic/csmic/csmic.csproj create mode 100644 CS-MIC/csmic/csmic/csmic.csproj.vspscc create mode 100644 CS-MIC/csmic/csmic/csmic_open.snk diff --git a/CS-MIC/csmic/CSMICTests/AuthoringTests.txt b/CS-MIC/csmic/CSMICTests/AuthoringTests.txt new file mode 100644 index 0000000..64bab94 --- /dev/null +++ b/CS-MIC/csmic/CSMICTests/AuthoringTests.txt @@ -0,0 +1,136 @@ +========================================================================== + Visual Studio Team System: Overview of Authoring and Running Tests +========================================================================== + +This overview describes the features for authoring and running tests in +Visual Studio Team System and Visual Studio Team Edition for Software Testers. + +Opening Tests +------------- +To open a test, open a test project or a test metadata file (a file with +extension .vsmdi) that contains the definition of the test. You can find +test projects and metadata files in Solution Explorer. + +Viewing Tests +------------- +To see which tests are available to you, open the Test View window. Or, +if you have installed Team Edition for Software Testers, you can also open +the Test List Editor window to view tests. + +To open the Test View window, click the Test menu, point to Windows, and +then click Test View. To open the Test List Editor window (if you have +installed Team Edition for Software Testers), click Test, point to Windows, +and then click Test List Editor. + +Running Tests +------------- +You can run tests from the Test View window and the Test List Editor window. +See Viewing Tests to learn how to open these windows. To run one or more +tests displayed in the Test View window, first select the tests in that +window; to select multiple tests, hold either the Shift or CTRL key while +clicking tests. Then click the Run Tests button in the Test View window +toolbar. + +If you have installed Visual Studio Team Edition for Software Testers, you can +also use the Test List Editor window to run tests. To run tests in Test List Editor, +select the check box next to each test that you want to run. Then click the +Run Tests button in the Test List Editor window toolbar. + +Viewing Test Results +-------------------- +When you run a test or a series of tests, the results of the test run will be +shown in the Test Results window. Each individual test in the run is shown on +a separate line so that you can see its status. The window contains an +embedded status bar in the top half of the window that provides you with +summary details of the complete test run. + +To see more detailed results for a particular test result, double-click it in +the Test Results window. This opens a window that provides more information +about the particular test result, such as any specific error messages returned +by the test. + +Changing the way that tests are run +----------------------------------- +Each time you run one or more tests, a collection of settings is used to +determine how those tests are run. These settings are contained in a “test +run configuration” file. + +Here is a partial list of the changes you can make with a test run +configuration file: + + - Change the naming scheme for each test run. + - Change the test controller that the tests are run on so that you can run + tests remotely. + - Gather code coverage data for the code being tested so that you can see + which lines of code are covered by your tests. + - Enable and disable test deployment. + - Specify additional files to deploy before tests are run. + - Select a different host, ASP.NET, for running ASP.NET unit tests. + - Select a different host, the smart device test host, for running smart device unit tests. + - Set various properties for the test agents that run your tests. + - Run custom scripts at the start and end of each test run so that you can + set up the test environment exactly as required each time tests are run. + - Set time limits for tests and test runs. + - Set the browser mix and the number of times to repeat Web tests in the + test run. + +By default, a test run configuration file is created whenever you create a +new test project. You make changes to this file by double-clicking it in +Solution Explorer and then changing its settings. (Test run configuration +files have the extension .testrunconfig.) + +A solution can contain multiple test run configuration files. Only one of +those files, known as the “Active” test run configuration file, is used to +determine the settings that are currently used for test runs. You select +the active test run configuration by clicking Select Active Test Run +Configuration on the Test menu. + +------------------------------------------------------------------------------- + +Test Types +---------- +Using Visual Studio Team Edition for Software Testers, you can create a number +of different test types: + +Unit test: Use a unit test to create a programmatic test in C++, Visual C# or +Visual Basic that exercises source code. A unit test calls the methods of a +class, passing suitable parameters, and verifies that the returned value is +what you expect. +There are three specialized variants of unit tests: + - Data-driven unit tests are created when you configure a unit test to be + called repeatedly for each row of a data source. The data from each row + is used by the unit test as input data. + - ASP.NET unit tests are unit tests that exercise code in an ASP.NET Web + application. + - Smart device unit tests are unit tests that are deployed to a smart device + or emulator and then executed by the smart device test host. + +Web Test: Web tests consist of an ordered series of HTTP requests that you +record in a browser session using Microsoft Internet Explorer. You can have +the test report specific details about the pages or sites it requests, such +as whether a particular page contains a specified string. + +Load Test: You use a load test to encapsulate non-manual tests, such as +unit, Web, and generic tests, and then run them simultaneously by using +virtual users. Running these tests under load generates test results, +including performance and other counters, in tables and in graphs. + +Generic test: A generic test is an existing program wrapped to function as a +test in Visual Studio. The following are examples of tests or programs that +you can turn into generic tests: + - An existing test that uses process exit codes to communicate whether the + test passed or failed. 0 indicates passing and any other value indicates + a failure. + - A general program to obtain specific functionality during a test scenario. + - A test or program that uses a special XML file (called a “summary results + file”), to communicate detailed results. + +Manual test: The manual test type is used when the test tasks are to be +completed by a test engineer as opposed to an automated script. + +Ordered test: Use an ordered test to execute a set of tests in an order you +specify. + +------------------------------------------------------------------------------- + + diff --git a/CS-MIC/csmic/CSMICTests/CSMICTests.csproj b/CS-MIC/csmic/CSMICTests/CSMICTests.csproj new file mode 100644 index 0000000..000d928 --- /dev/null +++ b/CS-MIC/csmic/CSMICTests/CSMICTests.csproj @@ -0,0 +1,120 @@ + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {C03AD9DF-630F-4C88-A9D4-8B4B450CCB54} + Library + Properties + CSMICTests + CSMICTests + v4.0 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + 3.5 + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + SAK + SAK + SAK + SAK + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + AllRules.ruleset + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + AllRules.ruleset + + + + + + 3.5 + + + + 3.5 + + + + 3.5 + + + + + + + + + + + + {7BBA4BA2-E885-4D89-8710-F1A609616B7D} + csmic + + + + + + + + False + Microsoft .NET Framework 4 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 3.1 + true + + + + + \ No newline at end of file diff --git a/CS-MIC/csmic/CSMICTests/CSMICTests.csproj.vspscc b/CS-MIC/csmic/CSMICTests/CSMICTests.csproj.vspscc new file mode 100644 index 0000000..feffdec --- /dev/null +++ b/CS-MIC/csmic/CSMICTests/CSMICTests.csproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/CS-MIC/csmic/CSMICTests/InputInterpreterTest.cs b/CS-MIC/csmic/CSMICTests/InputInterpreterTest.cs new file mode 100644 index 0000000..78aeca9 --- /dev/null +++ b/CS-MIC/csmic/CSMICTests/InputInterpreterTest.cs @@ -0,0 +1,216 @@ +using csmic; +using csmic.Extensions; +using System.Text; +using Microsoft.VisualStudio.TestTools.UnitTesting; +namespace CSMICTests +{ + + + /// + ///This is a test class for InputInterpreterTest and is intended + ///to contain all InputInterpreterTest Unit Tests + /// + [TestClass()] + public class InputInterpreterTest + { + + + private TestContext testContextInstance; + + /// + ///Gets or sets the test context which provides + ///information about and functionality for the current test run. + /// + public TestContext TestContext + { + get + { + return testContextInstance; + } + set + { + testContextInstance = value; + } + } + + #region Additional test attributes + // + //You can use the following additional attributes as you write your tests: + // + //Use ClassInitialize to run code before running the first test in the class + //[ClassInitialize()] + //public static void MyClassInitialize(TestContext testContext) + //{ + //} + // + //Use ClassCleanup to run code after all tests in a class have run + //[ClassCleanup()] + //public static void MyClassCleanup() + //{ + //} + // + //Use TestInitialize to run code before running each test + //[TestInitialize()] + //public void MyTestInitialize() + //{ + //} + // + //Use TestCleanup to run code after each test has run + //[TestCleanup()] + //public void MyTestCleanup() + //{ + //} + // + #endregion + + + /// + ///A test for Interpret + /// + [TestMethod()] + public void InterpretTest() + { + InputInterpreter target = new InputInterpreter(); + target.CodedFunctions.Add(CodedFunctionFactory.Create("addfive", 1, rf => rf[0] + 5)); + + //HighLoadTest(target, "+1"); + //HighLoadTest(target, "+sin(1)"); + //HighLoadTest(target, "+precision(0.123456789, 7)"); + //HighLoadTest(target, "+2*(2 + 5)/tan(sin(4))"); + //HighLoadTest(target, "+2*2/3-1.23456"); + + ExpressionDecimalTest(target, "2+2", 4); + ExpressionDecimalTest(target, "1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10", 55); + ExpressionDecimalTest(target, "4 + 2 / 1 - 3 * 2", 0); + ExpressionDecimalTest(target, "16*2 - 2*3", 26); + ExpressionDecimalTest(target, "7-6+3*2", 7); + ExpressionDecimalTest(target, "1/-2*-1", 0.5M); + ExpressionDecimalTest(target, "12 + 26 / -2 + 3", 2); + ExpressionDecimalTest(target, "0.02395/1000", 0.00002395M); + ExpressionDecimalTest(target, "0100010101b", 277); + ExpressionDecimalTest(target, "0xabcdef", 11259375); + ExpressionDecimalTest(target, "11111111b + 0xFF", 510); + ExpressionDecimalTest(target, "10011001b * 0x01bAc", 1083852); + + ExpressionDecimalTest(target, "log(sin(((25*200) - 5000)^1943),2)", decimal.MinValue); + ExpressionDecimalTest(target, "log(cos(((25*200) - 5000)^1943),2)", 0); + ExpressionDecimalTest(target, "cos(2^3)", -0.145500033808614M); + ExpressionDecimalTest(target, "addfive(30)", 35); + ExpressionDecimalTest(target, "precision(1.23456789, 4)", 1.2346M); + ExpressionDecimalTest(target, "3000 * (log(1 + 3162, 2))", 34881.2335215522M); + ExpressionDecimalTest(target, "(((12)))", 12); + + ExpressionOutputTest(target, "z := (3*x) - (2*y)", "(3*x)-(2*y)"); + ExpressionOutputTest(target, "x :: 3", "3"); + ExpressionOutputTest(target, "y :: 2", "2"); + ExpressionOutputTest(target, "x", "3"); + ExpressionOutputTest(target, "y", "2"); + ExpressionOutputTest(target, "z", "5"); + ExpressionOutputTest(target, "z + 2", "7"); + ExpressionOutputTest(target, "y :: 3", "3"); + ExpressionOutputTest(target, "z", "3"); + ExpressionOutputTest(target, "arr -> [3,6,9,12]", "3,6,9,12"); + ExpressionOutputTest(target, "arr[1]", "6"); + ExpressionOutputTest(target, "arr[1+1]", "9"); + ExpressionOutputTest(target, "arr[2+44]", "0"); + + ExpressionOutputTest(target, "log(sin(((25*200) - 5000)^1943),2)", "log(sin(((25*200) - 5000)^1943),2)".Interpret()); + ExpressionOutputTest(target, "log(cos(((25*200) - 5000)^1943),2)", "log(cos(((25*200) - 5000)^1943),2)".Interpret()); + + } + + [TestMethod] + public void AsyncTest() + { + InputInterpreter interpreter = new InputInterpreter(); + interpreter.InterpretAsync("2 + 2", i => + { + Assert.IsTrue(i.Output == "4"); + }); + } + + [TestMethod] + public void ComputableTest() + { + InputInterpreter interpreter = new InputInterpreter(); + + interpreter.Interpret("1"); + Assert.IsTrue(interpreter.AsComputable(c => c.Add(5)).Resolve().Decimal == 6); + Assert.IsTrue(interpreter.AsComputable(c => c.Subtract(5)).Resolve().Decimal == 1); + Assert.IsTrue(interpreter.AsComputable(c => c.Multiply(5)).Resolve().Decimal == 5); + Assert.IsTrue(interpreter.AsComputable(c => c.Divide(1)).Resolve().Decimal == 5); + Assert.IsTrue(interpreter.AsComputable(c => c.Mod(1)).Resolve().Decimal == 0); + Assert.IsTrue(interpreter.AsComputable(c => c.RaiseToPower(5)).Resolve().Decimal == 0); + + interpreter.Interpret("1"); + Assert.IsTrue(interpreter.ToComputable().Add(5).Resolve().Decimal == 6); + Assert.IsTrue(interpreter.ToComputable().Subtract(5).Resolve().Decimal == 1); + Assert.IsTrue(interpreter.ToComputable().Multiply(5).Resolve().Decimal == 5); + Assert.IsTrue(interpreter.ToComputable().Divide(1).Resolve().Decimal == 5); + Assert.IsTrue(interpreter.ToComputable().Mod(1).Resolve().Decimal == 0); + Assert.IsTrue(interpreter.ToComputable().RaiseToPower(5).Resolve().Decimal == 0); + + interpreter.Interpret("1"); + Assert.IsTrue(interpreter.AsComputable(c => c.Add(5)).ResolveTo(i => i.Decimal) == 6); + Assert.IsTrue(interpreter.AsComputable(c => c.Subtract(5)).ResolveTo(i => i.Int) == 1); + + interpreter.Interpret("5"); + int[] ia = new int[] { 1,2,3 }; + var test = interpreter.AsComputable(computable => computable.ForAll(ia, sub => sub.RaiseToPower)).Resolve(); + Assert.IsTrue(test.Output == "15625"); + } + + /// + /// Tests a value repeated 10,000 times and checks for an execution time less than 200 milliseconds. + /// + /// The input interpreter. + /// The value to repeat and test. + public void HighLoadTest(InputInterpreter target, string value) + { + StringBuilder builder = new StringBuilder(); + string input = string.Empty; + System.TimeSpan baseTime = new System.TimeSpan(); + for (int i = 0; i < 1000; i++) + { + builder.Append(value); + } + input = builder.ToString(); + target.Interpret(input); + baseTime = target.LastExecutionTime; + + builder = new StringBuilder(); + for (int i = 0; i < 100000; i++) + { + builder.Append(value); + } + input = builder.ToString(); + target.Interpret(input); + + Assert.IsTrue(target.LastExecutionTime <= System.TimeSpan.FromTicks((baseTime.Ticks + 1 * 100) + 100), string.Format("{0} failed the high load test.", value)); + } + + /// + /// Tests a given expression for a decimal result. + /// + /// The input interpreter. + /// The input to execute. + /// The expected value. + public void ExpressionDecimalTest(InputInterpreter target, string input, decimal expected) + { + target.Interpret(input); + Assert.AreEqual(expected, target.Decimal, string.Format("{0} returned {1} but {2} was expected.", input, target.Decimal, expected)); + } + + /// + /// Tests a given expression for a string result. + /// + /// The input interpreter. + /// The input to execute. + /// The expected value. + public void ExpressionOutputTest(InputInterpreter target, string input, string expected) + { + target.Interpret(input); + Assert.AreEqual(expected, target.Output, string.Format("{0} returned {1} but {2} was expected.", input, target.Decimal, expected)); + } + } +} diff --git a/CS-MIC/csmic/CSMICTests/Properties/AssemblyInfo.cs b/CS-MIC/csmic/CSMICTests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..4c637fa --- /dev/null +++ b/CS-MIC/csmic/CSMICTests/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("CSMICTests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("CSMICTests")] +[assembly: AssemblyCopyright("Copyright © 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM componenets. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("8e6bded0-27ba-4d6b-a785-988958ca4b10")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/CS-MIC/csmic/CSMICTests/Test References/csmic.accessor b/CS-MIC/csmic/CSMICTests/Test References/csmic.accessor new file mode 100644 index 0000000..67034e0 --- /dev/null +++ b/CS-MIC/csmic/CSMICTests/Test References/csmic.accessor @@ -0,0 +1,2 @@ +csmic.dll +Desktop diff --git a/CS-MIC/csmic/HelpFile/HelpFile.shfbproj b/CS-MIC/csmic/HelpFile/HelpFile.shfbproj new file mode 100644 index 0000000..5390394 --- /dev/null +++ b/CS-MIC/csmic/HelpFile/HelpFile.shfbproj @@ -0,0 +1,87 @@ + + + + + Debug + AnyCPU + 2.0 + {b60970b9-771a-4ebb-9978-89f55163888f} + 1.9.5.0 + + HelpFile + HelpFile + HelpFile + + .\Help\ + csmic_help + en-US + HtmlHelp1, Website + False + .NET Framework 4.0 + True + False + False + True + Standard + Blank + csmic + True + VS2010 + False + Guid + CS-MIC - C Sharp Math Input Control + Please visit the &lt%3ba href=&quot%3bhttp://cs-mic.com&quot%3b&gt%3bofficial site&lt%3b/a&gt%3b for more information. + Please feel free to provide feedback! + jordan%40jordanwages.com + Copyright 2012 + AboveNamespaces + Msdn + Msdn + True + True + CS-MIC is a .NET library written in C# designed to give developers easy access to expression parsing. For many developers, there is no need to involve complicated settings and formats. With few exposed methods and objects, CS-MIC makes basic expression solving as simple as possible with as little logic required from developers as possible. In fact, one can pull a value with only one line of code. + Attributes, ExplicitInterfaceImplementations, InheritedMembers, InheritedFrameworkMembers, Internals, Protected, SealedProtected + + + + + + + + + + + + + + + SAK + SAK + SAK + SAK + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CS-MIC/csmic/HelpFile/HelpFile.shfbproj.vspscc b/CS-MIC/csmic/HelpFile/HelpFile.shfbproj.vspscc new file mode 100644 index 0000000..feffdec --- /dev/null +++ b/CS-MIC/csmic/HelpFile/HelpFile.shfbproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/CS-MIC/csmic/csmic.sln b/CS-MIC/csmic/csmic.sln new file mode 100644 index 0000000..09de5d8 --- /dev/null +++ b/CS-MIC/csmic/csmic.sln @@ -0,0 +1,54 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "csmic", "csmic\csmic.csproj", "{7BBA4BA2-E885-4D89-8710-F1A609616B7D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSMICTests", "CSMICTests\CSMICTests.csproj", "{C03AD9DF-630F-4C88-A9D4-8B4B450CCB54}" +EndProject +Project("{7CF6DF6D-3B04-46F8-A40B-537D21BCA0B4}") = "HelpFile", "HelpFile\HelpFile.shfbproj", "{B60970B9-771A-4EBB-9978-89F55163888F}" +EndProject +Global + GlobalSection(TeamFoundationVersionControl) = preSolution + SccNumberOfProjects = 4 + SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} + SccTeamFoundationServer = https://tfs.codeplex.com/tfs/tfs35 + SccLocalPath0 = . + SccProjectUniqueName1 = csmic\\csmic.csproj + SccProjectName1 = csmic + SccLocalPath1 = csmic + SccProjectUniqueName2 = CSMICTests\\CSMICTests.csproj + SccProjectName2 = CSMICTests + SccLocalPath2 = CSMICTests + SccProjectUniqueName3 = HelpFile\\HelpFile.shfbproj + SccProjectName3 = HelpFile + SccLocalPath3 = HelpFile + EndGlobalSection + GlobalSection(TestCaseManagementSettings) = postSolution + CategoryFile = csmic8.vsmdi + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7BBA4BA2-E885-4D89-8710-F1A609616B7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7BBA4BA2-E885-4D89-8710-F1A609616B7D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7BBA4BA2-E885-4D89-8710-F1A609616B7D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7BBA4BA2-E885-4D89-8710-F1A609616B7D}.Release|Any CPU.Build.0 = Release|Any CPU + {C03AD9DF-630F-4C88-A9D4-8B4B450CCB54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C03AD9DF-630F-4C88-A9D4-8B4B450CCB54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C03AD9DF-630F-4C88-A9D4-8B4B450CCB54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C03AD9DF-630F-4C88-A9D4-8B4B450CCB54}.Release|Any CPU.Build.0 = Release|Any CPU + {B60970B9-771A-4EBB-9978-89F55163888F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B60970B9-771A-4EBB-9978-89F55163888F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B60970B9-771A-4EBB-9978-89F55163888F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B60970B9-771A-4EBB-9978-89F55163888F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(SubversionScc) = preSolution + Svn-Managed = True + Manager = AnkhSVN - Subversion Support for Visual Studio + EndGlobalSection +EndGlobal diff --git a/CS-MIC/csmic/csmic.vssscc b/CS-MIC/csmic/csmic.vssscc new file mode 100644 index 0000000..794f014 --- /dev/null +++ b/CS-MIC/csmic/csmic.vssscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROJECT" +} diff --git a/CS-MIC/csmic/csmic/CodedFunctionFactory.cs b/CS-MIC/csmic/csmic/CodedFunctionFactory.cs new file mode 100644 index 0000000..e72ce84 --- /dev/null +++ b/CS-MIC/csmic/csmic/CodedFunctionFactory.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic +{ + /// Coded function factory. + /// + /// This class generates new coded functions dynamically. + /// + public static class CodedFunctionFactory + { + /// Creates a new ICodedFunction interface object that implements the dynamic method described. + /// Name of the function. + /// Number of expected arguments. + /// The method body. + /// An ICodedFunction interface object. + public static ICodedFunction Create(string functionName, int numExpectedArguments, Func methodBody) + { + return new GenericCodedFunction(functionName, numExpectedArguments, methodBody); + } + } +} diff --git a/CS-MIC/csmic/csmic/CodedFunctions/CF_Abs.cs b/CS-MIC/csmic/csmic/CodedFunctions/CF_Abs.cs new file mode 100644 index 0000000..d459f55 --- /dev/null +++ b/CS-MIC/csmic/csmic/CodedFunctions/CF_Abs.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic.CodedFunctions +{ + /// + /// A coded implementation of the absolute value function. + /// + class CF_Abs : ICodedFunction + { + #region ICodedFunction Members + + /// + /// Expects 1 argument. + /// + public int NumExpectedArguments + { + get { return 1; } + } + + /// + /// The name of the function. + /// + public string FunctionName + { + get { return "abs"; } + } + + /// + /// Executes a code block. + /// + /// The arguments used in the code block. + /// The absolute value of the argument. + public decimal Execute(params decimal[] args) + { + decimal output = 0; + if (args.Length == this.NumExpectedArguments) + { + decimal input = args[0]; + output = Math.Abs(input); + } + return output; + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/CodedFunctions/CF_Cos.cs b/CS-MIC/csmic/csmic/CodedFunctions/CF_Cos.cs new file mode 100644 index 0000000..be0df91 --- /dev/null +++ b/CS-MIC/csmic/csmic/CodedFunctions/CF_Cos.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic.CodedFunctions +{ + /// + /// A coded implementation of the cosine function. + /// + class CF_Cos : ICodedFunction + { + #region ICodedFunction Members + + /// + /// Expects 1 argument. + /// + public int NumExpectedArguments + { + get { return 1; } + } + + /// + /// The name of the function. + /// + public string FunctionName + { + get { return "cos"; } + } + + /// + /// Executes a code block. + /// + /// The arguments used in the code block. + /// The cosine of the argument. + public decimal Execute(params decimal[] args) + { + decimal output = 0; + if (args.Length == this.NumExpectedArguments) + { + decimal input = args[0]; + output = (decimal)Math.Cos((double)input); + } + return output; + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/CodedFunctions/CF_Exp.cs b/CS-MIC/csmic/csmic/CodedFunctions/CF_Exp.cs new file mode 100644 index 0000000..e4cad95 --- /dev/null +++ b/CS-MIC/csmic/csmic/CodedFunctions/CF_Exp.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic.CodedFunctions +{ + /// + /// A coded implementation of the exponential function based on the constant e. + /// + class CF_Exp : ICodedFunction + { + #region ICodedFunction Members + + /// + /// Expects 1 argument. + /// + public int NumExpectedArguments + { + get { return 1; } + } + + /// + /// The name of the function. + /// + public string FunctionName + { + get { return "exp"; } + } + + /// + /// Executes a code block. + /// + /// The arguments used in the code block. + /// The constant e raised to the power of the argument. + public decimal Execute(params decimal[] args) + { + decimal output = 0; + if (args.Length == this.NumExpectedArguments) + { + decimal input = args[0]; + output = (decimal)Math.Exp((double)input); + } + return output; + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/CodedFunctions/CF_Log.cs b/CS-MIC/csmic/csmic/CodedFunctions/CF_Log.cs new file mode 100644 index 0000000..c938834 --- /dev/null +++ b/CS-MIC/csmic/csmic/CodedFunctions/CF_Log.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic.CodedFunctions +{ + /// + /// A coded implementation of the log function. + /// + class CF_Log : ICodedFunction + { + #region ICodedFunction Members + + /// + /// Expects 2 arguments. + /// + public int NumExpectedArguments + { + get { return 2; } + } + + /// + /// The name of the function. + /// + public string FunctionName + { + get { return "log"; } + } + + /// + /// Executes a code block. + /// + /// The arguments used in the code block. + /// The log of the first argument to the base of the second argument. + public decimal Execute(params decimal[] args) + { + decimal output = 0; + if (args.Length == this.NumExpectedArguments) + { + decimal input = args[0]; + decimal logBase = args[1]; + try + { + output = (decimal)Math.Log((double)input, (double)logBase); + } + catch + { + output = decimal.MinValue; + } + } + return output; + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/CodedFunctions/CF_Precision.cs b/CS-MIC/csmic/csmic/CodedFunctions/CF_Precision.cs new file mode 100644 index 0000000..b718082 --- /dev/null +++ b/CS-MIC/csmic/csmic/CodedFunctions/CF_Precision.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic.CodedFunctions +{ + /// + /// A coded implementation of a precision function. + /// + class CF_Precision : ICodedFunction + { + #region ICodedFunction Members + + /// + /// Expects 2 arguments. + /// + public int NumExpectedArguments + { + get { return 2; } + } + + /// + /// The name of the function. + /// + public string FunctionName + { + get { return "precision"; } + } + + /// + /// Executes a code block. + /// + /// The arguments used in the code block. + /// The first argument to the precision of the argument. + public decimal Execute(params decimal[] args) + { + decimal output = 0; + if (args.Length == this.NumExpectedArguments) + { + decimal input = args[0]; + decimal precision = args[1]; + output = (decimal)Math.Round(input, (int)precision); + } + return output; + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/CodedFunctions/CF_Round.cs b/CS-MIC/csmic/csmic/CodedFunctions/CF_Round.cs new file mode 100644 index 0000000..9d88fe5 --- /dev/null +++ b/CS-MIC/csmic/csmic/CodedFunctions/CF_Round.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic.CodedFunctions +{ + /// + /// A coded implementation of a rounded function. + /// + class CF_Round : ICodedFunction + { + #region ICodedFunction Members + + /// + /// Expects 1 argument. + /// + public int NumExpectedArguments + { + get { return 1; } + } + + /// + /// The name of the function. + /// + public string FunctionName + { + get { return "round"; } + } + + /// + /// Executes a code block. + /// + /// The arguments used in the code block. + /// The rounded argument. + public decimal Execute(params decimal[] args) + { + decimal output = 0; + if (args.Length == this.NumExpectedArguments) + { + decimal input = args[0]; + output = Math.Round(input); + } + return output; + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/CodedFunctions/CF_Sin.cs b/CS-MIC/csmic/csmic/CodedFunctions/CF_Sin.cs new file mode 100644 index 0000000..8b05729 --- /dev/null +++ b/CS-MIC/csmic/csmic/CodedFunctions/CF_Sin.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic.CodedFunctions +{ + /// + /// A coded implementation of the sine function. + /// + class CF_Sin : ICodedFunction + { + #region ICodedFunction Members + + /// + /// Expects 1 argument. + /// + public int NumExpectedArguments + { + get { return 1; } + } + + /// + /// The name of the function. + /// + public string FunctionName + { + get { return "sin"; } + } + + /// + /// Executes a code block. + /// + /// The arguments used in the code block. + /// The sine of the argument. + public decimal Execute(params decimal[] args) + { + decimal output = 0; + if (args.Length == this.NumExpectedArguments) + { + decimal input = args[0]; + output = (decimal)Math.Sin((double)input); + } + return output; + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/CodedFunctions/CF_Sqrt.cs b/CS-MIC/csmic/csmic/CodedFunctions/CF_Sqrt.cs new file mode 100644 index 0000000..5de4871 --- /dev/null +++ b/CS-MIC/csmic/csmic/CodedFunctions/CF_Sqrt.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic.CodedFunctions +{ + /// + /// A coded implementation of the squre root function. + /// + class CF_Sqrt : ICodedFunction + { + #region ICodedFunction Members + + /// + /// Expects 1 argument. + /// + public int NumExpectedArguments + { + get { return 1; } + } + + /// + /// The name of the function. + /// + public string FunctionName + { + get { return "sqrt"; } + } + + /// + /// Executes a code block. + /// + /// The arguments used in the code block. + /// The square root of the argument. + public decimal Execute(params decimal[] args) + { + decimal output = 0; + if (args.Length == this.NumExpectedArguments) + { + decimal input = args[0]; + output = (decimal)Math.Sqrt((double)input); + } + return output; + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/CodedFunctions/CF_Tan.cs b/CS-MIC/csmic/csmic/CodedFunctions/CF_Tan.cs new file mode 100644 index 0000000..6527cbe --- /dev/null +++ b/CS-MIC/csmic/csmic/CodedFunctions/CF_Tan.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic.CodedFunctions +{ + /// + /// A coded implementation of the tangent function. + /// + class CF_Tan : ICodedFunction + { + #region ICodedFunction Members + + /// + /// Expects 1 argument. + /// + public int NumExpectedArguments + { + get { return 1; } + } + + /// + /// The name of the function. + /// + public string FunctionName + { + get { return "tan"; } + } + + /// + /// Executes a code block. + /// + /// The arguments used in the code block. + /// The tangent of the argument. + public decimal Execute(params decimal[] args) + { + decimal output = 0; + if (args.Length == this.NumExpectedArguments) + { + decimal input = args[0]; + output = (decimal)Math.Tan((double)input); + } + return output; + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/Computable/Computable.cs b/CS-MIC/csmic/csmic/Computable/Computable.cs new file mode 100644 index 0000000..323b9f7 --- /dev/null +++ b/CS-MIC/csmic/csmic/Computable/Computable.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic.ComputableEngine +{ + /// Computable class. + public sealed class Computable + { + #region Members + + /// The expression to be built. + private string expression; + /// The interpreter to act as a base. + private InputInterpreter interpreter; + + #region Constants + + /// The add symbol. + private const string ADD = "+"; + /// The substract symbol. + private const string SUBSTRACT = "-"; + /// The divide symbol. + private const string DIVIDE = "/"; + /// The multiply symbol. + private const string MULTIPLY = "*"; + /// The modifier symbol. + private const string MOD = "%"; + /// The power symbol. + private const string POWER = "^"; + + #endregion + + #endregion + + #region Properties + + /// Gets the expression. + /// The expression. + internal string Expression + { + get + { + return this.expression; + } + } + + #endregion + + #region Constructor + + /// Creates a Computable instance. + /// The expression. + /// The interpreter. + internal Computable(string expression, InputInterpreter interpreter) + { + this.expression = expression; + this.interpreter = interpreter; + } + + #endregion + + #region Methods + + /// Resolves the computable as an input interpreter having calculated the input. + /// The computable as an input interpreter. + public InputInterpreter Resolve() + { + this.interpreter.Interpret(this.Expression); + return this.interpreter; + } + + /// Resolve the computer to a type . + /// Generic type parameter. + /// The selector function. + /// . + public T ResolveTo(Func selector) + { + return selector(this.Resolve()); + } + + /// Form the operation given the operation constant and an argument. + /// The operation constant. + /// The argument. + /// A string with the given operation appended. + private string FormOperation(string operation, object argument) + { + return string.Format("({0} {1} {2})", this.Expression, operation, argument); + } + + /// Form the function with the current expression as the first argument, followed by . + /// The name of the function. + /// The arguments. + /// . + private string FormFunction(string name, object[] arguments) + { + return string.Format("{0}({1})", name, string.Join(",", this.Expression, arguments)); + } + + /// Adds addend. + /// The decimal to add. + /// A computable class after the addition. + public Computable Add(decimal addend) + { + this.expression = FormOperation(ADD, addend); + return this; + } + + /// Subtracts the subtrahend. + /// The subtrahend. + /// A computable class after the subtraction. + public Computable Subtract(decimal subtrahend) + { + this.expression = FormOperation(SUBSTRACT, subtrahend); + return this; + } + + /// Multiplies the multiplicand. + /// The multiplicand. + /// A computable class after the mulitplication. + public Computable Multiply(decimal multiplicand) + { + this.expression = FormOperation(MULTIPLY, multiplicand); + return this; + } + + /// Divides the divisor. + /// The divisor. + /// A computable class after the divison. + public Computable Divide(decimal divisor) + { + this.expression = FormOperation(DIVIDE, divisor); + return this; + } + + /// Mods using a given divisor. + /// The divisor. + /// A computable class after the mod. + public Computable Mod(decimal divisor) + { + this.expression = FormOperation(MOD, divisor); + return this; + } + + /// Raises to power of the given integer value. + /// The power. + /// A computable class after the power operation. + public Computable RaiseToPower(int power) + { + this.expression = FormOperation(POWER, power); + return this; + } + + /// Applies the function with the current expression as the first argument, followed by . + /// The name of the function. + /// The arguments. + /// A computable class after the function is applied. + public Computable ApplyFunction(string name, object[] arguments) + { + this.expression = FormFunction(name, arguments); + return this; + } + + /// Executes a command for all items in a collection. + /// Generic type parameter. + /// The items of type . + /// The action belonging to type . + /// . + public Computable ForAll(ICollection items, Func> action) + { + foreach (T item in items) + { + action(this)(item); + } + + return this; + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/Extensions/CSMICExtension.cs b/CS-MIC/csmic/csmic/Extensions/CSMICExtension.cs new file mode 100644 index 0000000..c999aa3 --- /dev/null +++ b/CS-MIC/csmic/csmic/Extensions/CSMICExtension.cs @@ -0,0 +1,178 @@ +using System; +using System.Collections.Generic; +using System.Collections.Concurrent; +using System.Linq; +using System.Text; + +namespace csmic.Extensions +{ + /// CS-MIC extension methods. + public static class CSMICExtension + { + #region String + + /// A string extension method that interprets as input the string that calls it. + /// The input to act on. + /// The output from the interpretation of the string. + public static string Interpret(this string input) + { + InputInterpreter interpreter = new InputInterpreter(); + interpreter.Interpret(input); + return interpreter.Output; + } + + /// A string extension method that executes as macro operation. + /// The script to act on. + /// The final output of the script. + public static string RunAsMacro(this string script) + { + MacroBuilder macro = new MacroBuilder(script, new InputInterpreter()); + return macro.FinalOutput; + } + + #endregion + + #region IEnumerable + + /// + /// A string extension method that interprets as input the string that calls it. + /// + /// The collection to act on. + /// The output from the interpretation of the string. + public static IEnumerable Interpret(this IEnumerable collection) + { + List computed = new List(); + InputInterpreter interpreter = new InputInterpreter(); + + foreach (string input in collection) + { + interpreter.Interpret(input); + computed.Add(interpreter.Output); + } + + return computed; + } + + /// + /// A string extension method that interprets as input the string that calls it. + /// + /// The collection to act on. + /// The action. + /// The output from the interpretation of the string. + public static IEnumerable Interpret(this IEnumerable collection, Action action) + { + List computed = new List(); + InputInterpreter interpreter = new InputInterpreter(); + + foreach (string input in collection) + { + interpreter.Interpret(input); + computed.Add(interpreter.Output); + action(interpreter); + } + + return computed; + } + + /// Enumerates input in this collection, returning a selection on the interpreter. + /// Generic type parameter. + /// The collection to act on. + /// The selection. + /// + /// An enumerator that allows foreach to be used to process interpret< t> in this + /// collection. + /// + public static IEnumerable Interpret(this IEnumerable collection, Func selection) + { + List computed = new List(); + InputInterpreter interpreter = new InputInterpreter(); + + foreach (string input in collection) + { + interpreter.Interpret(input); + computed.Add(selection(interpreter)); + } + + return computed; + } + + /// A string extension method that executes as macro operation. + /// The collection to act on. + /// The final output of the script. + public static MacroBuilder RunAsMacro(this IEnumerable collection) + { + return new MacroBuilder(string.Join(Environment.NewLine, collection.ToArray()), new InputInterpreter()); + } + + #endregion + + #region IEnumerable In Parallel + + /// Enumerates input in parallel in this collection. + /// The collection to act on. + /// + /// An enumerator that allows foreach to be used to process interpret in parallel in this + /// collection. + /// + public static IEnumerable InterpretInParallel(this IEnumerable collection) + { + ConcurrentBag bag = new ConcurrentBag(); + + collection.AsParallel().ForAll(input => + { + InputInterpreter interpreter = new InputInterpreter(); + interpreter.Interpret(input); + bag.Add(interpreter); + }); + + return bag; + } + + /// Enumerates input in parallel this collection, returning a selection on the interpreter. + /// Generic type parameter. + /// The collection to act on. + /// The selection. + /// + /// An enumerator that allows foreach to be used to process interpret in parallel< t> in + /// this collection. + /// + public static IEnumerable InterpretInParallel(this IEnumerable collection, Func selection) + { + ConcurrentBag bag = new ConcurrentBag(); + + collection.AsParallel().ForAll(input => + { + InputInterpreter interpreter = new InputInterpreter(); + interpreter.Interpret(input); + bag.Add(selection(interpreter)); + }); + + return bag; + } + + #endregion + + #region ParallelQuery + + /// + /// A string extension method that interprets as input the strings that calls it in parallel. + /// + /// The collection to act on. + /// The output from the interpretation of the string. + public static IEnumerable Interpret(this ParallelQuery collection) + { + ConcurrentBag bag = new ConcurrentBag(); + + collection.ForAll(input => + { + InputInterpreter interpreter = new InputInterpreter(); + interpreter.Interpret(input); + bag.Add(interpreter); + }); + + return bag; + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/GenericCodedFunction.cs b/CS-MIC/csmic/csmic/GenericCodedFunction.cs new file mode 100644 index 0000000..6e1f12a --- /dev/null +++ b/CS-MIC/csmic/csmic/GenericCodedFunction.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic +{ + /// + /// A generically coded implementation of the ICodedFunction interface. + /// + internal class GenericCodedFunction : ICodedFunction + { + #region Members + + /// Number of expected arguments. + private int numExpectedArguments; + /// Name of the function. + private string functionName; + /// The method body. + private Func methodBody; + + #endregion + + #region Constructor + + /// Constructor. + /// Name of the function. + /// Number of expected arguments. + /// The method body. + internal GenericCodedFunction(string functionName, int numExpectedArguments, Func methodBody) + { + this.functionName = functionName; + this.numExpectedArguments = numExpectedArguments; + this.methodBody = methodBody; + } + + #endregion + + #region ICodedFunction Members + + /// Gets the number of expected arguments. + /// The total number of expected arguments. + public int NumExpectedArguments + { + get + { + return this.numExpectedArguments; + } + } + + /// Gets the name of the function. + /// The name of the function. + public string FunctionName + { + get + { + return this.functionName; + } + } + + /// Executes a code block that computes the value of the function. + /// A variable-length parameters list containing arguments. + /// The decimal value computed by the function. + public decimal Execute(params decimal[] args) + { + if (this.methodBody != null) + { + return this.methodBody(args); + } + + throw new MissingMethodException(this.GetType().Name, this.functionName); + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/ICodedFunction.cs b/CS-MIC/csmic/csmic/ICodedFunction.cs new file mode 100644 index 0000000..4b827a4 --- /dev/null +++ b/CS-MIC/csmic/csmic/ICodedFunction.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic +{ + /// + /// Implements a function that is coded in the .Net environment. + /// + /// This interface is required to implement a method or function + /// that can be used by the CS-MIC inputInterpreter. It is worth noting that the + /// function's name will be the text that is used in the inputInterpreter as the + /// executable text. + public interface ICodedFunction + { + #region Properties + + /// + /// Gets the number of expected arguments. + /// + int NumExpectedArguments { get; } + /// + /// Gets the name of the function. + /// + /// The input inputInterpreter will use this function name as + /// executable text, expecting an opening and closing parenthesis following + /// it. + string FunctionName { get; } + + #endregion + + #region Methods + + /// + /// Executes a code block that computes the value of the function. + /// + /// An array of arguments passed to the function. + /// The decimal value computed by the function. + /// Any code block is valid. Error handling must be done by the + /// developer, as the inputInterpreter cannot determine if there is an error. + /// + /// This example shows how to implement the sine function through the interface's + /// Execute() function. + /// + /// public decimal Execute(params decimal[] args) + ///{ + /// //Set up an output variable. + /// decimal output = 0; + /// + /// //Check to see if the number or arguments recieved + /// //is equal to the number of arguments expected. + /// if (args.Length == this.NumExpectedArguments) + /// { + /// //Grab the argument and set a local variable for clarity. + /// decimal input = args[0]; + /// + /// //Set the output as a sine of the input. + /// output = (decimal)Math.Sin((double)input); + /// } + /// + /// //Return the output. The function will return the sine if the arguments + /// //matched what was expected, and will return 0 otherwise. Returning 0 on + /// //errors is the standard in CS-MIC. + /// return output; + ///} + /// + /// + decimal Execute(params decimal[] args); + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/InputInterpreter.cs b/CS-MIC/csmic/csmic/InputInterpreter.cs new file mode 100644 index 0000000..c13d8f1 --- /dev/null +++ b/CS-MIC/csmic/csmic/InputInterpreter.cs @@ -0,0 +1,502 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Linq; +using System.Text.RegularExpressions; +using System.IO; +using System.Threading; +using csmic.CodedFunctions; +using csmic.Interpreter; +using csmic.ComputableEngine; +using System.Runtime.Remoting.Messaging; + +// namespace: csmic +// +// summary: . +namespace csmic +{ + /// + /// An interpreter object that reads user input and evaluates the code. + /// + /// The interpreter does not support exceptions by design. Instead, invalid + /// calculations, parameters, etc. will result in a result of zero. + /// + /// InputInterpreter interpreter = new InputInterpreter(); + /// interpreter.Interpret("1/0"); // The result will be 0, not an exception. + /// + /// + public class InputInterpreter + { + #region Members + + /// + /// The output generated. + /// + private string output; + /// + /// The variables assigned. + /// + internal Dictionary variables; + /// + /// The time for execution. + /// + private TimeSpan executionTime; + /// + /// The verbose message of the calculation. + /// + private string message; + /// + /// The list of coded functions that can be executed. + /// + private List codedFunctions; + /// + /// The list of user defined functions that can be executed. + /// + private List interpretedFunctions; + /// + /// The private calculated value. + /// + private decimal calculatedValue; + + #endregion + + #region Constructor + + /// + /// Creates a new InputInterpreter. + /// + public InputInterpreter() + { + this.output = string.Empty; + this.variables = new Dictionary(); + this.executionTime = new TimeSpan(); + this.codedFunctions = new List(); + this.interpretedFunctions = new List(); + LoadDefaultCodedFunctions(); + } + + /// + /// Creates a new InputInterpreter from an original. + /// + /// The orginal input interpreter to copy. + public InputInterpreter(InputInterpreter original) + { + this.output = original.output; + this.variables = original.variables; + this.executionTime = original.executionTime; + this.codedFunctions = original.codedFunctions; + this.interpretedFunctions = original.interpretedFunctions; + } + + #endregion + + #region Properties + + /// + /// Gets the message that represents the InputInterpreters output. + /// + public string Output + { + get + { + return this.output; + } + } + + /// + /// Gets the verbose message that is generated with a calculation. + /// + public string Message + { + get + { + return this.message; + } + } + + /// + /// Gets the value of the output as a decimal. + /// + public decimal Decimal + { + get + { + return this.calculatedValue; + } + } + + /// + /// Gets the value of the output cast as an int. + /// + public int Int + { + get + { + return (int)decimal.Round(this.calculatedValue); + } + } + + /// + /// Gets the value of the output cast as a float. + /// + public float Float + { + get + { + return (float)this.calculatedValue; + } + } + + /// + /// Gets the value of the output cast as a double. + /// + public double Double + { + get + { + return (double)this.calculatedValue; + } + } + + /// + /// Gets the value (cast as a long) converted to its binary equivalent. + /// + public string Binary + { + get + { + return Convert.ToString((long)this.calculatedValue, 2).PadLeft(64, '0'); + } + } + + /// + /// Gets the execution time of the last calculation. + /// + public TimeSpan LastExecutionTime + { + get + { + return this.executionTime; + } + } + + /// + /// Gets or sets a list of coded functions that the interpreter supports. + /// + public List CodedFunctions + { + get + { + return this.codedFunctions; + } + set + { + this.codedFunctions = value; + } + } + + /// + /// Gets or sets a list of user generated interpreted functions that the interpreter supports. + /// + /// The interpreted functions. + public List InterpretedFunctions + { + get + { + return this.interpretedFunctions; + } + set + { + this.interpretedFunctions = value; + } + } + + /// Gets the variables. + /// The variables. + public Dictionary Variables + { + get + { + return this.variables; + } + set + { + this.variables = value; + } + } + + #endregion + + #region Public Methods + + /// + /// Interprets and executes given input. + /// + /// The input to interpret and execute. + public void Interpret(string input) + { + if (string.IsNullOrEmpty(input)) + { + return; + } + + DateTime timeStart = DateTime.Now; + this.message = string.Empty; + + UTF8Encoding encoder = new UTF8Encoding(); + Parser p = new Parser(new Scanner(new MemoryStream(encoder.GetBytes(input)))); + p.Interpreter = this; + try + { + p.Parse(); + this.calculatedValue = p.CalculatedValue; + if (p.errors.count > 0) + { + ProduceOutput(this.calculatedValue, p.errors.builder.ToString()); + } + } + catch (Exception e) + { + this.calculatedValue = 0; + ProduceOutput(this.calculatedValue, e.Message); + } + + DateTime timeEnd = DateTime.Now; + this.executionTime = timeEnd - timeStart; + } + + /// + /// Computes an expression and returns the result as a decimal. + /// + /// The expression to be calculated. + /// The value that was computed. + public decimal ComputeExpression(string expression) + { + this.Interpret(expression); + return this.calculatedValue; + } + + /// + /// Assigns a decimal value to a variable. + /// + /// The name of the variable. + /// The value of the variable. + /// True if the variable was set, false otherwise. + internal bool Assign(string name, decimal value) + { + Variable v = new Variable(); + v.Type = VariableType.Decimal; + v.Value = value; + + if (!this.variables.ContainsKey(name)) + { + this.variables.Add(name, v); + } + else + { + this.variables[name] = v; + } + + return true; + } + + /// + /// Assigns a decimal value to a variable. + /// + /// The name of the variable. + /// The expression of the variable. + /// True if the variable was set, false otherwise. + internal bool Assign(string name, string expression) + { + Variable v = new Variable(); + v.Type = VariableType.Equation; + v.Value = expression; + + if (!this.variables.ContainsKey(name)) + { + this.variables.Add(name, v); + } + else + { + this.variables[name] = v; + } + + return true; + } + + /// + /// Assigns a decimal value to a variable. + /// + /// The name of the variable. + /// The values of the variable. + /// True if the variable was set, false otherwise. + internal bool Assign(string name, decimal[] values) + { + Variable v = new Variable(); + v.Type = VariableType.Array; + v.Value = values; + + if (!this.variables.ContainsKey(name)) + { + this.variables.Add(name, v); + } + else + { + this.variables[name] = v; + } + + return true; + } + + /// + /// Executes a function stored in the interpreter. + /// + /// The name of the function to execute. + /// The arguments to pass to the function. + /// The value computed from the function execution. + internal decimal ExecuteFunction(string name, decimal[] args) + { + foreach (ICodedFunction codedFunction in this.codedFunctions) + { + if (codedFunction.FunctionName == name) + { + return codedFunction.Execute(args); + } + } + + foreach (InterpretedFunction interpretedFunction in this.interpretedFunctions) + { + if (interpretedFunction.Name == name) + { + string answer = interpretedFunction.Compute(args); + decimal parsed = 0; + if (decimal.TryParse(answer, out parsed)) + { + return parsed; + } + } + } + + return 0; + } + + #endregion + + #region Private Methods + + /// + /// Loads the default coded functions supported by the interpreter. + /// + private void LoadDefaultCodedFunctions() + { + this.codedFunctions.Add(new CF_Sin()); + this.codedFunctions.Add(new CF_Cos()); + this.codedFunctions.Add(new CF_Tan()); + this.codedFunctions.Add(new CF_Round()); + this.codedFunctions.Add(new CF_Sqrt()); + this.codedFunctions.Add(new CF_Abs()); + this.codedFunctions.Add(new CF_Exp()); + this.codedFunctions.Add(new CF_Log()); + this.codedFunctions.Add(new CF_Precision()); + } + + /// + /// Produces output given a single object. + /// + /// The object representing the output. + internal void ProduceOutput(object output) + { + if (output is bool) + { + bool o = (bool)output; + if (o) + { + this.calculatedValue = 1; + } + else + { + this.calculatedValue = 0; + } + } + this.output = string.Format("{0}", output); + } + + /// + /// Produces output given an object and a message. + /// + /// The object representing the output. + /// The message to be displayed with the output. + private void ProduceOutput(object output, string message) + { + if (!string.IsNullOrEmpty(message)) + { + this.output = string.Format("{0}", output); + this.message = message; + } + else + { + ProduceOutput(output); + this.message = string.Empty; + } + } + + #endregion + + #region Asynchronous + + /// Interpret an input asynchronously. + /// The input to interpret and execute. + /// The callback. + public void InterpretAsync(string input, Action callback) + { + InterpretAsyncDelegate del = new InterpretAsyncDelegate(InterpretAsyncThreadingWork); + del.BeginInvoke(input, (result) => + { + AsyncResult returned = result as AsyncResult; + if (returned != null) + { + InterpretAsyncDelegate end = returned.AsyncDelegate as InterpretAsyncDelegate; + if (end != null) + { + InputInterpreter returnValue = end.EndInvoke(result); + callback(returnValue); + } + } + }, null); + } + + /// Interpret asynchronous threading work. + /// The input to interpret and execute. + private InputInterpreter InterpretAsyncThreadingWork(string input) + { + Interpret(input); + return this; + } + + /// Interpret asynchronous delegate. + /// The input. + /// . + private delegate InputInterpreter InterpretAsyncDelegate(string input); + + #endregion + + #region Computable + + /// Converts this object to a computable. + /// This object as a Computable. + public Computable ToComputable() + { + return new Computable(this.Decimal.ToString(), this); + } + + /// Treats the current object as a computable and performs an action in that context. + /// The action to execute as a computable object. + /// This object as a Computable, after the given action. + public Computable AsComputable(Func action) + { + return action(this.ToComputable()); + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/InterpretedFunction.cs b/CS-MIC/csmic/csmic/InterpretedFunction.cs new file mode 100644 index 0000000..70c29d6 --- /dev/null +++ b/CS-MIC/csmic/csmic/InterpretedFunction.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic +{ + /// + /// Represents a user defined function that can be executed by the interpreter. + /// + public class InterpretedFunction + { + #region Members + + /// + /// The name of the function. + /// + private string name; + /// + /// The number of expected arguments. + /// + private int numExpectedArguments; + /// + /// The set of instructions to be passed to the internal inputInterpreter. + /// + private MacroOperation script; + /// + /// A set of arguments used in computation of the function. + /// + private InterpretedFunctionArgument[] arguments; + /// + /// The internal macro builder used for computation. + /// + private MacroBuilder macroFunction; + /// + /// The internal input inputInterpreter that macro builder will use for computation. + /// + private InputInterpreter interpreter; + + #endregion + + #region Constructor + + /// + /// Creates a new interpreted function. + /// + /// The name of the fuction. + /// The node to be used in computation. + /// A set of argument names to be used in computation. + internal InterpretedFunction(string name, MacroOperation script, params string[] args) + { + this.name = name; + this.script = script; + this.macroFunction = null; + this.arguments = new InterpretedFunctionArgument[args.Length]; + this.interpreter = new InputInterpreter(); + this.numExpectedArguments = args.Length; + + for (int i = 0; i < args.Length; i++) + { + this.arguments[i] = new InterpretedFunctionArgument(args[i], 0); + } + } + + #endregion + + #region Properties + + /// + /// Gets the name of the function. + /// + public string Name + { + get + { + return this.name; + } + } + + /// + /// Gets the number of expected arguments for the function. + /// + public int NumExpectedArguments + { + get + { + return this.numExpectedArguments; + } + } + + #endregion + + #region Public Methods + + /// + /// Computes the value of the function. + /// + /// The arguments used for computation. + /// The decimal value computed by the function. + public string Compute(params decimal[] args) + { + if (args.Length != this.numExpectedArguments) + { + return "0"; + } + + if (args.Length == this.arguments.Length) + { + for (int i = 0; i < args.Length; i++) + { + this.arguments[i].Value = args[i]; + } + } + + foreach (InterpretedFunctionArgument argument in this.arguments) + { + this.interpreter.Interpret(string.Format("{0} :: {1}", argument.Name, argument.Value)); + } + + this.macroFunction = new MacroBuilder(this.script, this.interpreter); + + return this.macroFunction.FinalOutput; + } + + #endregion + + /// + /// Because a function's internal pattern may be different, we must manually check to see if the function + /// names are the same. + /// + /// The object to test. + /// True if the functions are the same. + public override bool Equals(object obj) + { + InterpretedFunction fun = obj as InterpretedFunction; + if(fun != null) + { + return fun.name == this.name; + } + + return false; + } + + /// Serves as a hash function for a particular type. + /// A hash code for the current . + public override int GetHashCode() + { + return this.script.GetHashCode() & this.name.GetHashCode(); + } + } +} diff --git a/CS-MIC/csmic/csmic/InterpretedFunctionArgument.cs b/CS-MIC/csmic/csmic/InterpretedFunctionArgument.cs new file mode 100644 index 0000000..2338b6e --- /dev/null +++ b/CS-MIC/csmic/csmic/InterpretedFunctionArgument.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic +{ + /// + /// Represents an argument made in an interpreted function. + /// + public class InterpretedFunctionArgument + { + #region Members + + /// + /// The name of the argument. + /// + private string name; + /// + /// The value of the argument. + /// + private decimal value; + + #endregion + + #region Constructors + + /// + /// Creates a new interpreted function argument. + /// + public InterpretedFunctionArgument() + { + this.name = string.Empty; + this.value = 0; + } + + /// + /// Creates a new interpreted function argument. + /// + /// The name of the argument in the interpreted function. + /// The value of the argument to use in the interpreted function. + public InterpretedFunctionArgument(string name, decimal value) + { + this.name = name; + this.value = value; + } + + #endregion + + #region Properties + + /// + /// Gets or sets the name of the argument. + /// + public string Name + { + get + { + return this.name; + } + set + { + this.name = value; + } + } + + /// + /// Gets or sets the value of the argument. + /// + public decimal Value + { + get + { + return this.value; + } + set + { + this.value = value; + } + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/InterpreterParser/CSMIC.atg b/CS-MIC/csmic/csmic/InterpreterParser/CSMIC.atg new file mode 100644 index 0000000..eb741c0 --- /dev/null +++ b/CS-MIC/csmic/csmic/InterpreterParser/CSMIC.atg @@ -0,0 +1,369 @@ +using csmic; +using System.Text; +using System.Collections.Generic; + +COMPILER CSMIC + +/* +* +* Class Structures +* +*/ + +private decimal calcValue = 0; +private string stringValue = string.Empty; + +public decimal CalculatedValue +{ + get + { + return this.calcValue; + } + set + { + this.calcValue = value; + } +} + +private InputInterpreter interpreter = null; + +public InputInterpreter Interpreter +{ + get + { + return this.interpreter; + } + set + { + this.interpreter = value; + } +} + +bool IsFunctionCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _LPAREN && la.kind == _identifier) + return true; + return false; +} + +bool IsCompare() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _COMPARER) + return true; + return false; +} + +bool IsAssignment() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.val == "::" || next.val == ":=" || next.val == "->") + return true; + return false; +} + +bool IsArrayCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if(next.val == "[") + return true; + return false; +} + +CHARACTERS + + UpperLetter = 'A'..'Z'. + LowerLetter = 'a'..'z'. + letter = UpperLetter + LowerLetter. + digit = "0123456789" . + cr = '\r' . + lf = '\n' . + tab = '\t' . + PM = "+-" . + NoQuote = ANY - '\"' . + +TOKENS + + identifier = letter { letter | digit}. + sign = PM . + binary = ( '0' | '1' ) { '0' | '1' } ('B' | 'b') . + hex = "0x" ( digit | ('A' | 'B' | 'C' | 'D' | 'E' |'F') | ('a' | 'b' | 'c' | 'd' | 'e' |'f') ) { digit | ('A' | 'B' | 'C' | 'D' | 'E' |'F') | ('a' | 'b' | 'c' | 'd' | 'e' |'f') } . + number = digit { digit }['.' {digit}] [('E'|'e')['+'|'-'] digit {digit}] . + string = "\"" { NoQuote } "\"" . + LPAREN = '(' . + RPAREN = ')' . + COMPARER = "==" | "<" | ">" | "<=" | ">=" . + +IGNORE cr + tab + +/* + * Parser specification + * + */ + +PRODUCTIONS + +CSMIC (. decimal r = 0; + string s = string.Empty; + decimal[] a = new decimal[0]; + bool success = true; + if(this.interpreter == null) + { + return; + } + .) += + IF(IsCompare()) + Comparison (. this.calcValue = (success == true) ? 1 : 0; this.interpreter.ProduceOutput(success); .) + | + IF(IsAssignment()) + Assignment (. this.calcValue = r; .) + | + Expression (. this.calcValue = r; this.interpreter.ProduceOutput(r); .) + | + String (. this.stringValue = s; this.interpreter.ProduceOutput(s); .) +. + +String += + string (. s = t.val; .) + +. + +Expression += + (. decimal r1; .) +Term +{ + '+' Term (. r += r1; .) +| + '-' Term (. r -= r1; .) +} +. + +Term (. decimal r1; .) += + Factor + { + '*' + Factor (. r *= r1; .) +| + '/' + Factor (. r /= r1; .) +| + '%' Term (. r %= r1; .) +} +. + +Factor (. decimal r1; .) += + Value + { + '^' + Expression (. r = Convert.ToDecimal(Math.Pow(Convert.ToDouble(r), Convert.ToDouble(r1))); .) + } +. + +Value (. r = 0; + decimal r1 = 0; + string fn; + int sign = 1;.) += + + [ + "+" + | + "-" (. sign = -1; .) + ] +( + IF(IsFunctionCall()) + Function (. r = sign * r; .) +| + IF(IsArrayCall()) + ArrayCall (. r = sign * r; .) +| + identifier (. if(this.interpreter.variables.ContainsKey(t.val)) + { + Variable v = this.interpreter.variables[t.val]; + if(v.Type == VariableType.Equation) + { + InputInterpreter i = new InputInterpreter(this.interpreter); + i.Interpret(v.Value.ToString()); + r = i.Decimal; + } + else if(v.Type == VariableType.Decimal) + { + r = Convert.ToDecimal(v.Value); + } + else + { + r = 0; + } + } + .) +| + number (. r = sign * Convert.ToDecimal (t.val); .) +| + hex (. string expression = t.val.Remove(0,2); + try + { + decimal value = Convert.ToDecimal(Convert.ToInt64(expression, 16)); + r = sign * value; + } + catch + { + r = 0; + } + .) +| + binary (. string expression = t.val.Remove(t.val.Length - 1); + try + { + decimal value = Convert.ToDecimal(Convert.ToInt64(expression, 2)); + r = sign * value; + } + catch + { + r = 0; + } + .) +| + '(' + Expression + ')' (. r = sign * r; .) +) +. + +ArrayL += +'[' +CommaList +']' +. + +ArrayCall (. string ident = string.Empty; r = 0; decimal pos = 0; .) += +identifier (. ident = t.val; .) +'[' + Expression (. int i = 0; + try + { + i = Convert.ToInt32(pos); + if(this.interpreter.variables.ContainsKey(ident)) + { + decimal[] values = this.interpreter.variables[ident].Value as decimal[]; + if(values != null) + { + r = values[i]; + } + } + } + catch + { + } + .) +']' +. + +CommaList (. List list = new List(); decimal r = 0; .) += +Expression (. list.Add(r); d = list.ToArray(); .) +{ + ',' + Expression (. list.Add(r); d = list.ToArray(); .) +} +. + +Assignment (. + string identifier = string.Empty; + string expression = string.Empty; + decimal[] d = new decimal[0]; + r = 0; + .) += +identifier (. identifier = t.val; .) +( + ( + "::" + Expression (. this.interpreter.Assign(identifier, r); .) + (. this.interpreter.ProduceOutput(r); .) + ) + | + ( + ":=" + AnyExpression (. this.interpreter.Assign(identifier, expression); .) + (. this.interpreter.ProduceOutput(expression); .) + ) + | + ( + "->" + ArrayL (. this.interpreter.Assign(identifier, d); r = 0; .) + (. + StringBuilder builder = new StringBuilder(); + foreach(decimal dec in d) + { + builder.Append("," + dec.ToString()); + } + builder.Remove(0,1); + this.interpreter.ProduceOutput(builder.ToString()); + .) + ) +) +. + +Function (. + string functionName = string.Empty; + decimal[] d = new decimal[0]; + .) += +identifier (. functionName = t.val; .) +'(' +CommaList +')' (. r = this.interpreter.ExecuteFunction(functionName, d); .) +. + +Comparison (. + decimal firstValue = 0; + decimal secondValue = 0; + string compareType = string.Empty; + .) += +Expression +COMPARER (. compareType = t.val; .) +Expression (. + switch(compareType) + { + case "==": + result = (firstValue == secondValue); + break; + case ">": + result = (firstValue > secondValue); + break; + case "<": + result = (firstValue < secondValue); + break; + case ">=": + result = (firstValue >= secondValue); + break; + case "<=": + result = (firstValue <= secondValue); + break; + default: + result = false; + break; + } + .) +. + +AnyExpression (. value = string.Empty; StringBuilder builder = new StringBuilder(); .) += +ANY (. builder.Append(t.val); .) { ANY (. builder.Append(t.val); .) } (. value = builder.ToString(); .) +. + + +END CSMIC. \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/InterpreterParser/Parser.cs b/CS-MIC/csmic/csmic/InterpreterParser/Parser.cs new file mode 100644 index 0000000..218958a --- /dev/null +++ b/CS-MIC/csmic/csmic/InterpreterParser/Parser.cs @@ -0,0 +1,534 @@ +using csmic; +using System.Text; +using System.Collections.Generic; + + + +using System; +using System.CodeDom.Compiler; + +namespace csmic.Interpreter { + + + +[GeneratedCodeAttribute("Coco/R", "")] +public class Parser { + public const int _EOF = 0; + public const int _identifier = 1; + public const int _sign = 2; + public const int _binary = 3; + public const int _hex = 4; + public const int _number = 5; + public const int _string = 6; + public const int _LPAREN = 7; + public const int _RPAREN = 8; + public const int _COMPARER = 9; + public const int maxT = 22; + + const bool T = true; + const bool x = false; + const int minErrDist = 2; + + public Scanner scanner; + public Errors errors; + + public Token t; // last recognized token + public Token la; // lookahead token + int errDist = minErrDist; + +private decimal calcValue = 0; +private string stringValue = string.Empty; + +public decimal CalculatedValue +{ + get + { + return this.calcValue; + } + set + { + this.calcValue = value; + } +} + +private InputInterpreter interpreter = null; + +public InputInterpreter Interpreter +{ + get + { + return this.interpreter; + } + set + { + this.interpreter = value; + } +} + +bool IsFunctionCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _LPAREN && la.kind == _identifier) + return true; + return false; +} + +bool IsCompare() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _COMPARER) + return true; + return false; +} + +bool IsAssignment() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.val == "::" || next.val == ":=" || next.val == "->") + return true; + return false; +} + +bool IsArrayCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if(next.val == "[") + return true; + return false; +} + + + + public Parser(Scanner scanner) { + this.scanner = scanner; + errors = new Errors(); + } + + void SynErr (int n) { + if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n); + errDist = 0; + } + + public void SemErr (string msg) { + if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg); + errDist = 0; + } + + void Get () { + for (;;) { + t = la; + la = scanner.Scan(); + if (la.kind <= maxT) { ++errDist; break; } + + la = t; + } + } + + void Expect (int n) { + if (la.kind==n) Get(); else { SynErr(n); } + } + + bool StartOf (int s) { + return set[s, la.kind]; + } + + void ExpectWeak (int n, int follow) { + if (la.kind == n) Get(); + else { + SynErr(n); + while (!StartOf(follow)) Get(); + } + } + + + bool WeakSeparator(int n, int syFol, int repFol) { + int kind = la.kind; + if (kind == n) {Get(); return true;} + else if (StartOf(repFol)) {return false;} + else { + SynErr(n); + while (!(set[syFol, kind] || set[repFol, kind] || set[0, kind])) { + Get(); + kind = la.kind; + } + return StartOf(syFol); + } + } + + + void CSMIC() { + decimal r = 0; + string s = string.Empty; + decimal[] a = new decimal[0]; + bool success = true; + if(this.interpreter == null) + { + return; + } + + if (IsCompare()) { + Comparison(out success); + this.calcValue = (success == true) ? 1 : 0; this.interpreter.ProduceOutput(success); + } else if (IsAssignment()) { + Assignment(out r); + this.calcValue = r; + } else if (StartOf(1)) { + Expression(out r); + this.calcValue = r; this.interpreter.ProduceOutput(r); + } else if (la.kind == 6) { + String(out s); + this.stringValue = s; this.interpreter.ProduceOutput(s); + } else SynErr(23); + } + + void Comparison(out bool result) { + decimal firstValue = 0; + decimal secondValue = 0; + string compareType = string.Empty; + + Expression(out firstValue); + Expect(9); + compareType = t.val; + Expression(out secondValue); + switch(compareType) + { + case "==": + result = (firstValue == secondValue); + break; + case ">": + result = (firstValue > secondValue); + break; + case "<": + result = (firstValue < secondValue); + break; + case ">=": + result = (firstValue >= secondValue); + break; + case "<=": + result = (firstValue <= secondValue); + break; + default: + result = false; + break; + } + + } + + void Assignment(out decimal r) { + string identifier = string.Empty; + string expression = string.Empty; + decimal[] d = new decimal[0]; + r = 0; + + Expect(1); + identifier = t.val; + if (la.kind == 19) { + Get(); + Expression(out r); + this.interpreter.Assign(identifier, r); + this.interpreter.ProduceOutput(r); + } else if (la.kind == 20) { + Get(); + AnyExpression(out expression); + this.interpreter.Assign(identifier, expression); + this.interpreter.ProduceOutput(expression); + } else if (la.kind == 21) { + Get(); + ArrayL(out d); + this.interpreter.Assign(identifier, d); r = 0; + StringBuilder builder = new StringBuilder(); + foreach(decimal dec in d) + { + builder.Append("," + dec.ToString()); + } + builder.Remove(0,1); + this.interpreter.ProduceOutput(builder.ToString()); + + } else SynErr(24); + } + + void Expression(out decimal r) { + decimal r1; + Term(out r); + while (la.kind == 10 || la.kind == 11) { + if (la.kind == 10) { + Get(); + Term(out r1); + r += r1; + } else { + Get(); + Term(out r1); + r -= r1; + } + } + } + + void String(out string s) { + Expect(6); + s = t.val; + } + + void Term(out decimal r) { + decimal r1; + Factor(out r); + while (la.kind == 12 || la.kind == 13 || la.kind == 14) { + if (la.kind == 12) { + Get(); + Factor(out r1); + r *= r1; + } else if (la.kind == 13) { + Get(); + Factor(out r1); + r /= r1; + } else { + Get(); + Term(out r1); + r %= r1; + } + } + } + + void Factor(out decimal r) { + decimal r1; + Value(out r); + while (la.kind == 15) { + Get(); + Expression(out r1); + r = Convert.ToDecimal(Math.Pow(Convert.ToDouble(r), Convert.ToDouble(r1))); + } + } + + void Value(out decimal r) { + r = 0; + decimal r1 = 0; + string fn; + int sign = 1; + if (la.kind == 10 || la.kind == 11) { + if (la.kind == 10) { + Get(); + } else { + Get(); + sign = -1; + } + } + if (IsFunctionCall()) { + Function(out r); + r = sign * r; + } else if (IsArrayCall()) { + ArrayCall(out r); + r = sign * r; + } else if (la.kind == 1) { + Get(); + if(this.interpreter.variables.ContainsKey(t.val)) + { + Variable v = this.interpreter.variables[t.val]; + if(v.Type == VariableType.Equation) + { + InputInterpreter i = new InputInterpreter(this.interpreter); + i.Interpret(v.Value.ToString()); + r = i.Decimal; + } + else if(v.Type == VariableType.Decimal) + { + r = Convert.ToDecimal(v.Value); + } + else + { + r = 0; + } + } + + } else if (la.kind == 5) { + Get(); + r = sign * Convert.ToDecimal (t.val); + } else if (la.kind == 4) { + Get(); + string expression = t.val.Remove(0,2); + try + { + decimal value = Convert.ToDecimal(Convert.ToInt64(expression, 16)); + r = sign * value; + } + catch + { + r = 0; + } + + } else if (la.kind == 3) { + Get(); + string expression = t.val.Remove(t.val.Length - 1); + try + { + decimal value = Convert.ToDecimal(Convert.ToInt64(expression, 2)); + r = sign * value; + } + catch + { + r = 0; + } + + } else if (la.kind == 7) { + Get(); + Expression(out r); + Expect(8); + r = sign * r; + } else SynErr(25); + } + + void Function(out decimal r) { + string functionName = string.Empty; + decimal[] d = new decimal[0]; + + Expect(1); + functionName = t.val; + Expect(7); + CommaList(out d); + Expect(8); + r = this.interpreter.ExecuteFunction(functionName, d); + } + + void ArrayCall(out decimal r) { + string ident = string.Empty; r = 0; decimal pos = 0; + Expect(1); + ident = t.val; + Expect(16); + Expression(out pos); + int i = 0; + try + { + i = Convert.ToInt32(pos); + if(this.interpreter.variables.ContainsKey(ident)) + { + decimal[] values = this.interpreter.variables[ident].Value as decimal[]; + if(values != null) + { + r = values[i]; + } + } + } + catch + { + } + + Expect(17); + } + + void ArrayL(out decimal[] d) { + Expect(16); + CommaList(out d); + Expect(17); + } + + void CommaList(out decimal[] d) { + List list = new List(); decimal r = 0; + Expression(out r); + list.Add(r); d = list.ToArray(); + while (la.kind == 18) { + Get(); + Expression(out r); + list.Add(r); d = list.ToArray(); + } + } + + void AnyExpression(out string value) { + value = string.Empty; StringBuilder builder = new StringBuilder(); + Get(); + builder.Append(t.val); + while (StartOf(2)) { + Get(); + builder.Append(t.val); + } + value = builder.ToString(); + } + + + + public void Parse() { + la = new Token(); + la.val = ""; + Get(); + CSMIC(); + Expect(0); + + Expect(0); + } + + static readonly bool[,] set = { + {T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x}, + {x,T,x,T, T,T,x,T, x,x,T,T, x,x,x,x, x,x,x,x, x,x,x,x}, + {x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,x} + + }; +} // end Parser + + +public class Errors { + public int count = 0; // number of errors detected + public StringBuilder builder = new StringBuilder(); // error messages go to this stream + public string errMsgFormat = "-- position {0}: {1}"; // 0=line, 1=column, 2=text + + public void SynErr (int line, int col, int n) { + string s; + switch (n) { + case 0: s = "EOF expected"; break; + case 1: s = "identifier expected"; break; + case 2: s = "sign expected"; break; + case 3: s = "binary expected"; break; + case 4: s = "hex expected"; break; + case 5: s = "number expected"; break; + case 6: s = "string expected"; break; + case 7: s = "LPAREN expected"; break; + case 8: s = "RPAREN expected"; break; + case 9: s = "COMPARER expected"; break; + case 10: s = "\"+\" expected"; break; + case 11: s = "\"-\" expected"; break; + case 12: s = "\"*\" expected"; break; + case 13: s = "\"/\" expected"; break; + case 14: s = "\"%\" expected"; break; + case 15: s = "\"^\" expected"; break; + case 16: s = "\"[\" expected"; break; + case 17: s = "\"]\" expected"; break; + case 18: s = "\",\" expected"; break; + case 19: s = "\"::\" expected"; break; + case 20: s = "\":=\" expected"; break; + case 21: s = "\"->\" expected"; break; + case 22: s = "??? expected"; break; + case 23: s = "invalid CSMIC"; break; + case 24: s = "invalid Assignment"; break; + case 25: s = "invalid Value"; break; + + default: s = "error " + n; break; + } + builder.AppendFormat(errMsgFormat, col, s); + count++; + } + + public void SemErr (int line, int col, string s) { + builder.AppendFormat(errMsgFormat, col, s); + count++; + } + + public void SemErr (string s) { + builder.AppendLine(s); + count++; + } + + public void Warning (int line, int col, string s) { + builder.AppendFormat(errMsgFormat, col, s); + } + + public void Warning(string s) { + builder.AppendLine(s); + } +} // Errors + + +public class FatalError: Exception { + public FatalError(string m): base(m) {} +} + +} \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/InterpreterParser/Parser.frame b/CS-MIC/csmic/csmic/InterpreterParser/Parser.frame new file mode 100644 index 0000000..88d27f5 --- /dev/null +++ b/CS-MIC/csmic/csmic/InterpreterParser/Parser.frame @@ -0,0 +1,160 @@ +/*---------------------------------------------------------------------- +Compiler Generator Coco/R, +Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz +extended by M. Loeberbauer & A. Woess, Univ. of Linz +with improvements by Pat Terry, Rhodes University + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +As an exception, it is allowed to write an extension of Coco/R that is +used as a plugin in non-free software. + +If not otherwise stated, any source code generated by Coco/R (other than +Coco/R itself) does not fall under the GNU General Public License. +----------------------------------------------------------------------*/ +-->begin +using System; +using System.CodeDom.Compiler; + +-->namespace + +[GeneratedCodeAttribute("Coco/R", "")] +public class Parser { +-->constants + const bool T = true; + const bool x = false; + const int minErrDist = 2; + + public Scanner scanner; + public Errors errors; + + public Token t; // last recognized token + public Token la; // lookahead token + int errDist = minErrDist; + +-->declarations + + public Parser(Scanner scanner) { + this.scanner = scanner; + errors = new Errors(); + } + + void SynErr (int n) { + if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n); + errDist = 0; + } + + public void SemErr (string msg) { + if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg); + errDist = 0; + } + + void Get () { + for (;;) { + t = la; + la = scanner.Scan(); + if (la.kind <= maxT) { ++errDist; break; } +-->pragmas + la = t; + } + } + + void Expect (int n) { + if (la.kind==n) Get(); else { SynErr(n); } + } + + bool StartOf (int s) { + return set[s, la.kind]; + } + + void ExpectWeak (int n, int follow) { + if (la.kind == n) Get(); + else { + SynErr(n); + while (!StartOf(follow)) Get(); + } + } + + + bool WeakSeparator(int n, int syFol, int repFol) { + int kind = la.kind; + if (kind == n) {Get(); return true;} + else if (StartOf(repFol)) {return false;} + else { + SynErr(n); + while (!(set[syFol, kind] || set[repFol, kind] || set[0, kind])) { + Get(); + kind = la.kind; + } + return StartOf(syFol); + } + } + + +-->productions + + public void Parse() { + la = new Token(); + la.val = ""; + Get(); +-->parseRoot + Expect(0); + } + + static readonly bool[,] set = { +-->initialization + }; +} // end Parser + + +public class Errors { + public int count = 0; // number of errors detected + public StringBuilder builder = new StringBuilder(); // error messages go to this stream + public string errMsgFormat = "-- position {0}: {1}"; // 0=line, 1=column, 2=text + + public void SynErr (int line, int col, int n) { + string s; + switch (n) { +-->errors + default: s = "error " + n; break; + } + builder.AppendFormat(errMsgFormat, col, s); + count++; + } + + public void SemErr (int line, int col, string s) { + builder.AppendFormat(errMsgFormat, col, s); + count++; + } + + public void SemErr (string s) { + builder.AppendLine(s); + count++; + } + + public void Warning (int line, int col, string s) { + builder.AppendFormat(errMsgFormat, col, s); + } + + public void Warning(string s) { + builder.AppendLine(s); + } +} // Errors + + +public class FatalError: Exception { + public FatalError(string m): base(m) {} +} + diff --git a/CS-MIC/csmic/csmic/InterpreterParser/Scanner.cs b/CS-MIC/csmic/csmic/InterpreterParser/Scanner.cs new file mode 100644 index 0000000..630ede2 --- /dev/null +++ b/CS-MIC/csmic/csmic/InterpreterParser/Scanner.cs @@ -0,0 +1,491 @@ + +using System; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.CodeDom.Compiler; + +namespace csmic.Interpreter { + +[GeneratedCodeAttribute("Coco/R", "")] +public class Token { + public int kind; // token kind + public int pos; // token position in bytes in the source text (starting at 0) + public int charPos; // token position in characters in the source text (starting at 0) + public int col; // token column (starting at 1) + public int line; // token line (starting at 1) + public string val; // token value + public Token next; // ML 2005-03-11 Tokens are kept in linked list +} + +//----------------------------------------------------------------------------------- +// Buffer +//----------------------------------------------------------------------------------- +public class Buffer { + // This Buffer supports the following cases: + // 1) seekable stream (file) + // a) whole stream in buffer + // b) part of stream in buffer + // 2) non seekable stream (network, console) + + public const int EOF = char.MaxValue + 1; + const int MIN_BUFFER_LENGTH = 1024; // 1KB + const int MAX_BUFFER_LENGTH = MIN_BUFFER_LENGTH * 64; // 64KB + byte[] buf; // input buffer + int bufStart; // position of first byte in buffer relative to input stream + int bufLen; // length of buffer + int fileLen; // length of input stream (may change if the stream is no file) + int bufPos; // current position in buffer + Stream stream; // input stream (seekable) + bool isUserStream; // was the stream opened by the user? + + public Buffer (Stream s, bool isUserStream) { + stream = s; this.isUserStream = isUserStream; + + if (stream.CanSeek) { + fileLen = (int) stream.Length; + bufLen = Math.Min(fileLen, MAX_BUFFER_LENGTH); + bufStart = Int32.MaxValue; // nothing in the buffer so far + } else { + fileLen = bufLen = bufStart = 0; + } + + buf = new byte[(bufLen>0) ? bufLen : MIN_BUFFER_LENGTH]; + if (fileLen > 0) Pos = 0; // setup buffer to position 0 (start) + else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid + if (bufLen == fileLen && stream.CanSeek) Close(); + } + + protected Buffer(Buffer b) { // called in UTF8Buffer constructor + buf = b.buf; + bufStart = b.bufStart; + bufLen = b.bufLen; + fileLen = b.fileLen; + bufPos = b.bufPos; + stream = b.stream; + // keep destructor from closing the stream + b.stream = null; + isUserStream = b.isUserStream; + } + + ~Buffer() { Close(); } + + protected void Close() { + if (!isUserStream && stream != null) { + stream.Close(); + stream = null; + } + } + + public virtual int Read () { + if (bufPos < bufLen) { + return buf[bufPos++]; + } else if (Pos < fileLen) { + Pos = Pos; // shift buffer start to Pos + return buf[bufPos++]; + } else if (stream != null && !stream.CanSeek && ReadNextStreamChunk() > 0) { + return buf[bufPos++]; + } else { + return EOF; + } + } + + public int Peek () { + int curPos = Pos; + int ch = Read(); + Pos = curPos; + return ch; + } + + // beg .. begin, zero-based, inclusive, in byte + // end .. end, zero-based, exclusive, in byte + public string GetString (int beg, int end) { + int len = 0; + char[] buf = new char[end - beg]; + int oldPos = Pos; + Pos = beg; + while (Pos < end) buf[len++] = (char) Read(); + Pos = oldPos; + return new String(buf, 0, len); + } + + public int Pos { + get { return bufPos + bufStart; } + set { + if (value >= fileLen && stream != null && !stream.CanSeek) { + // Wanted position is after buffer and the stream + // is not seek-able e.g. network or console, + // thus we have to read the stream manually till + // the wanted position is in sight. + while (value >= fileLen && ReadNextStreamChunk() > 0); + } + + if (value < 0 || value > fileLen) { + throw new FatalError("buffer out of bounds access, position: " + value); + } + + if (value >= bufStart && value < bufStart + bufLen) { // already in buffer + bufPos = value - bufStart; + } else if (stream != null) { // must be swapped in + stream.Seek(value, SeekOrigin.Begin); + bufLen = stream.Read(buf, 0, buf.Length); + bufStart = value; bufPos = 0; + } else { + // set the position to the end of the file, Pos will return fileLen. + bufPos = fileLen - bufStart; + } + } + } + + // Read the next chunk of bytes from the stream, increases the buffer + // if needed and updates the fields fileLen and bufLen. + // Returns the number of bytes read. + private int ReadNextStreamChunk() { + int free = buf.Length - bufLen; + if (free == 0) { + // in the case of a growing input stream + // we can neither seek in the stream, nor can we + // foresee the maximum length, thus we must adapt + // the buffer size on demand. + byte[] newBuf = new byte[bufLen * 2]; + Array.Copy(buf, newBuf, bufLen); + buf = newBuf; + free = bufLen; + } + int read = stream.Read(buf, bufLen, free); + if (read > 0) { + fileLen = bufLen = (bufLen + read); + return read; + } + // end of stream reached + return 0; + } +} + +//----------------------------------------------------------------------------------- +// UTF8Buffer +//----------------------------------------------------------------------------------- +public class UTF8Buffer: Buffer { + public UTF8Buffer(Buffer b): base(b) {} + + public override int Read() { + int ch; + do { + ch = base.Read(); + // until we find a utf8 start (0xxxxxxx or 11xxxxxx) + } while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EOF)); + if (ch < 128 || ch == EOF) { + // nothing to do, first 127 chars are the same in ascii and utf8 + // 0xxxxxxx or end of file character + } else if ((ch & 0xF0) == 0xF0) { + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x07; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; ch = base.Read(); + int c4 = ch & 0x3F; + ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4; + } else if ((ch & 0xE0) == 0xE0) { + // 1110xxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x0F; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; + ch = (((c1 << 6) | c2) << 6) | c3; + } else if ((ch & 0xC0) == 0xC0) { + // 110xxxxx 10xxxxxx + int c1 = ch & 0x1F; ch = base.Read(); + int c2 = ch & 0x3F; + ch = (c1 << 6) | c2; + } + return ch; + } +} + +//----------------------------------------------------------------------------------- +// Scanner +//----------------------------------------------------------------------------------- +public class Scanner { + const char EOL = '\n'; + const int eofSym = 0; /* pdt */ + const int maxT = 22; + const int noSym = 22; + + + public Buffer buffer; // scanner buffer + + Token t; // current token + int ch; // current input character + int pos; // byte position of current character + int charPos; // position by unicode characters starting with 0 + int col; // column number of current character + int line; // line number of current character + int oldEols; // EOLs that appeared in a comment; + static readonly Dictionary start; // maps first token character to start state + + Token tokens; // list of tokens already peeked (first token is a dummy) + Token pt; // current peek token + + char[] tval = new char[128]; // text of current token + int tlen; // length of current token + + static Scanner() { + start = new Dictionary(128); + for (int i = 65; i <= 90; ++i) start[i] = 1; + for (int i = 97; i <= 122; ++i) start[i] = 1; + start[43] = 2; + for (int i = 50; i <= 57; ++i) start[i] = 6; + start[48] = 17; + start[49] = 18; + start[34] = 11; + start[40] = 13; + start[41] = 14; + start[61] = 15; + start[60] = 19; + start[62] = 20; + start[42] = 21; + start[47] = 22; + start[37] = 23; + start[94] = 24; + start[91] = 25; + start[93] = 26; + start[44] = 27; + start[58] = 31; + start[45] = 32; + start[Buffer.EOF] = -1; + + } + + public Scanner (string fileName) { + try { + Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + buffer = new Buffer(stream, false); + Init(); + } catch (IOException) { + throw new FatalError("Cannot open file " + fileName); + } + } + + public Scanner (Stream s) { + buffer = new Buffer(s, true); + Init(); + } + + void Init() { + pos = -1; line = 1; col = 0; charPos = -1; + oldEols = 0; + NextCh(); + if (ch == 0xEF) { // check optional byte order mark for UTF-8 + NextCh(); int ch1 = ch; + NextCh(); int ch2 = ch; + if (ch1 != 0xBB || ch2 != 0xBF) { + throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2)); + } + buffer = new UTF8Buffer(buffer); col = 0; charPos = -1; + NextCh(); + } + pt = tokens = new Token(); // first token is a dummy + } + + void NextCh() { + if (oldEols > 0) { ch = EOL; oldEols--; } + else { + pos = buffer.Pos; + // buffer reads unicode chars, if UTF8 has been detected + ch = buffer.Read(); col++; charPos++; + // replace isolated '\r' by '\n' in order to make + // eol handling uniform across Windows, Unix and Mac + if (ch == '\r' && buffer.Peek() != '\n') ch = EOL; + if (ch == EOL) { line++; col = 0; } + } + + } + + void AddCh() { + if (tlen >= tval.Length) { + char[] newBuf = new char[2 * tval.Length]; + Array.Copy(tval, 0, newBuf, 0, tval.Length); + tval = newBuf; + } + if (ch != Buffer.EOF) { + tval[tlen++] = (char) ch; + NextCh(); + } + } + + + + + void CheckLiteral() { + switch (t.val) { + case "+": t.kind = 10; break; + case "-": t.kind = 11; break; + default: break; + } + } + + Token NextToken() { + while (ch == ' ' || + ch == 9 || ch == 13 + ) NextCh(); + + int recKind = noSym; + int recEnd = pos; + t = new Token(); + t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; + int state; + state = (int) start[ch]; + tlen = 0; AddCh(); + + switch (state) { + case -1: { t.kind = eofSym; break; } // NextCh already done + case 0: { + if (recKind != noSym) { + tlen = recEnd - t.pos; + SetScannerBehindT(); + } + t.kind = recKind; break; + } // NextCh already done + case 1: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} + else {t.kind = 1; break;} + case 2: + {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 3: + {t.kind = 3; break;} + case 4: + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} + else {goto case 0;} + case 5: + recEnd = pos; recKind = 4; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} + else {t.kind = 4; break;} + case 6: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 7: + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else if (ch == '+' || ch == '-') {AddCh(); goto case 8;} + else {goto case 0;} + case 8: + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else {goto case 0;} + case 9: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else {t.kind = 5; break;} + case 10: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 10;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else {t.kind = 5; break;} + case 11: + if (ch <= '!' || ch >= '#' && ch <= 65535) {AddCh(); goto case 11;} + else if (ch == '"') {AddCh(); goto case 12;} + else {goto case 0;} + case 12: + {t.kind = 6; break;} + case 13: + {t.kind = 7; break;} + case 14: + {t.kind = 8; break;} + case 15: + if (ch == '=') {AddCh(); goto case 16;} + else {goto case 0;} + case 16: + {t.kind = 9; break;} + case 17: + recEnd = pos; recKind = 5; + if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} + else if (ch >= '0' && ch <= '1') {AddCh(); goto case 18;} + else if (ch == 'x') {AddCh(); goto case 4;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 18: + recEnd = pos; recKind = 5; + if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} + else if (ch >= '0' && ch <= '1') {AddCh(); goto case 18;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 19: + recEnd = pos; recKind = 9; + if (ch == '=') {AddCh(); goto case 16;} + else {t.kind = 9; break;} + case 20: + recEnd = pos; recKind = 9; + if (ch == '=') {AddCh(); goto case 16;} + else {t.kind = 9; break;} + case 21: + {t.kind = 12; break;} + case 22: + {t.kind = 13; break;} + case 23: + {t.kind = 14; break;} + case 24: + {t.kind = 15; break;} + case 25: + {t.kind = 16; break;} + case 26: + {t.kind = 17; break;} + case 27: + {t.kind = 18; break;} + case 28: + {t.kind = 19; break;} + case 29: + {t.kind = 20; break;} + case 30: + {t.kind = 21; break;} + case 31: + if (ch == ':') {AddCh(); goto case 28;} + else if (ch == '=') {AddCh(); goto case 29;} + else {goto case 0;} + case 32: + recEnd = pos; recKind = 2; + if (ch == '>') {AddCh(); goto case 30;} + else {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + + } + t.val = new String(tval, 0, tlen); + return t; + } + + private void SetScannerBehindT() { + buffer.Pos = t.pos; + NextCh(); + line = t.line; col = t.col; charPos = t.charPos; + for (int i = 0; i < tlen; i++) NextCh(); + } + + // get the next token (possibly a token already seen during peeking) + public Token Scan () { + if (tokens.next == null) { + return NextToken(); + } else { + pt = tokens = tokens.next; + return tokens; + } + } + + // peek for the next token, ignore pragmas + public Token Peek () { + do { + if (pt.next == null) { + pt.next = NextToken(); + } + pt = pt.next; + } while (pt.kind > maxT); // skip pragmas + + return pt; + } + + // make sure that peeking starts at the current scan position + public void ResetPeek () { pt = tokens; } + +} // end Scanner +} \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/InterpreterParser/Scanner.frame b/CS-MIC/csmic/csmic/InterpreterParser/Scanner.frame new file mode 100644 index 0000000..8010e59 --- /dev/null +++ b/CS-MIC/csmic/csmic/InterpreterParser/Scanner.frame @@ -0,0 +1,383 @@ +/*---------------------------------------------------------------------- +Compiler Generator Coco/R, +Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz +extended by M. Loeberbauer & A. Woess, Univ. of Linz +with improvements by Pat Terry, Rhodes University + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +As an exception, it is allowed to write an extension of Coco/R that is +used as a plugin in non-free software. + +If not otherwise stated, any source code generated by Coco/R (other than +Coco/R itself) does not fall under the GNU General Public License. +-----------------------------------------------------------------------*/ +-->begin +using System; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.CodeDom.Compiler; + +-->namespace + +[GeneratedCodeAttribute("Coco/R", "")] +public class Token { + public int kind; // token kind + public int pos; // token position in bytes in the source text (starting at 0) + public int charPos; // token position in characters in the source text (starting at 0) + public int col; // token column (starting at 1) + public int line; // token line (starting at 1) + public string val; // token value + public Token next; // ML 2005-03-11 Tokens are kept in linked list +} + +//----------------------------------------------------------------------------------- +// Buffer +//----------------------------------------------------------------------------------- +public class Buffer { + // This Buffer supports the following cases: + // 1) seekable stream (file) + // a) whole stream in buffer + // b) part of stream in buffer + // 2) non seekable stream (network, console) + + public const int EOF = char.MaxValue + 1; + const int MIN_BUFFER_LENGTH = 1024; // 1KB + const int MAX_BUFFER_LENGTH = MIN_BUFFER_LENGTH * 64; // 64KB + byte[] buf; // input buffer + int bufStart; // position of first byte in buffer relative to input stream + int bufLen; // length of buffer + int fileLen; // length of input stream (may change if the stream is no file) + int bufPos; // current position in buffer + Stream stream; // input stream (seekable) + bool isUserStream; // was the stream opened by the user? + + public Buffer (Stream s, bool isUserStream) { + stream = s; this.isUserStream = isUserStream; + + if (stream.CanSeek) { + fileLen = (int) stream.Length; + bufLen = Math.Min(fileLen, MAX_BUFFER_LENGTH); + bufStart = Int32.MaxValue; // nothing in the buffer so far + } else { + fileLen = bufLen = bufStart = 0; + } + + buf = new byte[(bufLen>0) ? bufLen : MIN_BUFFER_LENGTH]; + if (fileLen > 0) Pos = 0; // setup buffer to position 0 (start) + else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid + if (bufLen == fileLen && stream.CanSeek) Close(); + } + + protected Buffer(Buffer b) { // called in UTF8Buffer constructor + buf = b.buf; + bufStart = b.bufStart; + bufLen = b.bufLen; + fileLen = b.fileLen; + bufPos = b.bufPos; + stream = b.stream; + // keep destructor from closing the stream + b.stream = null; + isUserStream = b.isUserStream; + } + + ~Buffer() { Close(); } + + protected void Close() { + if (!isUserStream && stream != null) { + stream.Close(); + stream = null; + } + } + + public virtual int Read () { + if (bufPos < bufLen) { + return buf[bufPos++]; + } else if (Pos < fileLen) { + Pos = Pos; // shift buffer start to Pos + return buf[bufPos++]; + } else if (stream != null && !stream.CanSeek && ReadNextStreamChunk() > 0) { + return buf[bufPos++]; + } else { + return EOF; + } + } + + public int Peek () { + int curPos = Pos; + int ch = Read(); + Pos = curPos; + return ch; + } + + // beg .. begin, zero-based, inclusive, in byte + // end .. end, zero-based, exclusive, in byte + public string GetString (int beg, int end) { + int len = 0; + char[] buf = new char[end - beg]; + int oldPos = Pos; + Pos = beg; + while (Pos < end) buf[len++] = (char) Read(); + Pos = oldPos; + return new String(buf, 0, len); + } + + public int Pos { + get { return bufPos + bufStart; } + set { + if (value >= fileLen && stream != null && !stream.CanSeek) { + // Wanted position is after buffer and the stream + // is not seek-able e.g. network or console, + // thus we have to read the stream manually till + // the wanted position is in sight. + while (value >= fileLen && ReadNextStreamChunk() > 0); + } + + if (value < 0 || value > fileLen) { + throw new FatalError("buffer out of bounds access, position: " + value); + } + + if (value >= bufStart && value < bufStart + bufLen) { // already in buffer + bufPos = value - bufStart; + } else if (stream != null) { // must be swapped in + stream.Seek(value, SeekOrigin.Begin); + bufLen = stream.Read(buf, 0, buf.Length); + bufStart = value; bufPos = 0; + } else { + // set the position to the end of the file, Pos will return fileLen. + bufPos = fileLen - bufStart; + } + } + } + + // Read the next chunk of bytes from the stream, increases the buffer + // if needed and updates the fields fileLen and bufLen. + // Returns the number of bytes read. + private int ReadNextStreamChunk() { + int free = buf.Length - bufLen; + if (free == 0) { + // in the case of a growing input stream + // we can neither seek in the stream, nor can we + // foresee the maximum length, thus we must adapt + // the buffer size on demand. + byte[] newBuf = new byte[bufLen * 2]; + Array.Copy(buf, newBuf, bufLen); + buf = newBuf; + free = bufLen; + } + int read = stream.Read(buf, bufLen, free); + if (read > 0) { + fileLen = bufLen = (bufLen + read); + return read; + } + // end of stream reached + return 0; + } +} + +//----------------------------------------------------------------------------------- +// UTF8Buffer +//----------------------------------------------------------------------------------- +public class UTF8Buffer: Buffer { + public UTF8Buffer(Buffer b): base(b) {} + + public override int Read() { + int ch; + do { + ch = base.Read(); + // until we find a utf8 start (0xxxxxxx or 11xxxxxx) + } while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EOF)); + if (ch < 128 || ch == EOF) { + // nothing to do, first 127 chars are the same in ascii and utf8 + // 0xxxxxxx or end of file character + } else if ((ch & 0xF0) == 0xF0) { + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x07; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; ch = base.Read(); + int c4 = ch & 0x3F; + ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4; + } else if ((ch & 0xE0) == 0xE0) { + // 1110xxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x0F; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; + ch = (((c1 << 6) | c2) << 6) | c3; + } else if ((ch & 0xC0) == 0xC0) { + // 110xxxxx 10xxxxxx + int c1 = ch & 0x1F; ch = base.Read(); + int c2 = ch & 0x3F; + ch = (c1 << 6) | c2; + } + return ch; + } +} + +//----------------------------------------------------------------------------------- +// Scanner +//----------------------------------------------------------------------------------- +public class Scanner { + const char EOL = '\n'; + const int eofSym = 0; /* pdt */ +-->declarations + + public Buffer buffer; // scanner buffer + + Token t; // current token + int ch; // current input character + int pos; // byte position of current character + int charPos; // position by unicode characters starting with 0 + int col; // column number of current character + int line; // line number of current character + int oldEols; // EOLs that appeared in a comment; + static readonly Dictionary start; // maps first token character to start state + + Token tokens; // list of tokens already peeked (first token is a dummy) + Token pt; // current peek token + + char[] tval = new char[128]; // text of current token + int tlen; // length of current token + + static Scanner() { + start = new Dictionary(128); +-->initialization + } + + public Scanner (string fileName) { + try { + Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + buffer = new Buffer(stream, false); + Init(); + } catch (IOException) { + throw new FatalError("Cannot open file " + fileName); + } + } + + public Scanner (Stream s) { + buffer = new Buffer(s, true); + Init(); + } + + void Init() { + pos = -1; line = 1; col = 0; charPos = -1; + oldEols = 0; + NextCh(); + if (ch == 0xEF) { // check optional byte order mark for UTF-8 + NextCh(); int ch1 = ch; + NextCh(); int ch2 = ch; + if (ch1 != 0xBB || ch2 != 0xBF) { + throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2)); + } + buffer = new UTF8Buffer(buffer); col = 0; charPos = -1; + NextCh(); + } + pt = tokens = new Token(); // first token is a dummy + } + + void NextCh() { + if (oldEols > 0) { ch = EOL; oldEols--; } + else { + pos = buffer.Pos; + // buffer reads unicode chars, if UTF8 has been detected + ch = buffer.Read(); col++; charPos++; + // replace isolated '\r' by '\n' in order to make + // eol handling uniform across Windows, Unix and Mac + if (ch == '\r' && buffer.Peek() != '\n') ch = EOL; + if (ch == EOL) { line++; col = 0; } + } +-->casing1 + } + + void AddCh() { + if (tlen >= tval.Length) { + char[] newBuf = new char[2 * tval.Length]; + Array.Copy(tval, 0, newBuf, 0, tval.Length); + tval = newBuf; + } + if (ch != Buffer.EOF) { +-->casing2 + NextCh(); + } + } + + +-->comments + + void CheckLiteral() { +-->literals + } + + Token NextToken() { + while (ch == ' ' || +-->scan1 + ) NextCh(); +-->scan2 + int recKind = noSym; + int recEnd = pos; + t = new Token(); + t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; + int state; + state = (int) start[ch]; + tlen = 0; AddCh(); + + switch (state) { + case -1: { t.kind = eofSym; break; } // NextCh already done + case 0: { + if (recKind != noSym) { + tlen = recEnd - t.pos; + SetScannerBehindT(); + } + t.kind = recKind; break; + } // NextCh already done +-->scan3 + } + t.val = new String(tval, 0, tlen); + return t; + } + + private void SetScannerBehindT() { + buffer.Pos = t.pos; + NextCh(); + line = t.line; col = t.col; charPos = t.charPos; + for (int i = 0; i < tlen; i++) NextCh(); + } + + // get the next token (possibly a token already seen during peeking) + public Token Scan () { + if (tokens.next == null) { + return NextToken(); + } else { + pt = tokens = tokens.next; + return tokens; + } + } + + // peek for the next token, ignore pragmas + public Token Peek () { + do { + if (pt.next == null) { + pt.next = NextToken(); + } + pt = pt.next; + } while (pt.kind > maxT); // skip pragmas + + return pt; + } + + // make sure that peeking starts at the current scan position + public void ResetPeek () { pt = tokens; } + +} // end Scanner diff --git a/CS-MIC/csmic/csmic/MacroBuilder.cs b/CS-MIC/csmic/csmic/MacroBuilder.cs new file mode 100644 index 0000000..dad631c --- /dev/null +++ b/CS-MIC/csmic/csmic/MacroBuilder.cs @@ -0,0 +1,337 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using System.Threading; +using csmic.Scripting; +using System.Runtime.Remoting.Messaging; + +namespace csmic +{ + /// + /// A builder object that executes macro scripts. + /// + public class MacroBuilder + { + #region Members + + /// + /// The input inputInterpreter. + /// + private InputInterpreter interpreter; + /// The script to run as a macro. + private string script; + /// + /// The output as a list of strings. + /// + private List output; + /// + /// The time for execution. + /// + private TimeSpan executionTime; + /// + /// The root macro operation. + /// + private MacroOperation rootOperation; + + #endregion + + #region Constructor + + /// + /// Creates a new builder object that executes a given macro script. + /// + /// A list of strings representing the macro. + /// The InputInterpreter to be used. + public MacroBuilder(string script, InputInterpreter inputInterpreter) + { + this.output = new List(); + this.executionTime = new TimeSpan(); + + this.script = script; + this.interpreter = inputInterpreter; + } + + /// + /// Creates a new builder object that executes a given macro script. + /// + /// A list of strings representing the macro. + /// The InputInterpreter to be used. + internal MacroBuilder(MacroOperation script, InputInterpreter inputInterpreter) + { + this.output = new List(); + this.executionTime = new TimeSpan(); + DateTime timeStart = DateTime.Now; + + this.interpreter = inputInterpreter; + + this.rootOperation = script; + + ExecuteOperation(this.rootOperation); + + DateTime timeEnd = DateTime.Now; + this.executionTime = timeEnd - timeStart; + } + + #endregion + + #region Properties + + /// + /// Gets a list of strings representing the output. + /// + public List Output + { + get + { + return this.output; + } + } + + /// + /// Gets the execution time of the last script computation. + /// + public TimeSpan LastExecutionTime + { + get + { + return this.executionTime; + } + } + + /// + /// Gets the decimal value last computed by the macrobuilder. + /// + public string FinalOutput + { + get + { + return this.interpreter.Output; + } + } + + #endregion + + #region Public Methods + + /// Runs this macro. + public void Run() + { + DateTime timeStart = DateTime.Now; + + ASCIIEncoding encoder = new ASCIIEncoding(); + Parser p = new Parser(new Scanner(new MemoryStream(encoder.GetBytes(this.script)))); + p.Parse(); + + this.rootOperation = p.Root; + + ExecuteOperation(p.Root); + + DateTime timeEnd = DateTime.Now; + this.executionTime = timeEnd - timeStart; + } + + #endregion + + #region Private Methods + + private void ExecuteOperation(MacroOperation operation) + { + switch (operation.OperationType) + { + case OperationType.If: + if (operation.Input.Count == 1) + { + this.interpreter.Interpret(operation.Input[0]); + if (this.interpreter.Decimal == 1) + { + foreach (MacroOperation op in operation.Children) + { + ExecuteOperation(op); + } + } + } + break; + case OperationType.Else: + foreach (MacroOperation op in operation.Children) + { + ExecuteOperation(op); + } + break; + case OperationType.IfElse: + if (operation.Children.Count == 2 && operation.Children[0].Input.Count == 1) + { + MacroOperation ifOp = operation.Children[0]; + MacroOperation elseOp = operation.Children[1]; + this.interpreter.Interpret(ifOp.Input[0]); + if (this.interpreter.Decimal == 1) + { + foreach (MacroOperation op in ifOp.Children) + { + ExecuteOperation(op); + } + } + else + { + foreach (MacroOperation op in elseOp.Children) + { + ExecuteOperation(op); + } + } + } + break; + case OperationType.While: + if (operation.Input.Count == 1) + { + this.interpreter.Interpret(operation.Input[0]); + while (this.interpreter.Decimal == 1) + { + foreach (MacroOperation op in operation.Children) + { + ExecuteOperation(op); + } + this.interpreter.Interpret(operation.Input[0]); + } + } + break; + case OperationType.For: + if (operation.Input.Count == 3) + { + this.interpreter.Interpret(operation.Input[0]); + this.interpreter.Interpret(operation.Input[1]); + int loopCount = this.interpreter.Int; + while (this.interpreter.Int == 1) + { + foreach (MacroOperation op in operation.Children) + { + ExecuteOperation(op); + } + this.interpreter.Interpret(operation.Input[2]); + this.interpreter.Interpret(operation.Input[1]); + } + } + break; + case OperationType.FunctionDeclaration: + if (operation.Input.Count > 1) + { + string name = operation.Input[0]; + operation.Input.RemoveAt(0); + StringBuilder builder = new StringBuilder(); + operation.OperationType = OperationType.Unknown; + InterpretedFunction function = new InterpretedFunction(name, operation, operation.Input.ToArray()); + if (this.interpreter.InterpretedFunctions.Contains(function)) + { + this.interpreter.InterpretedFunctions[this.interpreter.InterpretedFunctions.IndexOf(function)] = function; + } + else + { + this.interpreter.InterpretedFunctions.Add(function); + } + } + break; + case OperationType.Echo: + if (operation.Children.Count == 1) + { + MacroOperation op = operation.Children[0]; + if (op.OperationType == OperationType.Statement) + { + this.interpreter.Interpret(op.Input[0]); + this.output.Add(this.interpreter.Output); + } + } + break; + case OperationType.Say: + if (operation.Input.Count == 1) + { + this.output.Add(operation.Input[0]); + } + break; + case OperationType.Display: + StringBuilder sb = new StringBuilder(); + foreach (MacroOperation op in operation.Children) + { + if (op.OperationType == OperationType.Statement) + { + if (op.Input.Count == 1) + { + this.interpreter.Interpret(op.Input[0]); + sb.Append(this.interpreter.Output); + } + } + else if (op.OperationType == OperationType.String) + { + if (op.Input.Count == 1) + { + sb.Append(op.Input[0]); + } + } + } + this.output.Add(sb.ToString()); + break; + case OperationType.Statement: + if (operation.Input.Count == 1) + { + this.interpreter.Interpret(operation.Input[0]); + } + break; + case OperationType.String: + //Should not reach this state. + break; + case OperationType.Unknown: + if (operation.Children.Count > 0) + { + foreach (MacroOperation op in operation.Children) + { + ExecuteOperation(op); + } + } + break; + default: + //CRAP. + break; + } + } + + #endregion + + #region Asynchronous + + /// Executes the asynchronous operation. + /// The input. + /// The callback. + public void RunAsync(string input, Action callback) + { + MacroAsyncDelegate del = new MacroAsyncDelegate(RunAsyncThreadingWork); + del.BeginInvoke(input, (result) => + { + AsyncResult returned = result as AsyncResult; + if (returned != null) + { + MacroAsyncDelegate end = returned.AsyncDelegate as MacroAsyncDelegate; + if (end != null) + { + MacroBuilder returnValue = end.EndInvoke(result); + callback(returnValue); + } + } + }, null); + } + + /// Executes the asynchronous threading work operation. + /// The input. + /// . + private MacroBuilder RunAsyncThreadingWork(string input) + { + Run(); + return this; + } + + /// Macro asynchronous delegate. + /// The input. + /// . + private delegate MacroBuilder MacroAsyncDelegate(string input); + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/MacroOperation.cs b/CS-MIC/csmic/csmic/MacroOperation.cs new file mode 100644 index 0000000..4e448e7 --- /dev/null +++ b/CS-MIC/csmic/csmic/MacroOperation.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic +{ + /// + /// Represents the operation types supported by a scripted macro. + /// + internal enum OperationType + { + /// + /// Represents a conditional block. + /// + If, + /// + /// Represents a conditional else block. + /// + Else, + /// + /// Represents a complete conditional block. + /// + IfElse, + /// + /// A while block. + /// + While, + /// + /// A for block. + /// + For, + /// + /// A function declaration. + /// + FunctionDeclaration, + /// + /// An echo statement. + /// + Echo, + /// + /// A say statement. + /// + Say, + /// + /// A display statement. + /// + Display, + /// + /// A statement to execute. + /// + Statement, + /// + /// A string to display. + /// + String, + /// + /// An unknown or malformed block. + /// + Unknown + } + + /// + /// An operation object that executes a specified action. + /// + internal class MacroOperation + { + #region Members + + /// + /// The type of operation represented by the operation. + /// + private OperationType operationType; + /// + /// The collection of children nodes that belong to the operation. + /// + private List children; + /// + /// A list of the necesary input to execute the operation. + /// + private List input; + + #endregion + + #region Constructor + + /// + /// Creates a new macro operation node. + /// + /// The type of operation the node represents. + public MacroOperation(OperationType operationType) + { + this.operationType = operationType; + this.children = new List(); + this.input = new List(); + } + + #endregion + + #region Properties + + /// + /// Gets or sets the children nodes of the operation. + /// + public List Children + { + get + { + return this.children; + } + set + { + this.children = value; + } + } + + /// + /// Gets or sets the input for the operation. + /// + public List Input + { + get + { + return this.input; + } + set + { + this.input = value; + } + } + + /// + /// Gets or sets the operation type for this operation. + /// + public OperationType OperationType + { + get + { + return this.operationType; + } + set + { + this.operationType = value; + } + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/Properties/AssemblyInfo.cs b/CS-MIC/csmic/csmic/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..842b681 --- /dev/null +++ b/CS-MIC/csmic/csmic/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("csmic")] +[assembly: AssemblyDescription("A .NET component for easy access to parsing simple math and scripting.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Jordan Wages")] +[assembly: AssemblyProduct("csmic")] +[assembly: AssemblyCopyright("Copyright © 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e36b7d85-f0e6-4f24-ba03-ac53124dd97e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.1.5.0")] +[assembly: AssemblyFileVersion("1.1.5.0")] diff --git a/CS-MIC/csmic/csmic/ScriptParser/Parser.cs b/CS-MIC/csmic/csmic/ScriptParser/Parser.cs new file mode 100644 index 0000000..4f29bbe --- /dev/null +++ b/CS-MIC/csmic/csmic/ScriptParser/Parser.cs @@ -0,0 +1,798 @@ +using csmic; +using System.Text; +using System.Collections.Generic; + + + +using System; +using System.CodeDom.Compiler; + +namespace csmic.Scripting { + + + +[GeneratedCodeAttribute("Coco/R", "")] +public class Parser { + public const int _EOF = 0; + public const int _identifier = 1; + public const int _sign = 2; + public const int _binary = 3; + public const int _hex = 4; + public const int _number = 5; + public const int _newline = 6; + public const int _string = 7; + public const int _LPAREN = 8; + public const int _RPAREN = 9; + public const int _COMPARER = 10; + public const int maxT = 34; + + const bool T = true; + const bool x = false; + const int minErrDist = 2; + + public Scanner scanner; + public Errors errors; + + public Token t; // last recognized token + public Token la; // lookahead token + int errDist = minErrDist; + +private MacroOperation root = new MacroOperation(OperationType.Unknown); + +internal MacroOperation Root +{ + get + { + return this.root; + } + set + { + this.root = value; + } +} + +bool IsFunctionCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _LPAREN && la.kind == _identifier) + return true; + return false; +} + +bool IsCompare() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _COMPARER) + return true; + return false; +} + +bool IsAssignment() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.val == "::" || next.val == ":=" || next.val == "->") + return true; + return false; +} + +bool IsArrayCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if(next.val == "[") + return true; + return false; +} + + + + public Parser(Scanner scanner) { + this.scanner = scanner; + errors = new Errors(); + } + + void SynErr (int n) { + if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n); + errDist = 0; + } + + public void SemErr (string msg) { + if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg); + errDist = 0; + } + + void Get () { + for (;;) { + t = la; + la = scanner.Scan(); + if (la.kind <= maxT) { ++errDist; break; } + + la = t; + } + } + + void Expect (int n) { + if (la.kind==n) Get(); else { SynErr(n); } + } + + bool StartOf (int s) { + return set[s, la.kind]; + } + + void ExpectWeak (int n, int follow) { + if (la.kind == n) Get(); + else { + SynErr(n); + while (!StartOf(follow)) Get(); + } + } + + + bool WeakSeparator(int n, int syFol, int repFol) { + int kind = la.kind; + if (kind == n) {Get(); return true;} + else if (StartOf(repFol)) {return false;} + else { + SynErr(n); + while (!(set[syFol, kind] || set[repFol, kind] || set[0, kind])) { + Get(); + kind = la.kind; + } + return StartOf(syFol); + } + } + + + void SCRIPT() { + string statement = string.Empty; + while (StartOf(1)) { + switch (la.kind) { + case 1: case 3: case 4: case 5: case 8: case 22: case 23: { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + this.root.Children.Add(operation); + + break; + } + case 11: { + IfBlock(ref this.root); + break; + } + case 15: { + WhileBlock(ref this.root); + break; + } + case 18: { + FunctionDeclaration(ref this.root); + break; + } + case 19: { + EchoStatement(ref this.root); + break; + } + case 20: { + SayStatement(ref this.root); + break; + } + case 21: { + DisplayStatement(ref this.root); + break; + } + case 16: { + ForBlock(ref this.root); + break; + } + } + } + } + + void Statement(out string value) { + value = string.Empty; + StringBuilder builder = new StringBuilder(); + + if (IsAssignment()) { + Assignment(ref builder); + value = builder.ToString(); + } else if (StartOf(2)) { + Expression(ref builder); + value = builder.ToString(); + } else SynErr(35); + } + + void IfBlock(ref MacroOperation parent) { + MacroOperation ifBlock = new MacroOperation(OperationType.If); + MacroOperation elseBlock = new MacroOperation(OperationType.Else); + string ifStatement = string.Empty; + string statement = string.Empty; + StringBuilder builder = new StringBuilder(); + bool hasElse = false; + + Expect(11); + Expect(8); + Comparison(ref builder); + ifStatement = builder.ToString(); ifBlock.Input.Add(ifStatement); + Expect(9); + Expect(12); + while (StartOf(3)) { + switch (la.kind) { + case 1: case 3: case 4: case 5: case 8: case 22: case 23: { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + ifBlock.Children.Add(operation); + + break; + } + case 11: { + IfBlock(ref ifBlock); + break; + } + case 15: { + WhileBlock(ref ifBlock); + break; + } + case 19: { + EchoStatement(ref ifBlock); + break; + } + case 20: { + SayStatement(ref ifBlock); + break; + } + case 21: { + DisplayStatement(ref ifBlock); + break; + } + case 16: { + ForBlock(ref ifBlock); + break; + } + } + } + Expect(13); + if (la.kind == 14) { + Get(); + hasElse = true; + Expect(12); + while (StartOf(3)) { + switch (la.kind) { + case 1: case 3: case 4: case 5: case 8: case 22: case 23: { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + elseBlock.Children.Add(operation); + + break; + } + case 11: { + IfBlock(ref elseBlock); + break; + } + case 15: { + WhileBlock(ref elseBlock); + break; + } + case 19: { + EchoStatement(ref elseBlock); + break; + } + case 20: { + SayStatement(ref elseBlock); + break; + } + case 21: { + DisplayStatement(ref elseBlock); + break; + } + case 16: { + ForBlock(ref elseBlock); + break; + } + } + } + Expect(13); + } + if(hasElse) + { + MacroOperation ifelse = new MacroOperation(OperationType.IfElse); + ifelse.Children.Add(ifBlock); + ifelse.Children.Add(elseBlock); + parent.Children.Add(ifelse); + } + else + { + parent.Children.Add(ifBlock); + } + + } + + void WhileBlock(ref MacroOperation parent) { + StringBuilder builder = new StringBuilder(); + MacroOperation whileBlock = new MacroOperation(OperationType.While); + string statement = string.Empty; + + Expect(15); + Expect(8); + Comparison(ref builder); + whileBlock.Input.Add(builder.ToString()); + Expect(9); + Expect(12); + while (StartOf(3)) { + switch (la.kind) { + case 1: case 3: case 4: case 5: case 8: case 22: case 23: { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + whileBlock.Children.Add(operation); + + break; + } + case 11: { + IfBlock(ref whileBlock); + break; + } + case 15: { + WhileBlock(ref whileBlock); + break; + } + case 19: { + EchoStatement(ref whileBlock); + break; + } + case 20: { + SayStatement(ref whileBlock); + break; + } + case 21: { + DisplayStatement(ref whileBlock); + break; + } + case 16: { + ForBlock(ref whileBlock); + break; + } + } + } + Expect(13); + parent.Children.Add(whileBlock); + + } + + void FunctionDeclaration(ref MacroOperation parent) { + StringBuilder builder = new StringBuilder(); + string statement = string.Empty; + MacroOperation func = new MacroOperation(OperationType.FunctionDeclaration); + + Expect(18); + Expect(8); + CommaList(ref builder); + string[] args = builder.ToString().Split(','); func.Input.AddRange(args); + Expect(9); + Expect(12); + while (StartOf(3)) { + switch (la.kind) { + case 1: case 3: case 4: case 5: case 8: case 22: case 23: { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + func.Children.Add(operation); + + break; + } + case 11: { + IfBlock(ref func); + break; + } + case 15: { + WhileBlock(ref func); + break; + } + case 19: { + EchoStatement(ref func); + break; + } + case 20: { + SayStatement(ref func); + break; + } + case 21: { + DisplayStatement(ref func); + break; + } + case 16: { + ForBlock(ref func); + break; + } + } + } + Expect(13); + parent.Children.Add(func); + + } + + void EchoStatement(ref MacroOperation parent) { + StringBuilder builder = new StringBuilder(); + MacroOperation echoStatement = new MacroOperation(OperationType.Echo); + string statement = string.Empty; + + Expect(19); + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + echoStatement.Children.Add(operation); + parent.Children.Add(echoStatement); + + } + + void SayStatement(ref MacroOperation parent) { + StringBuilder builder = new StringBuilder(); + MacroOperation sayStatement = new MacroOperation(OperationType.Say); + string statement = string.Empty; + + Expect(20); + Expect(7); + statement = t.val.Replace("\"", ""); + sayStatement.Input.Add(statement); + parent.Children.Add(sayStatement); + + } + + void DisplayStatement(ref MacroOperation parent) { + StringBuilder builder = new StringBuilder(); + MacroOperation displayStatement = new MacroOperation(OperationType.Display); + string statement = string.Empty; + + Expect(21); + if (StartOf(2)) { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + displayStatement.Children.Add(operation); + + } else if (la.kind == 7) { + Get(); + statement = t.val.Replace("\"", ""); + MacroOperation operation = new MacroOperation(OperationType.String); + operation.Input.Add(statement); + displayStatement.Children.Add(operation); + + } else SynErr(36); + while (la.kind == 17) { + Get(); + if (StartOf(2)) { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + displayStatement.Children.Add(operation); + + } else if (la.kind == 7) { + Get(); + statement = t.val.Replace("\"", ""); + MacroOperation operation = new MacroOperation(OperationType.String); + operation.Input.Add(statement); + displayStatement.Children.Add(operation); + + } else SynErr(37); + } + parent.Children.Add(displayStatement); + + } + + void ForBlock(ref MacroOperation parent) { + StringBuilder builder = new StringBuilder(); + string statement = string.Empty; + string statement2 = string.Empty; + MacroOperation forBlock = new MacroOperation(OperationType.For); + + Expect(16); + Expect(8); + Statement(out statement); + Expect(17); + Comparison(ref builder); + Expect(17); + Statement(out statement2); + forBlock.Input.Add(statement); forBlock.Input.Add(builder.ToString()); forBlock.Input.Add(statement2); + Expect(9); + Expect(12); + while (StartOf(3)) { + switch (la.kind) { + case 1: case 3: case 4: case 5: case 8: case 22: case 23: { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + forBlock.Children.Add(operation); + + break; + } + case 11: { + IfBlock(ref forBlock); + break; + } + case 15: { + WhileBlock(ref forBlock); + break; + } + case 19: { + EchoStatement(ref forBlock); + break; + } + case 20: { + SayStatement(ref forBlock); + break; + } + case 21: { + DisplayStatement(ref forBlock); + break; + } + case 16: { + ForBlock(ref forBlock); + break; + } + } + } + Expect(13); + parent.Children.Add(forBlock); + + } + + void Comparison(ref StringBuilder result) { + Expression(ref result); + Expect(10); + result.Append(t.val); + Expression(ref result); + } + + void CommaList(ref StringBuilder builder) { + Expression(ref builder); + while (la.kind == 17) { + Get(); + builder.Append(t.val); + Expression(ref builder); + } + } + + void Assignment(ref StringBuilder builder) { + Expect(1); + builder.Append(t.val); + if (la.kind == 30) { + Get(); + builder.Append(t.val); + Expression(ref builder); + } else if (la.kind == 31) { + Get(); + builder.Append(t.val); string value = string.Empty; + AnyExpression(out value); + builder.Append(value); + Expect(6); + } else if (la.kind == 32) { + Get(); + builder.Append(t.val); + ArrayL(ref builder); + } else SynErr(38); + } + + void Expression(ref StringBuilder builder) { + Term(ref builder); + while (la.kind == 22 || la.kind == 23 || la.kind == 24) { + if (la.kind == 22) { + Get(); + builder.Append(t.val); + Term(ref builder); + } else if (la.kind == 23) { + Get(); + builder.Append(t.val); + Term(ref builder); + } else { + Get(); + builder.Append(t.val); + Term(ref builder); + } + } + } + + void Term(ref StringBuilder builder) { + Factor(ref builder); + while (la.kind == 25 || la.kind == 26) { + if (la.kind == 25) { + Get(); + builder.Append(t.val); + Factor(ref builder); + } else { + Get(); + builder.Append(t.val); + Factor(ref builder); + } + } + } + + void Factor(ref StringBuilder builder) { + Value(ref builder); + while (la.kind == 27) { + Get(); + builder.Append(t.val); + Value(ref builder); + } + } + + void Value(ref StringBuilder builder) { + if (la.kind == 22 || la.kind == 23) { + if (la.kind == 22) { + Get(); + builder.Append(t.val); + } else { + Get(); + builder.Append(t.val); + } + } + if (IsFunctionCall()) { + Function(ref builder); + } else if (IsArrayCall()) { + ArrayCall(ref builder); + } else if (la.kind == 1) { + Get(); + builder.Append(t.val); + } else if (la.kind == 5) { + Get(); + builder.Append(t.val); + } else if (la.kind == 4) { + Get(); + builder.Append(t.val); + } else if (la.kind == 3) { + Get(); + builder.Append(t.val); + } else if (la.kind == 8) { + Get(); + builder.Append(t.val); + Expression(ref builder); + Expect(9); + builder.Append(t.val); + } else SynErr(39); + } + + void Function(ref StringBuilder builder) { + Expect(1); + builder.Append(t.val); + Expect(8); + builder.Append(t.val); + CommaList(ref builder); + Expect(9); + builder.Append(t.val); + } + + void ArrayCall(ref StringBuilder builder) { + Expect(1); + builder.Append(t.val); + Expect(28); + builder.Append(t.val); + Expression(ref builder); + Expect(29); + builder.Append(t.val); + } + + void ArrayL(ref StringBuilder builder) { + Expect(28); + builder.Append(t.val); + CommaList(ref builder); + Expect(29); + builder.Append(t.val); + } + + void AnyExpression(out string value) { + value = string.Empty; StringBuilder builder = new StringBuilder(); + Get(); + builder.Append(t.val); + while (StartOf(4)) { + Get(); + builder.Append(t.val); + } + Expect(33); + value = builder.ToString(); + } + + + + public void Parse() { + la = new Token(); + la.val = ""; + Get(); + SCRIPT(); + Expect(0); + + Expect(0); + } + + static readonly bool[,] set = { + {T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x}, + {x,T,x,T, T,T,x,x, T,x,x,T, x,x,x,T, T,x,T,T, T,T,T,T, x,x,x,x, x,x,x,x, x,x,x,x}, + {x,T,x,T, T,T,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,T,T, x,x,x,x, x,x,x,x, x,x,x,x}, + {x,T,x,T, T,T,x,x, T,x,x,T, x,x,x,T, T,x,x,T, T,T,T,T, x,x,x,x, x,x,x,x, x,x,x,x}, + {x,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,x,T,x} + + }; +} // end Parser + + +public class Errors { + public int count = 0; // number of errors detected + public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream + public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text + + public void SynErr (int line, int col, int n) { + string s; + switch (n) { + case 0: s = "EOF expected"; break; + case 1: s = "identifier expected"; break; + case 2: s = "sign expected"; break; + case 3: s = "binary expected"; break; + case 4: s = "hex expected"; break; + case 5: s = "number expected"; break; + case 6: s = "newline expected"; break; + case 7: s = "string expected"; break; + case 8: s = "LPAREN expected"; break; + case 9: s = "RPAREN expected"; break; + case 10: s = "COMPARER expected"; break; + case 11: s = "\"if\" expected"; break; + case 12: s = "\"{\" expected"; break; + case 13: s = "\"}\" expected"; break; + case 14: s = "\"else\" expected"; break; + case 15: s = "\"while\" expected"; break; + case 16: s = "\"for\" expected"; break; + case 17: s = "\",\" expected"; break; + case 18: s = "\"function\" expected"; break; + case 19: s = "\"echo:\" expected"; break; + case 20: s = "\"say:\" expected"; break; + case 21: s = "\"display:\" expected"; break; + case 22: s = "\"+\" expected"; break; + case 23: s = "\"-\" expected"; break; + case 24: s = "\"%\" expected"; break; + case 25: s = "\"*\" expected"; break; + case 26: s = "\"/\" expected"; break; + case 27: s = "\"^\" expected"; break; + case 28: s = "\"[\" expected"; break; + case 29: s = "\"]\" expected"; break; + case 30: s = "\"::\" expected"; break; + case 31: s = "\":=\" expected"; break; + case 32: s = "\"->\" expected"; break; + case 33: s = "\"\\n\" expected"; break; + case 34: s = "??? expected"; break; + case 35: s = "invalid Statement"; break; + case 36: s = "invalid DisplayStatement"; break; + case 37: s = "invalid DisplayStatement"; break; + case 38: s = "invalid Assignment"; break; + case 39: s = "invalid Value"; break; + + default: s = "error " + n; break; + } + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public void SemErr (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public void SemErr (string s) { + errorStream.WriteLine(s); + count++; + } + + public void Warning (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + } + + public void Warning(string s) { + errorStream.WriteLine(s); + } +} // Errors + + +public class FatalError: Exception { + public FatalError(string m): base(m) {} +} + +} \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/ScriptParser/Parser.frame b/CS-MIC/csmic/csmic/ScriptParser/Parser.frame new file mode 100644 index 0000000..ac4cdf0 --- /dev/null +++ b/CS-MIC/csmic/csmic/ScriptParser/Parser.frame @@ -0,0 +1,160 @@ +/*---------------------------------------------------------------------- +Compiler Generator Coco/R, +Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz +extended by M. Loeberbauer & A. Woess, Univ. of Linz +with improvements by Pat Terry, Rhodes University + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +As an exception, it is allowed to write an extension of Coco/R that is +used as a plugin in non-free software. + +If not otherwise stated, any source code generated by Coco/R (other than +Coco/R itself) does not fall under the GNU General Public License. +----------------------------------------------------------------------*/ +-->begin +using System; +using System.CodeDom.Compiler; + +-->namespace + +[GeneratedCodeAttribute("Coco/R", "")] +public class Parser { +-->constants + const bool T = true; + const bool x = false; + const int minErrDist = 2; + + public Scanner scanner; + public Errors errors; + + public Token t; // last recognized token + public Token la; // lookahead token + int errDist = minErrDist; + +-->declarations + + public Parser(Scanner scanner) { + this.scanner = scanner; + errors = new Errors(); + } + + void SynErr (int n) { + if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n); + errDist = 0; + } + + public void SemErr (string msg) { + if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg); + errDist = 0; + } + + void Get () { + for (;;) { + t = la; + la = scanner.Scan(); + if (la.kind <= maxT) { ++errDist; break; } +-->pragmas + la = t; + } + } + + void Expect (int n) { + if (la.kind==n) Get(); else { SynErr(n); } + } + + bool StartOf (int s) { + return set[s, la.kind]; + } + + void ExpectWeak (int n, int follow) { + if (la.kind == n) Get(); + else { + SynErr(n); + while (!StartOf(follow)) Get(); + } + } + + + bool WeakSeparator(int n, int syFol, int repFol) { + int kind = la.kind; + if (kind == n) {Get(); return true;} + else if (StartOf(repFol)) {return false;} + else { + SynErr(n); + while (!(set[syFol, kind] || set[repFol, kind] || set[0, kind])) { + Get(); + kind = la.kind; + } + return StartOf(syFol); + } + } + + +-->productions + + public void Parse() { + la = new Token(); + la.val = ""; + Get(); +-->parseRoot + Expect(0); + } + + static readonly bool[,] set = { +-->initialization + }; +} // end Parser + + +public class Errors { + public int count = 0; // number of errors detected + public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream + public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text + + public void SynErr (int line, int col, int n) { + string s; + switch (n) { +-->errors + default: s = "error " + n; break; + } + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public void SemErr (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public void SemErr (string s) { + errorStream.WriteLine(s); + count++; + } + + public void Warning (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + } + + public void Warning(string s) { + errorStream.WriteLine(s); + } +} // Errors + + +public class FatalError: Exception { + public FatalError(string m): base(m) {} +} + diff --git a/CS-MIC/csmic/csmic/ScriptParser/Scanner.cs b/CS-MIC/csmic/csmic/ScriptParser/Scanner.cs new file mode 100644 index 0000000..846daae --- /dev/null +++ b/CS-MIC/csmic/csmic/ScriptParser/Scanner.cs @@ -0,0 +1,637 @@ + +using System; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.CodeDom.Compiler; + +namespace csmic.Scripting { + +[GeneratedCodeAttribute("Coco/R", "")] +public class Token { + public int kind; // token kind + public int pos; // token position in bytes in the source text (starting at 0) + public int charPos; // token position in characters in the source text (starting at 0) + public int col; // token column (starting at 1) + public int line; // token line (starting at 1) + public string val; // token value + public Token next; // ML 2005-03-11 Tokens are kept in linked list +} + +//----------------------------------------------------------------------------------- +// Buffer +//----------------------------------------------------------------------------------- +public class Buffer { + // This Buffer supports the following cases: + // 1) seekable stream (file) + // a) whole stream in buffer + // b) part of stream in buffer + // 2) non seekable stream (network, console) + + public const int EOF = char.MaxValue + 1; + const int MIN_BUFFER_LENGTH = 1024; // 1KB + const int MAX_BUFFER_LENGTH = MIN_BUFFER_LENGTH * 64; // 64KB + byte[] buf; // input buffer + int bufStart; // position of first byte in buffer relative to input stream + int bufLen; // length of buffer + int fileLen; // length of input stream (may change if the stream is no file) + int bufPos; // current position in buffer + Stream stream; // input stream (seekable) + bool isUserStream; // was the stream opened by the user? + + public Buffer (Stream s, bool isUserStream) { + stream = s; this.isUserStream = isUserStream; + + if (stream.CanSeek) { + fileLen = (int) stream.Length; + bufLen = Math.Min(fileLen, MAX_BUFFER_LENGTH); + bufStart = Int32.MaxValue; // nothing in the buffer so far + } else { + fileLen = bufLen = bufStart = 0; + } + + buf = new byte[(bufLen>0) ? bufLen : MIN_BUFFER_LENGTH]; + if (fileLen > 0) Pos = 0; // setup buffer to position 0 (start) + else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid + if (bufLen == fileLen && stream.CanSeek) Close(); + } + + protected Buffer(Buffer b) { // called in UTF8Buffer constructor + buf = b.buf; + bufStart = b.bufStart; + bufLen = b.bufLen; + fileLen = b.fileLen; + bufPos = b.bufPos; + stream = b.stream; + // keep destructor from closing the stream + b.stream = null; + isUserStream = b.isUserStream; + } + + ~Buffer() { Close(); } + + protected void Close() { + if (!isUserStream && stream != null) { + stream.Close(); + stream = null; + } + } + + public virtual int Read () { + if (bufPos < bufLen) { + return buf[bufPos++]; + } else if (Pos < fileLen) { + Pos = Pos; // shift buffer start to Pos + return buf[bufPos++]; + } else if (stream != null && !stream.CanSeek && ReadNextStreamChunk() > 0) { + return buf[bufPos++]; + } else { + return EOF; + } + } + + public int Peek () { + int curPos = Pos; + int ch = Read(); + Pos = curPos; + return ch; + } + + // beg .. begin, zero-based, inclusive, in byte + // end .. end, zero-based, exclusive, in byte + public string GetString (int beg, int end) { + int len = 0; + char[] buf = new char[end - beg]; + int oldPos = Pos; + Pos = beg; + while (Pos < end) buf[len++] = (char) Read(); + Pos = oldPos; + return new String(buf, 0, len); + } + + public int Pos { + get { return bufPos + bufStart; } + set { + if (value >= fileLen && stream != null && !stream.CanSeek) { + // Wanted position is after buffer and the stream + // is not seek-able e.g. network or console, + // thus we have to read the stream manually till + // the wanted position is in sight. + while (value >= fileLen && ReadNextStreamChunk() > 0); + } + + if (value < 0 || value > fileLen) { + throw new FatalError("buffer out of bounds access, position: " + value); + } + + if (value >= bufStart && value < bufStart + bufLen) { // already in buffer + bufPos = value - bufStart; + } else if (stream != null) { // must be swapped in + stream.Seek(value, SeekOrigin.Begin); + bufLen = stream.Read(buf, 0, buf.Length); + bufStart = value; bufPos = 0; + } else { + // set the position to the end of the file, Pos will return fileLen. + bufPos = fileLen - bufStart; + } + } + } + + // Read the next chunk of bytes from the stream, increases the buffer + // if needed and updates the fields fileLen and bufLen. + // Returns the number of bytes read. + private int ReadNextStreamChunk() { + int free = buf.Length - bufLen; + if (free == 0) { + // in the case of a growing input stream + // we can neither seek in the stream, nor can we + // foresee the maximum length, thus we must adapt + // the buffer size on demand. + byte[] newBuf = new byte[bufLen * 2]; + Array.Copy(buf, newBuf, bufLen); + buf = newBuf; + free = bufLen; + } + int read = stream.Read(buf, bufLen, free); + if (read > 0) { + fileLen = bufLen = (bufLen + read); + return read; + } + // end of stream reached + return 0; + } +} + +//----------------------------------------------------------------------------------- +// UTF8Buffer +//----------------------------------------------------------------------------------- +public class UTF8Buffer: Buffer { + public UTF8Buffer(Buffer b): base(b) {} + + public override int Read() { + int ch; + do { + ch = base.Read(); + // until we find a utf8 start (0xxxxxxx or 11xxxxxx) + } while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EOF)); + if (ch < 128 || ch == EOF) { + // nothing to do, first 127 chars are the same in ascii and utf8 + // 0xxxxxxx or end of file character + } else if ((ch & 0xF0) == 0xF0) { + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x07; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; ch = base.Read(); + int c4 = ch & 0x3F; + ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4; + } else if ((ch & 0xE0) == 0xE0) { + // 1110xxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x0F; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; + ch = (((c1 << 6) | c2) << 6) | c3; + } else if ((ch & 0xC0) == 0xC0) { + // 110xxxxx 10xxxxxx + int c1 = ch & 0x1F; ch = base.Read(); + int c2 = ch & 0x3F; + ch = (c1 << 6) | c2; + } + return ch; + } +} + +//----------------------------------------------------------------------------------- +// Scanner +//----------------------------------------------------------------------------------- +public class Scanner { + const char EOL = '\n'; + const int eofSym = 0; /* pdt */ + const int maxT = 34; + const int noSym = 34; + + + public Buffer buffer; // scanner buffer + + Token t; // current token + int ch; // current input character + int pos; // byte position of current character + int charPos; // position by unicode characters starting with 0 + int col; // column number of current character + int line; // line number of current character + int oldEols; // EOLs that appeared in a comment; + static readonly Dictionary start; // maps first token character to start state + + Token tokens; // list of tokens already peeked (first token is a dummy) + Token pt; // current peek token + + char[] tval = new char[128]; // text of current token + int tlen; // length of current token + + static Scanner() { + start = new Dictionary(128); + for (int i = 65; i <= 90; ++i) start[i] = 1; + for (int i = 97; i <= 99; ++i) start[i] = 1; + for (int i = 102; i <= 114; ++i) start[i] = 1; + for (int i = 116; i <= 122; ++i) start[i] = 1; + start[43] = 2; + for (int i = 50; i <= 57; ++i) start[i] = 6; + for (int i = 10; i <= 10; ++i) start[i] = 12; + for (int i = 13; i <= 13; ++i) start[i] = 11; + start[48] = 19; + start[49] = 20; + start[34] = 13; + start[40] = 15; + start[41] = 16; + start[61] = 17; + start[60] = 21; + start[62] = 22; + start[123] = 23; + start[125] = 24; + start[44] = 25; + start[101] = 38; + start[115] = 39; + start[100] = 40; + start[37] = 29; + start[42] = 30; + start[47] = 31; + start[94] = 32; + start[91] = 33; + start[93] = 34; + start[58] = 41; + start[45] = 42; + start[Buffer.EOF] = -1; + + } + + public Scanner (string fileName) { + try { + Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + buffer = new Buffer(stream, false); + Init(); + } catch (IOException) { + throw new FatalError("Cannot open file " + fileName); + } + } + + public Scanner (Stream s) { + buffer = new Buffer(s, true); + Init(); + } + + void Init() { + pos = -1; line = 1; col = 0; charPos = -1; + oldEols = 0; + NextCh(); + if (ch == 0xEF) { // check optional byte order mark for UTF-8 + NextCh(); int ch1 = ch; + NextCh(); int ch2 = ch; + if (ch1 != 0xBB || ch2 != 0xBF) { + throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2)); + } + buffer = new UTF8Buffer(buffer); col = 0; charPos = -1; + NextCh(); + } + pt = tokens = new Token(); // first token is a dummy + } + + void NextCh() { + if (oldEols > 0) { ch = EOL; oldEols--; } + else { + pos = buffer.Pos; + // buffer reads unicode chars, if UTF8 has been detected + ch = buffer.Read(); col++; charPos++; + // replace isolated '\r' by '\n' in order to make + // eol handling uniform across Windows, Unix and Mac + if (ch == '\r' && buffer.Peek() != '\n') ch = EOL; + if (ch == EOL) { line++; col = 0; } + } + + } + + void AddCh() { + if (tlen >= tval.Length) { + char[] newBuf = new char[2 * tval.Length]; + Array.Copy(tval, 0, newBuf, 0, tval.Length); + tval = newBuf; + } + if (ch != Buffer.EOF) { + tval[tlen++] = (char) ch; + NextCh(); + } + } + + + + bool Comment0() { + int level = 1, pos0 = pos, line0 = line, col0 = col, charPos0 = charPos; + NextCh(); + if (ch == '/') { + NextCh(); + for(;;) { + if (ch == 10) { + level--; + if (level == 0) { oldEols = line - line0; NextCh(); return true; } + NextCh(); + } else if (ch == Buffer.EOF) return false; + else NextCh(); + } + } else { + buffer.Pos = pos0; NextCh(); line = line0; col = col0; charPos = charPos0; + } + return false; + } + + bool Comment1() { + int level = 1, pos0 = pos, line0 = line, col0 = col, charPos0 = charPos; + NextCh(); + if (ch == '*') { + NextCh(); + for(;;) { + if (ch == '*') { + NextCh(); + if (ch == '/') { + level--; + if (level == 0) { oldEols = line - line0; NextCh(); return true; } + NextCh(); + } + } else if (ch == '/') { + NextCh(); + if (ch == '*') { + level++; NextCh(); + } + } else if (ch == Buffer.EOF) return false; + else NextCh(); + } + } else { + buffer.Pos = pos0; NextCh(); line = line0; col = col0; charPos = charPos0; + } + return false; + } + + + void CheckLiteral() { + switch (t.val) { + case "if": t.kind = 11; break; + case "else": t.kind = 14; break; + case "while": t.kind = 15; break; + case "for": t.kind = 16; break; + case "function": t.kind = 18; break; + case "+": t.kind = 22; break; + case "-": t.kind = 23; break; + case "\n": t.kind = 33; break; + default: break; + } + } + + Token NextToken() { + while (ch == ' ' || + ch >= 9 && ch <= 10 || ch == 13 + ) NextCh(); + if (ch == '/' && Comment0() ||ch == '/' && Comment1()) return NextToken(); + int recKind = noSym; + int recEnd = pos; + t = new Token(); + t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; + int state; + state = (int) start[ch]; + tlen = 0; AddCh(); + + switch (state) { + case -1: { t.kind = eofSym; break; } // NextCh already done + case 0: { + if (recKind != noSym) { + tlen = recEnd - t.pos; + SetScannerBehindT(); + } + t.kind = recKind; break; + } // NextCh already done + case 1: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 2: + {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 3: + {t.kind = 3; break;} + case 4: + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} + else {goto case 0;} + case 5: + recEnd = pos; recKind = 4; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} + else {t.kind = 4; break;} + case 6: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 7: + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else if (ch == '+' || ch == '-') {AddCh(); goto case 8;} + else {goto case 0;} + case 8: + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else {goto case 0;} + case 9: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else {t.kind = 5; break;} + case 10: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 10;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else {t.kind = 5; break;} + case 11: + if (ch == 10) {AddCh(); goto case 12;} + else {goto case 0;} + case 12: + {t.kind = 6; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 13: + if (ch <= '!' || ch >= '#' && ch <= 65535) {AddCh(); goto case 13;} + else if (ch == '"') {AddCh(); goto case 14;} + else {goto case 0;} + case 14: + {t.kind = 7; break;} + case 15: + {t.kind = 8; break;} + case 16: + {t.kind = 9; break;} + case 17: + if (ch == '=') {AddCh(); goto case 18;} + else {goto case 0;} + case 18: + {t.kind = 10; break;} + case 19: + recEnd = pos; recKind = 5; + if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} + else if (ch >= '0' && ch <= '1') {AddCh(); goto case 20;} + else if (ch == 'x') {AddCh(); goto case 4;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 20: + recEnd = pos; recKind = 5; + if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} + else if (ch >= '0' && ch <= '1') {AddCh(); goto case 20;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 21: + recEnd = pos; recKind = 10; + if (ch == '=') {AddCh(); goto case 18;} + else {t.kind = 10; break;} + case 22: + recEnd = pos; recKind = 10; + if (ch == '=') {AddCh(); goto case 18;} + else {t.kind = 10; break;} + case 23: + {t.kind = 12; break;} + case 24: + {t.kind = 13; break;} + case 25: + {t.kind = 17; break;} + case 26: + {t.kind = 19; break;} + case 27: + {t.kind = 20; break;} + case 28: + {t.kind = 21; break;} + case 29: + {t.kind = 24; break;} + case 30: + {t.kind = 25; break;} + case 31: + {t.kind = 26; break;} + case 32: + {t.kind = 27; break;} + case 33: + {t.kind = 28; break;} + case 34: + {t.kind = 29; break;} + case 35: + {t.kind = 30; break;} + case 36: + {t.kind = 31; break;} + case 37: + {t.kind = 32; break;} + case 38: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'b' || ch >= 'd' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'c') {AddCh(); goto case 43;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 39: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'b' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'a') {AddCh(); goto case 44;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 40: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'h' || ch >= 'j' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'i') {AddCh(); goto case 45;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 41: + if (ch == ':') {AddCh(); goto case 35;} + else if (ch == '=') {AddCh(); goto case 36;} + else {goto case 0;} + case 42: + recEnd = pos; recKind = 2; + if (ch == '>') {AddCh(); goto case 37;} + else {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 43: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'g' || ch >= 'i' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'h') {AddCh(); goto case 46;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 44: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'x' || ch == 'z') {AddCh(); goto case 1;} + else if (ch == 'y') {AddCh(); goto case 47;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 45: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'r' || ch >= 't' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 's') {AddCh(); goto case 48;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 46: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'n' || ch >= 'p' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'o') {AddCh(); goto case 49;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 47: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == ':') {AddCh(); goto case 27;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 48: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'o' || ch >= 'q' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'p') {AddCh(); goto case 50;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 49: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == ':') {AddCh(); goto case 26;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 50: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'k' || ch >= 'm' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'l') {AddCh(); goto case 51;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 51: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'b' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'a') {AddCh(); goto case 52;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 52: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'x' || ch == 'z') {AddCh(); goto case 1;} + else if (ch == 'y') {AddCh(); goto case 53;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 53: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == ':') {AddCh(); goto case 28;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + + } + t.val = new String(tval, 0, tlen); + return t; + } + + private void SetScannerBehindT() { + buffer.Pos = t.pos; + NextCh(); + line = t.line; col = t.col; charPos = t.charPos; + for (int i = 0; i < tlen; i++) NextCh(); + } + + // get the next token (possibly a token already seen during peeking) + public Token Scan () { + if (tokens.next == null) { + return NextToken(); + } else { + pt = tokens = tokens.next; + return tokens; + } + } + + // peek for the next token, ignore pragmas + public Token Peek () { + do { + if (pt.next == null) { + pt.next = NextToken(); + } + pt = pt.next; + } while (pt.kind > maxT); // skip pragmas + + return pt; + } + + // make sure that peeking starts at the current scan position + public void ResetPeek () { pt = tokens; } + +} // end Scanner +} \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/ScriptParser/Scanner.frame b/CS-MIC/csmic/csmic/ScriptParser/Scanner.frame new file mode 100644 index 0000000..8010e59 --- /dev/null +++ b/CS-MIC/csmic/csmic/ScriptParser/Scanner.frame @@ -0,0 +1,383 @@ +/*---------------------------------------------------------------------- +Compiler Generator Coco/R, +Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz +extended by M. Loeberbauer & A. Woess, Univ. of Linz +with improvements by Pat Terry, Rhodes University + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +As an exception, it is allowed to write an extension of Coco/R that is +used as a plugin in non-free software. + +If not otherwise stated, any source code generated by Coco/R (other than +Coco/R itself) does not fall under the GNU General Public License. +-----------------------------------------------------------------------*/ +-->begin +using System; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.CodeDom.Compiler; + +-->namespace + +[GeneratedCodeAttribute("Coco/R", "")] +public class Token { + public int kind; // token kind + public int pos; // token position in bytes in the source text (starting at 0) + public int charPos; // token position in characters in the source text (starting at 0) + public int col; // token column (starting at 1) + public int line; // token line (starting at 1) + public string val; // token value + public Token next; // ML 2005-03-11 Tokens are kept in linked list +} + +//----------------------------------------------------------------------------------- +// Buffer +//----------------------------------------------------------------------------------- +public class Buffer { + // This Buffer supports the following cases: + // 1) seekable stream (file) + // a) whole stream in buffer + // b) part of stream in buffer + // 2) non seekable stream (network, console) + + public const int EOF = char.MaxValue + 1; + const int MIN_BUFFER_LENGTH = 1024; // 1KB + const int MAX_BUFFER_LENGTH = MIN_BUFFER_LENGTH * 64; // 64KB + byte[] buf; // input buffer + int bufStart; // position of first byte in buffer relative to input stream + int bufLen; // length of buffer + int fileLen; // length of input stream (may change if the stream is no file) + int bufPos; // current position in buffer + Stream stream; // input stream (seekable) + bool isUserStream; // was the stream opened by the user? + + public Buffer (Stream s, bool isUserStream) { + stream = s; this.isUserStream = isUserStream; + + if (stream.CanSeek) { + fileLen = (int) stream.Length; + bufLen = Math.Min(fileLen, MAX_BUFFER_LENGTH); + bufStart = Int32.MaxValue; // nothing in the buffer so far + } else { + fileLen = bufLen = bufStart = 0; + } + + buf = new byte[(bufLen>0) ? bufLen : MIN_BUFFER_LENGTH]; + if (fileLen > 0) Pos = 0; // setup buffer to position 0 (start) + else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid + if (bufLen == fileLen && stream.CanSeek) Close(); + } + + protected Buffer(Buffer b) { // called in UTF8Buffer constructor + buf = b.buf; + bufStart = b.bufStart; + bufLen = b.bufLen; + fileLen = b.fileLen; + bufPos = b.bufPos; + stream = b.stream; + // keep destructor from closing the stream + b.stream = null; + isUserStream = b.isUserStream; + } + + ~Buffer() { Close(); } + + protected void Close() { + if (!isUserStream && stream != null) { + stream.Close(); + stream = null; + } + } + + public virtual int Read () { + if (bufPos < bufLen) { + return buf[bufPos++]; + } else if (Pos < fileLen) { + Pos = Pos; // shift buffer start to Pos + return buf[bufPos++]; + } else if (stream != null && !stream.CanSeek && ReadNextStreamChunk() > 0) { + return buf[bufPos++]; + } else { + return EOF; + } + } + + public int Peek () { + int curPos = Pos; + int ch = Read(); + Pos = curPos; + return ch; + } + + // beg .. begin, zero-based, inclusive, in byte + // end .. end, zero-based, exclusive, in byte + public string GetString (int beg, int end) { + int len = 0; + char[] buf = new char[end - beg]; + int oldPos = Pos; + Pos = beg; + while (Pos < end) buf[len++] = (char) Read(); + Pos = oldPos; + return new String(buf, 0, len); + } + + public int Pos { + get { return bufPos + bufStart; } + set { + if (value >= fileLen && stream != null && !stream.CanSeek) { + // Wanted position is after buffer and the stream + // is not seek-able e.g. network or console, + // thus we have to read the stream manually till + // the wanted position is in sight. + while (value >= fileLen && ReadNextStreamChunk() > 0); + } + + if (value < 0 || value > fileLen) { + throw new FatalError("buffer out of bounds access, position: " + value); + } + + if (value >= bufStart && value < bufStart + bufLen) { // already in buffer + bufPos = value - bufStart; + } else if (stream != null) { // must be swapped in + stream.Seek(value, SeekOrigin.Begin); + bufLen = stream.Read(buf, 0, buf.Length); + bufStart = value; bufPos = 0; + } else { + // set the position to the end of the file, Pos will return fileLen. + bufPos = fileLen - bufStart; + } + } + } + + // Read the next chunk of bytes from the stream, increases the buffer + // if needed and updates the fields fileLen and bufLen. + // Returns the number of bytes read. + private int ReadNextStreamChunk() { + int free = buf.Length - bufLen; + if (free == 0) { + // in the case of a growing input stream + // we can neither seek in the stream, nor can we + // foresee the maximum length, thus we must adapt + // the buffer size on demand. + byte[] newBuf = new byte[bufLen * 2]; + Array.Copy(buf, newBuf, bufLen); + buf = newBuf; + free = bufLen; + } + int read = stream.Read(buf, bufLen, free); + if (read > 0) { + fileLen = bufLen = (bufLen + read); + return read; + } + // end of stream reached + return 0; + } +} + +//----------------------------------------------------------------------------------- +// UTF8Buffer +//----------------------------------------------------------------------------------- +public class UTF8Buffer: Buffer { + public UTF8Buffer(Buffer b): base(b) {} + + public override int Read() { + int ch; + do { + ch = base.Read(); + // until we find a utf8 start (0xxxxxxx or 11xxxxxx) + } while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EOF)); + if (ch < 128 || ch == EOF) { + // nothing to do, first 127 chars are the same in ascii and utf8 + // 0xxxxxxx or end of file character + } else if ((ch & 0xF0) == 0xF0) { + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x07; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; ch = base.Read(); + int c4 = ch & 0x3F; + ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4; + } else if ((ch & 0xE0) == 0xE0) { + // 1110xxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x0F; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; + ch = (((c1 << 6) | c2) << 6) | c3; + } else if ((ch & 0xC0) == 0xC0) { + // 110xxxxx 10xxxxxx + int c1 = ch & 0x1F; ch = base.Read(); + int c2 = ch & 0x3F; + ch = (c1 << 6) | c2; + } + return ch; + } +} + +//----------------------------------------------------------------------------------- +// Scanner +//----------------------------------------------------------------------------------- +public class Scanner { + const char EOL = '\n'; + const int eofSym = 0; /* pdt */ +-->declarations + + public Buffer buffer; // scanner buffer + + Token t; // current token + int ch; // current input character + int pos; // byte position of current character + int charPos; // position by unicode characters starting with 0 + int col; // column number of current character + int line; // line number of current character + int oldEols; // EOLs that appeared in a comment; + static readonly Dictionary start; // maps first token character to start state + + Token tokens; // list of tokens already peeked (first token is a dummy) + Token pt; // current peek token + + char[] tval = new char[128]; // text of current token + int tlen; // length of current token + + static Scanner() { + start = new Dictionary(128); +-->initialization + } + + public Scanner (string fileName) { + try { + Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + buffer = new Buffer(stream, false); + Init(); + } catch (IOException) { + throw new FatalError("Cannot open file " + fileName); + } + } + + public Scanner (Stream s) { + buffer = new Buffer(s, true); + Init(); + } + + void Init() { + pos = -1; line = 1; col = 0; charPos = -1; + oldEols = 0; + NextCh(); + if (ch == 0xEF) { // check optional byte order mark for UTF-8 + NextCh(); int ch1 = ch; + NextCh(); int ch2 = ch; + if (ch1 != 0xBB || ch2 != 0xBF) { + throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2)); + } + buffer = new UTF8Buffer(buffer); col = 0; charPos = -1; + NextCh(); + } + pt = tokens = new Token(); // first token is a dummy + } + + void NextCh() { + if (oldEols > 0) { ch = EOL; oldEols--; } + else { + pos = buffer.Pos; + // buffer reads unicode chars, if UTF8 has been detected + ch = buffer.Read(); col++; charPos++; + // replace isolated '\r' by '\n' in order to make + // eol handling uniform across Windows, Unix and Mac + if (ch == '\r' && buffer.Peek() != '\n') ch = EOL; + if (ch == EOL) { line++; col = 0; } + } +-->casing1 + } + + void AddCh() { + if (tlen >= tval.Length) { + char[] newBuf = new char[2 * tval.Length]; + Array.Copy(tval, 0, newBuf, 0, tval.Length); + tval = newBuf; + } + if (ch != Buffer.EOF) { +-->casing2 + NextCh(); + } + } + + +-->comments + + void CheckLiteral() { +-->literals + } + + Token NextToken() { + while (ch == ' ' || +-->scan1 + ) NextCh(); +-->scan2 + int recKind = noSym; + int recEnd = pos; + t = new Token(); + t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; + int state; + state = (int) start[ch]; + tlen = 0; AddCh(); + + switch (state) { + case -1: { t.kind = eofSym; break; } // NextCh already done + case 0: { + if (recKind != noSym) { + tlen = recEnd - t.pos; + SetScannerBehindT(); + } + t.kind = recKind; break; + } // NextCh already done +-->scan3 + } + t.val = new String(tval, 0, tlen); + return t; + } + + private void SetScannerBehindT() { + buffer.Pos = t.pos; + NextCh(); + line = t.line; col = t.col; charPos = t.charPos; + for (int i = 0; i < tlen; i++) NextCh(); + } + + // get the next token (possibly a token already seen during peeking) + public Token Scan () { + if (tokens.next == null) { + return NextToken(); + } else { + pt = tokens = tokens.next; + return tokens; + } + } + + // peek for the next token, ignore pragmas + public Token Peek () { + do { + if (pt.next == null) { + pt.next = NextToken(); + } + pt = pt.next; + } while (pt.kind > maxT); // skip pragmas + + return pt; + } + + // make sure that peeking starts at the current scan position + public void ResetPeek () { pt = tokens; } + +} // end Scanner diff --git a/CS-MIC/csmic/csmic/ScriptParser/Scripting.atg b/CS-MIC/csmic/csmic/ScriptParser/Scripting.atg new file mode 100644 index 0000000..0a5f90d --- /dev/null +++ b/CS-MIC/csmic/csmic/ScriptParser/Scripting.atg @@ -0,0 +1,525 @@ +using csmic; +using System.Text; +using System.Collections.Generic; + +COMPILER SCRIPT + +/* +* +* Class Structures +* +*/ + +private MacroOperation root = new MacroOperation(OperationType.Unknown); + +internal MacroOperation Root +{ + get + { + return this.root; + } + set + { + this.root = value; + } +} + +bool IsFunctionCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _LPAREN && la.kind == _identifier) + return true; + return false; +} + +bool IsCompare() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _COMPARER) + return true; + return false; +} + +bool IsAssignment() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.val == "::" || next.val == ":=" || next.val == "->") + return true; + return false; +} + +bool IsArrayCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if(next.val == "[") + return true; + return false; +} + +CHARACTERS + + UpperLetter = 'A'..'Z'. + LowerLetter = 'a'..'z'. + letter = UpperLetter + LowerLetter. + NoQuote = ANY - '\"' . + digit = "0123456789" . + cr = '\r' . + lf = '\n' . + tab = '\t' . + PM = "+-" . + +TOKENS + + identifier = letter { letter | digit }. + sign = PM . + binary = ( '0' | '1' ) { '0' | '1' } ('B' | 'b') . + hex = "0x" ( digit | ('A' | 'B' | 'C' | 'D' | 'E' |'F') | ('a' | 'b' | 'c' | 'd' | 'e' |'f') ) { digit | ('A' | 'B' | 'C' | 'D' | 'E' |'F') | ('a' | 'b' | 'c' | 'd' | 'e' |'f') } . + number = digit { digit }['.' {digit}] [('E'|'e')['+'|'-'] digit {digit}] . + newline = [cr] lf . + string = "\"" { NoQuote } "\"" . + LPAREN = '(' . + RPAREN = ')' . + COMPARER = "==" | "<" | ">" | "<=" | ">=" . + + COMMENTS FROM "/*" TO "*/" NESTED + COMMENTS FROM "//" TO lf + +IGNORE cr + lf + tab + +/* + * Parser specification + * + */ + +PRODUCTIONS + +SCRIPT (. string statement = string.Empty; .) += + { + Statement (. + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + this.root.Children.Add(operation); + .) + | + IfBlock + | + WhileBlock + | + FunctionDeclaration + | + EchoStatement + | + SayStatement + | + DisplayStatement + | + ForBlock + } +. + +IfBlock (. + MacroOperation ifBlock = new MacroOperation(OperationType.If); + MacroOperation elseBlock = new MacroOperation(OperationType.Else); + string ifStatement = string.Empty; + string statement = string.Empty; + StringBuilder builder = new StringBuilder(); + bool hasElse = false; + .) += + "if" + LPAREN + Comparison (. ifStatement = builder.ToString(); ifBlock.Input.Add(ifStatement); .) + RPAREN + '{' + { + Statement (. + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + ifBlock.Children.Add(operation); + .) + | + IfBlock + | + WhileBlock + | + EchoStatement + | + SayStatement + | + DisplayStatement + | + ForBlock + } + '}' + [ + "else" (. hasElse = true; .) + '{' + { + Statement (. + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + elseBlock.Children.Add(operation); + .) + | + IfBlock + | + WhileBlock + | + EchoStatement + | + SayStatement + | + DisplayStatement + | + ForBlock + } + '}' + ] + (. + if(hasElse) + { + MacroOperation ifelse = new MacroOperation(OperationType.IfElse); + ifelse.Children.Add(ifBlock); + ifelse.Children.Add(elseBlock); + parent.Children.Add(ifelse); + } + else + { + parent.Children.Add(ifBlock); + } + .) +. + + + +WhileBlock (. + StringBuilder builder = new StringBuilder(); + MacroOperation whileBlock = new MacroOperation(OperationType.While); + string statement = string.Empty; + .) += + "while" + LPAREN + Comparison (. whileBlock.Input.Add(builder.ToString()); .) + RPAREN + '{' + { + Statement (. + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + whileBlock.Children.Add(operation); + .) + | + IfBlock + | + WhileBlock + | + EchoStatement + | + SayStatement + | + DisplayStatement + | + ForBlock + } + '}' + (. + parent.Children.Add(whileBlock); + .) +. + +ForBlock (. + StringBuilder builder = new StringBuilder(); + string statement = string.Empty; + string statement2 = string.Empty; + MacroOperation forBlock = new MacroOperation(OperationType.For); + .) += + "for" + LPAREN + Statement + ',' + Comparison + ',' + Statement (. forBlock.Input.Add(statement); forBlock.Input.Add(builder.ToString()); forBlock.Input.Add(statement2); .) + RPAREN + '{' + { + Statement (. + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + forBlock.Children.Add(operation); + .) + | + IfBlock + | + WhileBlock + | + EchoStatement + | + SayStatement + | + DisplayStatement + | + ForBlock + } + '}' + (. + parent.Children.Add(forBlock); + .) +. + +FunctionDeclaration (. + StringBuilder builder = new StringBuilder(); + string statement = string.Empty; + MacroOperation func = new MacroOperation(OperationType.FunctionDeclaration); + .) += + "function" + LPAREN + CommaList (. string[] args = builder.ToString().Split(','); func.Input.AddRange(args); .) + RPAREN + '{' + { + Statement (. + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + func.Children.Add(operation); + .) + | + IfBlock + | + WhileBlock + | + EchoStatement + | + SayStatement + | + DisplayStatement + | + ForBlock + } + '}' + (. + parent.Children.Add(func); + .) +. + +EchoStatement (. + StringBuilder builder = new StringBuilder(); + MacroOperation echoStatement = new MacroOperation(OperationType.Echo); + string statement = string.Empty; + .) += + "echo:" + Statement (. + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + echoStatement.Children.Add(operation); + parent.Children.Add(echoStatement); + .) +. + +SayStatement (. + StringBuilder builder = new StringBuilder(); + MacroOperation sayStatement = new MacroOperation(OperationType.Say); + string statement = string.Empty; + .) += + "say:" + string (. + statement = t.val.Replace("\"", ""); + sayStatement.Input.Add(statement); + parent.Children.Add(sayStatement); + .) +. + +DisplayStatement (. + StringBuilder builder = new StringBuilder(); + MacroOperation displayStatement = new MacroOperation(OperationType.Display); + string statement = string.Empty; + .) += + "display:" + ( + Statement (. + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + displayStatement.Children.Add(operation); + .) + | + string (. + statement = t.val.Replace("\"", ""); + MacroOperation operation = new MacroOperation(OperationType.String); + operation.Input.Add(statement); + displayStatement.Children.Add(operation); + .) + ) + { + ',' + ( + Statement (. + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + displayStatement.Children.Add(operation); + .) + | + string (. + statement = t.val.Replace("\"", ""); + MacroOperation operation = new MacroOperation(OperationType.String); + operation.Input.Add(statement); + displayStatement.Children.Add(operation); + .) + ) + } + (. + parent.Children.Add(displayStatement); + .) +. + +Statement (. + value = string.Empty; + StringBuilder builder = new StringBuilder(); + .) += + IF(IsAssignment()) + Assignment (. value = builder.ToString(); .) + | + Expression (. value = builder.ToString(); .) +. + +Expression += +Term +{ + '+' (. builder.Append(t.val); .) Term +| + '-' (. builder.Append(t.val); .) Term +| + '%' (. builder.Append(t.val); .) Term +} +. + +Term += + Factor + { + '*' (. builder.Append(t.val); .) + Factor +| + '/' (. builder.Append(t.val); .) + Factor +} +. + +Factor += + Value + { + '^' (. builder.Append(t.val); .) + Value + } +. + +Value += + + [ + "+" (. builder.Append(t.val); .) + | + "-" (. builder.Append(t.val); .) + ] +( + IF(IsFunctionCall()) + Function +| + IF(IsArrayCall()) + ArrayCall +| + identifier (. builder.Append(t.val); .) +| + number (. builder.Append(t.val); .) +| + hex (. builder.Append(t.val); .) +| + binary (. builder.Append(t.val); .) +| + '(' (. builder.Append(t.val); .) + Expression + ')' (. builder.Append(t.val); .) +) +. + +ArrayL += +'[' (. builder.Append(t.val); .) +CommaList +']' (. builder.Append(t.val); .) +. + +CommaList += +Expression +{ + ',' (. builder.Append(t.val); .) + Expression +} +. + +Assignment += +identifier (. builder.Append(t.val); .) +( + ( + "::" (. builder.Append(t.val); .) + Expression + ) + | + ( + ":=" (. builder.Append(t.val); string value = string.Empty; .) + AnyExpression (. builder.Append(value); .) + newline + ) + | + ( + "->" (. builder.Append(t.val); .) + ArrayL + ) +) +. + +Function += +identifier (. builder.Append(t.val); .) +'(' (. builder.Append(t.val); .) +CommaList +')' (. builder.Append(t.val); .) +. + +ArrayCall += +identifier (. builder.Append(t.val); .) +'[' (. builder.Append(t.val); .) + Expression +']' (. builder.Append(t.val); .) +. + +Comparison += +Expression +COMPARER (. result.Append(t.val); .) +Expression +. + +AnyExpression (. value = string.Empty; StringBuilder builder = new StringBuilder(); .) += +ANY (. builder.Append(t.val); .) { ANY (. builder.Append(t.val); .) } '\n' (. value = builder.ToString(); .) +. + + +END SCRIPT. \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/Variable.cs b/CS-MIC/csmic/csmic/Variable.cs new file mode 100644 index 0000000..4fb9a3e --- /dev/null +++ b/CS-MIC/csmic/csmic/Variable.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace csmic +{ + /// + /// Represents the data types supported in a variable. + /// + public enum VariableType + { + /// + /// Decimal + /// + Decimal, + /// + /// Equation + /// + Equation, + /// + /// Array + /// + Array, + /// + /// Unknown + /// + Unknown, + /// + /// No type associated + /// + None + } + + /// + /// An object that contains information about a variable. + /// + public class Variable + { + #region Members + + /// + /// The type of variable. + /// + private VariableType type; + /// + /// The value of the variable. + /// + private object value; + + #endregion + + #region Constructor + + /// + /// Creates an empty variable. + /// + public Variable() + { + this.type = VariableType.None; + this.value = null; + } + + #endregion + + #region Properties + + /// + /// Gets or sets an object representing the variable's value. + /// + public object Value + { + get + { + return this.value; + } + set + { + this.value = value; + } + } + + /// + /// Gets or sets the type of the variable. + /// + public VariableType Type + { + get + { + return this.type; + } + set + { + this.type = value; + } + } + + #endregion + } +} diff --git a/CS-MIC/csmic/csmic/csmic.csproj b/CS-MIC/csmic/csmic/csmic.csproj new file mode 100644 index 0000000..3e1cbe5 --- /dev/null +++ b/CS-MIC/csmic/csmic/csmic.csproj @@ -0,0 +1,136 @@ + + + + Debug + AnyCPU + 9.0.21022 + 2.0 + {7BBA4BA2-E885-4D89-8710-F1A609616B7D} + Library + Properties + csmic + csmic + v4.0 + 512 + true + csmic_open.snk + + + 3.5 + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + SAK + SAK + SAK + SAK + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + bin\Debug\csmic.XML + AllRules.ruleset + + + pdbonly + true + bin\Release\ + + + prompt + 4 + bin\Release\csmic.XML + AllRules.ruleset + false + + + + + 3.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + "$(ProjectDir)\coco.exe" -namespace csmic.Interpreter -frames . "$(ProjectDir)\InterpreterParser\CSMIC.atg" +"$(ProjectDir)\coco.exe" -namespace csmic.Scripting -frames . "$(ProjectDir)\ScriptParser\Scripting.atg" + + \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/csmic.csproj.vspscc b/CS-MIC/csmic/csmic/csmic.csproj.vspscc new file mode 100644 index 0000000..feffdec --- /dev/null +++ b/CS-MIC/csmic/csmic/csmic.csproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/CS-MIC/csmic/csmic/csmic_open.snk b/CS-MIC/csmic/csmic/csmic_open.snk new file mode 100644 index 0000000000000000000000000000000000000000..4524054e349ae0ea50c3ad5f16f87a0d8932bc15 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097bM-tjlXggk}pvJiJ6xivVK3tH6)?qtu zOGf$VZ!zvP3ZN@b6bjgWT+aP*&qpKeSwq*#&QlRJGdgoe%Hv}Xm;vt+)HOrwLq>lT zsYK6oBxqx7#GLpdy#L`JoT+mnt};3DLPdMFDs~NZ%$e+vB)&)Or5o06=EXk^3ww{J z=U}x}YiWX$vs!|f01o7)4mGhYz}hS>*_FVp{xGu}NUr9=&eJ|oo%L<6mu7S(yM{7M z=}OK3Pwb||i0HxJJ2Qz){GV-q`+D4B3`b6U?ZDL$5&{7Mpg`@Pi^zHGgUvv#D{ zG!OR>^yiUDFv2S5*JZxq^Vx&#j2&UVK5@cW=BeJbl=Rx=&Y>aRtLTCwk84fENmH_LrlT0Y=hQQ(N)IDD ztk`>twqL&m7vIW1EL+GI;RRx=;`Qg2CE*^LNTK|SjZhNw(_pmuKhxUU z(Ezx0sIGIg8r1<{a0>_m@3sdjvpE&WN;LM%2^~j>x$XC?LdeH|T42WsdDh;bd5k-& id<>rqvkr{wtxl>thE#4mkXy477qa4a*yDXiGWlt|#V5%C literal 0 HcmV?d00001 From aa21f3efeef115d9560feab0d9ba295d12b7e972 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Tue, 12 Jun 2018 19:07:52 -0500 Subject: [PATCH 03/54] Created a readme file for the project. --- README.md | 250 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..e4083bd --- /dev/null +++ b/README.md @@ -0,0 +1,250 @@ +# cs-mic +CS-MIC is a .NET library written in C# designed to give developers easy access to expression parsing. For many developers, there is no need to involve complicated settings and formats. With few exposed methods and objects, CS-MIC makes basic expression solving as simple as possible with as little logic required from developers as possible. In fact, one can pull a value with only one line of code. + +*** + +## Usage + +CS-MIC follows a few basic rules when interpreting user input, but should prove to be fairly straightforward for most developers. While CS-MIC tries to ensure that the order of operations as far as it knows them (parentheses – powers, multiplication, division – addition, subtraction), there may be instances where formatting fails. If this should be noticed, please report it. + + +### Expression Parsing + +#### Operands + +`+` - Addition + +`–` - Subtraction + +`*` - Multiplication + +`/` - Division + +`^` - Raise to a power + +`%` - Modulus + +#### Tokens + +`::` - Assign a numeric value to a variable. + +`:=` - Assign an equation to a variable. + +`->` - Assigns a comma delimited array of numbers to an array variable. + +#### Comparison + +`==` - Returns ‘True’ if two values are equal to each other. + +`>` - Returns ‘True’ if a value is greater than another value. + +`<` - Returns ‘True’ if a value is less than another value. + +`>=` - Returns ‘True’ if a value is greater than or equal to another value. + +`<=` - Returns ‘True’ if a value is greater than or equal to another value. + + +#### Base Conversion + +* Decimal + * All numbers are interpreted as decimal by default. +* Binary + * Binary numbers are succeeded by a B, non case sensative. +* Hexadecimal + * Hexadecimal numbers are preceded by 0x, non case sensative. + +#### Example Input and Output + +**Input**|**Output** +:-----:|:-----: +`5 + 5` | `10` +`5 * 2` | `10` +`1 + 2 * 3` | `7` +`(1 + 2) * 3` | `9` +`5 / 2` | `2.5` +`5 / 0` | `Attempted to divide by zero.` +`2 ^ 32` | `4294967296` +`x :: 4` | `4` +`x :: 6 + 4` | `10` +`y := 2^x` | `(2^x)` + +### Scripting + +#### Rules + +* Any valid expression can be computed. +* All computation counts towards the script’s history. This means that once a variable is set inside a script, the variable will remain set until execution of the script is complete. +* Only one command can be executed per line. No token is required to end the command. +* Every code block must be opened and closed with a bracket ( { } ). The only exception is the main code block. + +#### Loops + +`while` - Executes a code block as long as a given condition evaluates to true. + +``` +while(bool expression) +{ +CODE BLOCK +} +``` + +`for` - After executing an initial condition, a code block is executed while a condition is met. A final statement is executed at the end of each iteration. + +``` +for(* expression, bool condition, * expression) +{ +CODE BLOCK +} +``` + +#### Conditionals + +`if` - Executes a code block if a given condition evaluates to true. An optional else block can follow the if block for execution if the statement evaluates as false. + +``` +if(bool expression) +{ +CODE BLOCK +} +else +{ +CODE BLOCK +} +``` + +#### Functions + +`echo` - Displays the output from the proceding expression. + +``` +echo: expression +``` + +`say` - Displays a string. + +``` +say: “string” +``` + +`display` - Combines strings and expressions to a single line in the output stack. + +``` +display: “string”, 12 * 2, “string”, sin(12) +``` + +`function` - Creates a new function with a given name, and any number of expected arguments. + +``` +function(newFunction, anyArgumentName) +{ + sin(anyArgumentName) + cos(anyArgumentName) +} +``` + +#### Comments + +* Block Tokens + * Starting token: /* + * Ending token: */ + *Any line falling between block comment tokens will be ignored by the macro builder at execution time. +* Line Tokens + * // + * Any line starting with the line token will be ignored by the macro builder at execution time. + + +**Example Script** + +``` +say: “Fibonacci Sequence” +temp :: 1 +y :: 1 +echo: y +for(x :: 1, x < 11, x :: temp + y) +{ +echo: x +temp :: y +y :: x +} +x :: 1 +say: “While Loop” +while(x < 10) +{ +if(x == 5) +{ +display: “The condition ‘x == 5’ has been met. x = “, x, “.” +} +else +{ +echo: sin(x) +} +x :: x + 1 +} +``` + +**Example Script Output** +``` +Fibonacci Sequence +1 +1 +2 +3 +5 +8 +13 +21 +34 +55 +89 +While Loop +0.841470984807897 +0.909297426825682 +0.141120008059867 +-0.756802495307928 +The condition ‘x == 5’ has been met. x = 5. +-0.279415498198926 +0.656986598718789 +0.989358246623382 +0.412118485241757 +``` + +## Built In Functions + +The following is a list of the internally recognized functions in CS-MIC: + +`sin(double expression)` + +Returns the sine value of a given expression. + +`cos(double expression)` + +Returns the cosine value of a given expression. + +`tan(double expression)` + +Returns the tangent value of a given expression. + +`round(double expression)` + +Rounds an expression to the nearest whole number. + +`sqrt(double expression)` + +Returns the square root of an expression. + +`abs(double expression)` + +Returns the absolute value of a given expression. + +`exp(double expression)` + +Returns the constant e raised to a given power. + +`log(double expression1, double expression2)` + +Returns the log of expression1 to the base of expression2 + +`precision(double expression1, int expression2)` + +Returns the value of expression1 to a given precision. For example, precision(12.3456789, 4) will return 12.3456. + From 315ccb94eb569962c712a3e52d223261e94555fd Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Tue, 12 Jun 2018 19:10:18 -0500 Subject: [PATCH 04/54] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e4083bd..fd65d51 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ CS-MIC is a .NET library written in C# designed to give developers easy access t ## Usage -CS-MIC follows a few basic rules when interpreting user input, but should prove to be fairly straightforward for most developers. While CS-MIC tries to ensure that the order of operations as far as it knows them (parentheses – powers, multiplication, division – addition, subtraction), there may be instances where formatting fails. If this should be noticed, please report it. +CS-MIC follows a few basic rules when interpreting user input, but should prove to be fairly straightforward for most developers. While CS-MIC tries to ensure that the order of operations as far as it knows them (parentheses – powers, multiplication, division – addition, subtraction), there may be instances where formatting fails. If this should be noticed, please [report it](https://github.com/wagesj45/cs-mic/issues). ### Expression Parsing From e4d6717ec2c4a34f4ac2a60c0d17403411989aa8 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Tue, 12 Jun 2018 20:47:06 -0500 Subject: [PATCH 05/54] General updating. Updated solution to VS 2017. Updated to newest version of coco/r. Now includes coco/r for easier building out of the box. --- .../csmic/.vs/csmic/DesignTimeBuild/.dtbcache | Bin 0 -> 344 bytes CS-MIC/csmic/.vs/csmic/v15/.suo | Bin 0 -> 52736 bytes .../.vs/csmic/v15/Server/sqlite3/db.lock | 0 .../.vs/csmic/v15/Server/sqlite3/storage.ide | Bin 0 -> 4096 bytes .../csmic/v15/Server/sqlite3/storage.ide-shm | Bin 0 -> 32768 bytes .../csmic/v15/Server/sqlite3/storage.ide-wal | Bin 0 -> 1454392 bytes CS-MIC/csmic/CSMICTests/CSMICTests.csproj | 4 +- .../CSMICTests/Test References/csmic.accessor | 2 - .../csmic/CSMICTests/bin/Debug/CSMICTests.dll | Bin 0 -> 11264 bytes .../csmic/CSMICTests/bin/Debug/CSMICTests.pdb | Bin 0 -> 19968 bytes ...lStudio.QualityTools.UnitTestFramework.dll | Bin 0 -> 98856 bytes CS-MIC/csmic/CSMICTests/bin/Debug/csmic.dll | Bin 0 -> 58880 bytes CS-MIC/csmic/CSMICTests/bin/Debug/csmic.pdb | Bin 0 -> 173568 bytes CS-MIC/csmic/CSMICTests/bin/Debug/csmic.xml | 1028 +++++++++++++++++ .../obj/Debug/CSMICTests.csproj.CopyComplete | 0 .../CSMICTests.csproj.CoreCompileInputs.cache | 1 + .../CSMICTests.csproj.FileListAbsolute.txt | 11 + .../CSMICTests.csprojAssemblyReference.cache | Bin 0 -> 26492 bytes .../csmic/CSMICTests/obj/Debug/CSMICTests.dll | Bin 0 -> 11264 bytes .../csmic/CSMICTests/obj/Debug/CSMICTests.pdb | Bin 0 -> 19968 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 6720 bytes .../CSMICTests/obj/Debug/csmic_Accessor.dll | Bin 0 -> 81408 bytes .../CSMICTests/obj/Debug/csmic_Accessor.pdb | Bin 0 -> 144896 bytes CS-MIC/csmic/UpgradeLog.htm | Bin 0 -> 31838 bytes CS-MIC/csmic/csmic.sln | 34 +- CS-MIC/csmic/csmic/InputInterpreter.cs | 2 +- .../csmic/csmic/InterpreterParser/Parser.cs | 40 +- .../csmic/InterpreterParser/Parser.cs.old | 530 +++++++++ .../csmic/InterpreterParser/Parser.frame | 34 +- .../csmic/csmic/InterpreterParser/Scanner.cs | 10 +- .../csmic/InterpreterParser/Scanner.cs.old | 489 ++++++++ .../csmic/InterpreterParser/Scanner.frame | 10 +- CS-MIC/csmic/csmic/ScriptParser/Parser.cs | 32 +- CS-MIC/csmic/csmic/ScriptParser/Parser.cs.old | 794 +++++++++++++ CS-MIC/csmic/csmic/ScriptParser/Parser.frame | 22 +- CS-MIC/csmic/csmic/ScriptParser/Scanner.cs | 10 +- .../csmic/csmic/ScriptParser/Scanner.cs.old | 635 ++++++++++ CS-MIC/csmic/csmic/ScriptParser/Scanner.frame | 10 +- CS-MIC/csmic/csmic/bin/Debug/csmic.XML | 1028 +++++++++++++++++ CS-MIC/csmic/csmic/bin/Debug/csmic.dll | Bin 0 -> 58880 bytes CS-MIC/csmic/csmic/bin/Debug/csmic.pdb | Bin 0 -> 173568 bytes CS-MIC/csmic/csmic/coco.exe | Bin 0 -> 94208 bytes .../csmic.csproj.CoreCompileInputs.cache | 1 + .../Debug/csmic.csproj.FileListAbsolute.txt | 6 + CS-MIC/csmic/csmic/obj/Debug/csmic.dll | Bin 0 -> 58880 bytes CS-MIC/csmic/csmic/obj/Debug/csmic.pdb | Bin 0 -> 173568 bytes 46 files changed, 4606 insertions(+), 127 deletions(-) create mode 100644 CS-MIC/csmic/.vs/csmic/DesignTimeBuild/.dtbcache create mode 100644 CS-MIC/csmic/.vs/csmic/v15/.suo create mode 100644 CS-MIC/csmic/.vs/csmic/v15/Server/sqlite3/db.lock create mode 100644 CS-MIC/csmic/.vs/csmic/v15/Server/sqlite3/storage.ide create mode 100644 CS-MIC/csmic/.vs/csmic/v15/Server/sqlite3/storage.ide-shm create mode 100644 CS-MIC/csmic/.vs/csmic/v15/Server/sqlite3/storage.ide-wal delete mode 100644 CS-MIC/csmic/CSMICTests/Test References/csmic.accessor create mode 100644 CS-MIC/csmic/CSMICTests/bin/Debug/CSMICTests.dll create mode 100644 CS-MIC/csmic/CSMICTests/bin/Debug/CSMICTests.pdb create mode 100644 CS-MIC/csmic/CSMICTests/bin/Debug/Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll create mode 100644 CS-MIC/csmic/CSMICTests/bin/Debug/csmic.dll create mode 100644 CS-MIC/csmic/CSMICTests/bin/Debug/csmic.pdb create mode 100644 CS-MIC/csmic/CSMICTests/bin/Debug/csmic.xml create mode 100644 CS-MIC/csmic/CSMICTests/obj/Debug/CSMICTests.csproj.CopyComplete create mode 100644 CS-MIC/csmic/CSMICTests/obj/Debug/CSMICTests.csproj.CoreCompileInputs.cache create mode 100644 CS-MIC/csmic/CSMICTests/obj/Debug/CSMICTests.csproj.FileListAbsolute.txt create mode 100644 CS-MIC/csmic/CSMICTests/obj/Debug/CSMICTests.csprojAssemblyReference.cache create mode 100644 CS-MIC/csmic/CSMICTests/obj/Debug/CSMICTests.dll create mode 100644 CS-MIC/csmic/CSMICTests/obj/Debug/CSMICTests.pdb create mode 100644 CS-MIC/csmic/CSMICTests/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache create mode 100644 CS-MIC/csmic/CSMICTests/obj/Debug/csmic_Accessor.dll create mode 100644 CS-MIC/csmic/CSMICTests/obj/Debug/csmic_Accessor.pdb create mode 100644 CS-MIC/csmic/UpgradeLog.htm create mode 100644 CS-MIC/csmic/csmic/InterpreterParser/Parser.cs.old create mode 100644 CS-MIC/csmic/csmic/InterpreterParser/Scanner.cs.old create mode 100644 CS-MIC/csmic/csmic/ScriptParser/Parser.cs.old create mode 100644 CS-MIC/csmic/csmic/ScriptParser/Scanner.cs.old create mode 100644 CS-MIC/csmic/csmic/bin/Debug/csmic.XML create mode 100644 CS-MIC/csmic/csmic/bin/Debug/csmic.dll create mode 100644 CS-MIC/csmic/csmic/bin/Debug/csmic.pdb create mode 100644 CS-MIC/csmic/csmic/coco.exe create mode 100644 CS-MIC/csmic/csmic/obj/Debug/csmic.csproj.CoreCompileInputs.cache create mode 100644 CS-MIC/csmic/csmic/obj/Debug/csmic.csproj.FileListAbsolute.txt create mode 100644 CS-MIC/csmic/csmic/obj/Debug/csmic.dll create mode 100644 CS-MIC/csmic/csmic/obj/Debug/csmic.pdb diff --git a/CS-MIC/csmic/.vs/csmic/DesignTimeBuild/.dtbcache b/CS-MIC/csmic/.vs/csmic/DesignTimeBuild/.dtbcache new file mode 100644 index 0000000000000000000000000000000000000000..25e0b9693de95e1703c9bdec658a22b678415169 GIT binary patch literal 344 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%0A6FNU{(?T_nQ-U$wWK85#%o2bkoPl027 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 rTgUKQ&sSVrfDXI!Z`b-{e4d z_vm!OHkEmlj70V6K@a{WAWGRIhzFvvaHx@;!_z}MZ0xsoO;3U?>7+}*jGrF2<;-UJAwQ{ZfcpLB>FawqFHauMR3oY#pWTpLJvf&2U4^Z3cf zto^U9Um)ii7yh5d_|5#R_KwRP z`7Y%Jx^!p>LWIQyT7D3x!IU6q!O1VB26#%Y!B2^*#lT=L3=@7SWk9Kg7|Mu43ZeSI@1di}i<2ZGeQ!>GlSYSzZ$Y}w9vEshIu$n=;73nq3tec<-^`vzT%0Vnc zDhp=4sWDxganoW2DHpX6f0;_j(WJ_$C^;G>M?>uoN{)u}hLWS%%&R64Wm_6RbqiIqJ9o!U%RY8rdX#%gUo0C z=_!>x0;fzxI*-^#Q_uP{>5*}2yy#s%LM}w;pRgndD1SmN1kLELEV(Bg73pPIn93eO z6J`;Pn{+NYH8HFoLuzKogvk?sDF>8*k1|EkE$R)pafqP+F(2wi=dKMO`l+iO8##Iy z^|BL|I@U`J7(co$^{EC-eCk%OG+^p#r*8K;IO=+*csmic - - - False @@ -109,6 +106,7 @@ true + begin using System; -using System.CodeDom.Compiler; -->namespace -[GeneratedCodeAttribute("Coco/R", "")] public class Parser { -->constants - const bool T = true; - const bool x = false; + const bool _T = true; + const bool _x = false; const int minErrDist = 2; public Scanner scanner; @@ -110,7 +108,6 @@ public class Parser { la.val = ""; Get(); -->parseRoot - Expect(0); } static readonly bool[,] set = { @@ -121,35 +118,35 @@ public class Parser { public class Errors { public int count = 0; // number of errors detected - public StringBuilder builder = new StringBuilder(); // error messages go to this stream - public string errMsgFormat = "-- position {0}: {1}"; // 0=line, 1=column, 2=text - - public void SynErr (int line, int col, int n) { + public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream + public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text + + public virtual void SynErr (int line, int col, int n) { string s; switch (n) { -->errors default: s = "error " + n; break; } - builder.AppendFormat(errMsgFormat, col, s); + errorStream.WriteLine(errMsgFormat, line, col, s); count++; } - public void SemErr (int line, int col, string s) { - builder.AppendFormat(errMsgFormat, col, s); + public virtual void SemErr (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); count++; } - public void SemErr (string s) { - builder.AppendLine(s); + public virtual void SemErr (string s) { + errorStream.WriteLine(s); count++; } - public void Warning (int line, int col, string s) { - builder.AppendFormat(errMsgFormat, col, s); + public virtual void Warning (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); } - public void Warning(string s) { - builder.AppendLine(s); + public virtual void Warning(string s) { + errorStream.WriteLine(s); } } // Errors @@ -157,4 +154,3 @@ public class Errors { public class FatalError: Exception { public FatalError(string m): base(m) {} } - diff --git a/CS-MIC/csmic/csmic/InterpreterParser/Scanner.cs b/CS-MIC/csmic/csmic/InterpreterParser/Scanner.cs index 630ede2..abecef8 100644 --- a/CS-MIC/csmic/csmic/InterpreterParser/Scanner.cs +++ b/CS-MIC/csmic/csmic/InterpreterParser/Scanner.cs @@ -2,12 +2,9 @@ using System; using System.IO; using System.Collections; -using System.Collections.Generic; -using System.CodeDom.Compiler; namespace csmic.Interpreter { -[GeneratedCodeAttribute("Coco/R", "")] public class Token { public int kind; // token kind public int pos; // token position in bytes in the source text (starting at 0) @@ -219,7 +216,7 @@ public class Scanner { int col; // column number of current character int line; // line number of current character int oldEols; // EOLs that appeared in a comment; - static readonly Dictionary start; // maps first token character to start state + static readonly Hashtable start; // maps first token character to start state Token tokens; // list of tokens already peeked (first token is a dummy) Token pt; // current peek token @@ -228,7 +225,7 @@ public class Scanner { int tlen; // length of current token static Scanner() { - start = new Dictionary(128); + start = new Hashtable(128); for (int i = 65; i <= 90; ++i) start[i] = 1; for (int i = 97; i <= 122; ++i) start[i] = 1; start[43] = 2; @@ -332,7 +329,8 @@ public class Scanner { t = new Token(); t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; int state; - state = (int) start[ch]; + if (start.ContainsKey(ch)) { state = (int) start[ch]; } + else { state = 0; } tlen = 0; AddCh(); switch (state) { diff --git a/CS-MIC/csmic/csmic/InterpreterParser/Scanner.cs.old b/CS-MIC/csmic/csmic/InterpreterParser/Scanner.cs.old new file mode 100644 index 0000000..8c97818 --- /dev/null +++ b/CS-MIC/csmic/csmic/InterpreterParser/Scanner.cs.old @@ -0,0 +1,489 @@ + +using System; +using System.IO; +using System.Collections; + +namespace csmic.Interpreter { + +public class Token { + public int kind; // token kind + public int pos; // token position in bytes in the source text (starting at 0) + public int charPos; // token position in characters in the source text (starting at 0) + public int col; // token column (starting at 1) + public int line; // token line (starting at 1) + public string val; // token value + public Token next; // ML 2005-03-11 Tokens are kept in linked list +} + +//----------------------------------------------------------------------------------- +// Buffer +//----------------------------------------------------------------------------------- +public class Buffer { + // This Buffer supports the following cases: + // 1) seekable stream (file) + // a) whole stream in buffer + // b) part of stream in buffer + // 2) non seekable stream (network, console) + + public const int EOF = char.MaxValue + 1; + const int MIN_BUFFER_LENGTH = 1024; // 1KB + const int MAX_BUFFER_LENGTH = MIN_BUFFER_LENGTH * 64; // 64KB + byte[] buf; // input buffer + int bufStart; // position of first byte in buffer relative to input stream + int bufLen; // length of buffer + int fileLen; // length of input stream (may change if the stream is no file) + int bufPos; // current position in buffer + Stream stream; // input stream (seekable) + bool isUserStream; // was the stream opened by the user? + + public Buffer (Stream s, bool isUserStream) { + stream = s; this.isUserStream = isUserStream; + + if (stream.CanSeek) { + fileLen = (int) stream.Length; + bufLen = Math.Min(fileLen, MAX_BUFFER_LENGTH); + bufStart = Int32.MaxValue; // nothing in the buffer so far + } else { + fileLen = bufLen = bufStart = 0; + } + + buf = new byte[(bufLen>0) ? bufLen : MIN_BUFFER_LENGTH]; + if (fileLen > 0) Pos = 0; // setup buffer to position 0 (start) + else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid + if (bufLen == fileLen && stream.CanSeek) Close(); + } + + protected Buffer(Buffer b) { // called in UTF8Buffer constructor + buf = b.buf; + bufStart = b.bufStart; + bufLen = b.bufLen; + fileLen = b.fileLen; + bufPos = b.bufPos; + stream = b.stream; + // keep destructor from closing the stream + b.stream = null; + isUserStream = b.isUserStream; + } + + ~Buffer() { Close(); } + + protected void Close() { + if (!isUserStream && stream != null) { + stream.Close(); + stream = null; + } + } + + public virtual int Read () { + if (bufPos < bufLen) { + return buf[bufPos++]; + } else if (Pos < fileLen) { + Pos = Pos; // shift buffer start to Pos + return buf[bufPos++]; + } else if (stream != null && !stream.CanSeek && ReadNextStreamChunk() > 0) { + return buf[bufPos++]; + } else { + return EOF; + } + } + + public int Peek () { + int curPos = Pos; + int ch = Read(); + Pos = curPos; + return ch; + } + + // beg .. begin, zero-based, inclusive, in byte + // end .. end, zero-based, exclusive, in byte + public string GetString (int beg, int end) { + int len = 0; + char[] buf = new char[end - beg]; + int oldPos = Pos; + Pos = beg; + while (Pos < end) buf[len++] = (char) Read(); + Pos = oldPos; + return new String(buf, 0, len); + } + + public int Pos { + get { return bufPos + bufStart; } + set { + if (value >= fileLen && stream != null && !stream.CanSeek) { + // Wanted position is after buffer and the stream + // is not seek-able e.g. network or console, + // thus we have to read the stream manually till + // the wanted position is in sight. + while (value >= fileLen && ReadNextStreamChunk() > 0); + } + + if (value < 0 || value > fileLen) { + throw new FatalError("buffer out of bounds access, position: " + value); + } + + if (value >= bufStart && value < bufStart + bufLen) { // already in buffer + bufPos = value - bufStart; + } else if (stream != null) { // must be swapped in + stream.Seek(value, SeekOrigin.Begin); + bufLen = stream.Read(buf, 0, buf.Length); + bufStart = value; bufPos = 0; + } else { + // set the position to the end of the file, Pos will return fileLen. + bufPos = fileLen - bufStart; + } + } + } + + // Read the next chunk of bytes from the stream, increases the buffer + // if needed and updates the fields fileLen and bufLen. + // Returns the number of bytes read. + private int ReadNextStreamChunk() { + int free = buf.Length - bufLen; + if (free == 0) { + // in the case of a growing input stream + // we can neither seek in the stream, nor can we + // foresee the maximum length, thus we must adapt + // the buffer size on demand. + byte[] newBuf = new byte[bufLen * 2]; + Array.Copy(buf, newBuf, bufLen); + buf = newBuf; + free = bufLen; + } + int read = stream.Read(buf, bufLen, free); + if (read > 0) { + fileLen = bufLen = (bufLen + read); + return read; + } + // end of stream reached + return 0; + } +} + +//----------------------------------------------------------------------------------- +// UTF8Buffer +//----------------------------------------------------------------------------------- +public class UTF8Buffer: Buffer { + public UTF8Buffer(Buffer b): base(b) {} + + public override int Read() { + int ch; + do { + ch = base.Read(); + // until we find a utf8 start (0xxxxxxx or 11xxxxxx) + } while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EOF)); + if (ch < 128 || ch == EOF) { + // nothing to do, first 127 chars are the same in ascii and utf8 + // 0xxxxxxx or end of file character + } else if ((ch & 0xF0) == 0xF0) { + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x07; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; ch = base.Read(); + int c4 = ch & 0x3F; + ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4; + } else if ((ch & 0xE0) == 0xE0) { + // 1110xxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x0F; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; + ch = (((c1 << 6) | c2) << 6) | c3; + } else if ((ch & 0xC0) == 0xC0) { + // 110xxxxx 10xxxxxx + int c1 = ch & 0x1F; ch = base.Read(); + int c2 = ch & 0x3F; + ch = (c1 << 6) | c2; + } + return ch; + } +} + +//----------------------------------------------------------------------------------- +// Scanner +//----------------------------------------------------------------------------------- +public class Scanner { + const char EOL = '\n'; + const int eofSym = 0; /* pdt */ + const int maxT = 22; + const int noSym = 22; + + + public Buffer buffer; // scanner buffer + + Token t; // current token + int ch; // current input character + int pos; // byte position of current character + int charPos; // position by unicode characters starting with 0 + int col; // column number of current character + int line; // line number of current character + int oldEols; // EOLs that appeared in a comment; + static readonly Hashtable start; // maps first token character to start state + + Token tokens; // list of tokens already peeked (first token is a dummy) + Token pt; // current peek token + + char[] tval = new char[128]; // text of current token + int tlen; // length of current token + + static Scanner() { + start = new Hashtable(128); + for (int i = 65; i <= 90; ++i) start[i] = 1; + for (int i = 97; i <= 122; ++i) start[i] = 1; + start[43] = 2; + for (int i = 50; i <= 57; ++i) start[i] = 6; + start[48] = 17; + start[49] = 18; + start[34] = 11; + start[40] = 13; + start[41] = 14; + start[61] = 15; + start[60] = 19; + start[62] = 20; + start[42] = 21; + start[47] = 22; + start[37] = 23; + start[94] = 24; + start[91] = 25; + start[93] = 26; + start[44] = 27; + start[58] = 31; + start[45] = 32; + start[Buffer.EOF] = -1; + + } + + public Scanner (string fileName) { + try { + Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + buffer = new Buffer(stream, false); + Init(); + } catch (IOException) { + throw new FatalError("Cannot open file " + fileName); + } + } + + public Scanner (Stream s) { + buffer = new Buffer(s, true); + Init(); + } + + void Init() { + pos = -1; line = 1; col = 0; charPos = -1; + oldEols = 0; + NextCh(); + if (ch == 0xEF) { // check optional byte order mark for UTF-8 + NextCh(); int ch1 = ch; + NextCh(); int ch2 = ch; + if (ch1 != 0xBB || ch2 != 0xBF) { + throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2)); + } + buffer = new UTF8Buffer(buffer); col = 0; charPos = -1; + NextCh(); + } + pt = tokens = new Token(); // first token is a dummy + } + + void NextCh() { + if (oldEols > 0) { ch = EOL; oldEols--; } + else { + pos = buffer.Pos; + // buffer reads unicode chars, if UTF8 has been detected + ch = buffer.Read(); col++; charPos++; + // replace isolated '\r' by '\n' in order to make + // eol handling uniform across Windows, Unix and Mac + if (ch == '\r' && buffer.Peek() != '\n') ch = EOL; + if (ch == EOL) { line++; col = 0; } + } + + } + + void AddCh() { + if (tlen >= tval.Length) { + char[] newBuf = new char[2 * tval.Length]; + Array.Copy(tval, 0, newBuf, 0, tval.Length); + tval = newBuf; + } + if (ch != Buffer.EOF) { + tval[tlen++] = (char) ch; + NextCh(); + } + } + + + + + void CheckLiteral() { + switch (t.val) { + case "+": t.kind = 10; break; + case "-": t.kind = 11; break; + default: break; + } + } + + Token NextToken() { + while (ch == ' ' || + ch == 9 || ch == 13 + ) NextCh(); + + int recKind = noSym; + int recEnd = pos; + t = new Token(); + t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; + int state; + if (start.ContainsKey(ch)) { state = (int) start[ch]; } + else { state = 0; } + tlen = 0; AddCh(); + + switch (state) { + case -1: { t.kind = eofSym; break; } // NextCh already done + case 0: { + if (recKind != noSym) { + tlen = recEnd - t.pos; + SetScannerBehindT(); + } + t.kind = recKind; break; + } // NextCh already done + case 1: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} + else {t.kind = 1; break;} + case 2: + {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 3: + {t.kind = 3; break;} + case 4: + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} + else {goto case 0;} + case 5: + recEnd = pos; recKind = 4; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} + else {t.kind = 4; break;} + case 6: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 7: + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else if (ch == '+' || ch == '-') {AddCh(); goto case 8;} + else {goto case 0;} + case 8: + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else {goto case 0;} + case 9: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else {t.kind = 5; break;} + case 10: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 10;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else {t.kind = 5; break;} + case 11: + if (ch <= '!' || ch >= '#' && ch <= 65535) {AddCh(); goto case 11;} + else if (ch == '"') {AddCh(); goto case 12;} + else {goto case 0;} + case 12: + {t.kind = 6; break;} + case 13: + {t.kind = 7; break;} + case 14: + {t.kind = 8; break;} + case 15: + if (ch == '=') {AddCh(); goto case 16;} + else {goto case 0;} + case 16: + {t.kind = 9; break;} + case 17: + recEnd = pos; recKind = 5; + if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} + else if (ch >= '0' && ch <= '1') {AddCh(); goto case 18;} + else if (ch == 'x') {AddCh(); goto case 4;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 18: + recEnd = pos; recKind = 5; + if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} + else if (ch >= '0' && ch <= '1') {AddCh(); goto case 18;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 19: + recEnd = pos; recKind = 9; + if (ch == '=') {AddCh(); goto case 16;} + else {t.kind = 9; break;} + case 20: + recEnd = pos; recKind = 9; + if (ch == '=') {AddCh(); goto case 16;} + else {t.kind = 9; break;} + case 21: + {t.kind = 12; break;} + case 22: + {t.kind = 13; break;} + case 23: + {t.kind = 14; break;} + case 24: + {t.kind = 15; break;} + case 25: + {t.kind = 16; break;} + case 26: + {t.kind = 17; break;} + case 27: + {t.kind = 18; break;} + case 28: + {t.kind = 19; break;} + case 29: + {t.kind = 20; break;} + case 30: + {t.kind = 21; break;} + case 31: + if (ch == ':') {AddCh(); goto case 28;} + else if (ch == '=') {AddCh(); goto case 29;} + else {goto case 0;} + case 32: + recEnd = pos; recKind = 2; + if (ch == '>') {AddCh(); goto case 30;} + else {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + + } + t.val = new String(tval, 0, tlen); + return t; + } + + private void SetScannerBehindT() { + buffer.Pos = t.pos; + NextCh(); + line = t.line; col = t.col; charPos = t.charPos; + for (int i = 0; i < tlen; i++) NextCh(); + } + + // get the next token (possibly a token already seen during peeking) + public Token Scan () { + if (tokens.next == null) { + return NextToken(); + } else { + pt = tokens = tokens.next; + return tokens; + } + } + + // peek for the next token, ignore pragmas + public Token Peek () { + do { + if (pt.next == null) { + pt.next = NextToken(); + } + pt = pt.next; + } while (pt.kind > maxT); // skip pragmas + + return pt; + } + + // make sure that peeking starts at the current scan position + public void ResetPeek () { pt = tokens; } + +} // end Scanner +} \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/InterpreterParser/Scanner.frame b/CS-MIC/csmic/csmic/InterpreterParser/Scanner.frame index 8010e59..abac75d 100644 --- a/CS-MIC/csmic/csmic/InterpreterParser/Scanner.frame +++ b/CS-MIC/csmic/csmic/InterpreterParser/Scanner.frame @@ -28,12 +28,9 @@ Coco/R itself) does not fall under the GNU General Public License. using System; using System.IO; using System.Collections; -using System.Collections.Generic; -using System.CodeDom.Compiler; -->namespace -[GeneratedCodeAttribute("Coco/R", "")] public class Token { public int kind; // token kind public int pos; // token position in bytes in the source text (starting at 0) @@ -243,7 +240,7 @@ public class Scanner { int col; // column number of current character int line; // line number of current character int oldEols; // EOLs that appeared in a comment; - static readonly Dictionary start; // maps first token character to start state + static readonly Hashtable start; // maps first token character to start state Token tokens; // list of tokens already peeked (first token is a dummy) Token pt; // current peek token @@ -252,7 +249,7 @@ public class Scanner { int tlen; // length of current token static Scanner() { - start = new Dictionary(128); + start = new Hashtable(128); -->initialization } @@ -330,7 +327,8 @@ public class Scanner { t = new Token(); t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; int state; - state = (int) start[ch]; + if (start.ContainsKey(ch)) { state = (int) start[ch]; } + else { state = 0; } tlen = 0; AddCh(); switch (state) { diff --git a/CS-MIC/csmic/csmic/ScriptParser/Parser.cs b/CS-MIC/csmic/csmic/ScriptParser/Parser.cs index 4f29bbe..1906973 100644 --- a/CS-MIC/csmic/csmic/ScriptParser/Parser.cs +++ b/CS-MIC/csmic/csmic/ScriptParser/Parser.cs @@ -5,13 +5,11 @@ using System.Collections.Generic; using System; -using System.CodeDom.Compiler; namespace csmic.Scripting { -[GeneratedCodeAttribute("Coco/R", "")] public class Parser { public const int _EOF = 0; public const int _identifier = 1; @@ -26,8 +24,8 @@ public class Parser { public const int _COMPARER = 10; public const int maxT = 34; - const bool T = true; - const bool x = false; + const bool _T = true; + const bool _x = false; const int minErrDist = 2; public Scanner scanner; @@ -702,15 +700,14 @@ bool IsArrayCall() SCRIPT(); Expect(0); - Expect(0); } static readonly bool[,] set = { - {T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x}, - {x,T,x,T, T,T,x,x, T,x,x,T, x,x,x,T, T,x,T,T, T,T,T,T, x,x,x,x, x,x,x,x, x,x,x,x}, - {x,T,x,T, T,T,x,x, T,x,x,x, x,x,x,x, x,x,x,x, x,x,T,T, x,x,x,x, x,x,x,x, x,x,x,x}, - {x,T,x,T, T,T,x,x, T,x,x,T, x,x,x,T, T,x,x,T, T,T,T,T, x,x,x,x, x,x,x,x, x,x,x,x}, - {x,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,x,T,x} + {_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, + {_x,_T,_x,_T, _T,_T,_x,_x, _T,_x,_x,_T, _x,_x,_x,_T, _T,_x,_T,_T, _T,_T,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, + {_x,_T,_x,_T, _T,_T,_x,_x, _T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, + {_x,_T,_x,_T, _T,_T,_x,_x, _T,_x,_x,_T, _x,_x,_x,_T, _T,_x,_x,_T, _T,_T,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, + {_x,_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,_x,_T,_x} }; } // end Parser @@ -719,9 +716,9 @@ bool IsArrayCall() public class Errors { public int count = 0; // number of errors detected public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream - public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text - - public void SynErr (int line, int col, int n) { + public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text + + public virtual void SynErr (int line, int col, int n) { string s; switch (n) { case 0: s = "EOF expected"; break; @@ -771,21 +768,21 @@ public class Errors { count++; } - public void SemErr (int line, int col, string s) { + public virtual void SemErr (int line, int col, string s) { errorStream.WriteLine(errMsgFormat, line, col, s); count++; } - public void SemErr (string s) { + public virtual void SemErr (string s) { errorStream.WriteLine(s); count++; } - public void Warning (int line, int col, string s) { + public virtual void Warning (int line, int col, string s) { errorStream.WriteLine(errMsgFormat, line, col, s); } - public void Warning(string s) { + public virtual void Warning(string s) { errorStream.WriteLine(s); } } // Errors @@ -794,5 +791,4 @@ public class Errors { public class FatalError: Exception { public FatalError(string m): base(m) {} } - } \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/ScriptParser/Parser.cs.old b/CS-MIC/csmic/csmic/ScriptParser/Parser.cs.old new file mode 100644 index 0000000..6995c23 --- /dev/null +++ b/CS-MIC/csmic/csmic/ScriptParser/Parser.cs.old @@ -0,0 +1,794 @@ +using csmic; +using System.Text; +using System.Collections.Generic; + + + +using System; + +namespace csmic.Scripting { + + + +public class Parser { + public const int _EOF = 0; + public const int _identifier = 1; + public const int _sign = 2; + public const int _binary = 3; + public const int _hex = 4; + public const int _number = 5; + public const int _newline = 6; + public const int _string = 7; + public const int _LPAREN = 8; + public const int _RPAREN = 9; + public const int _COMPARER = 10; + public const int maxT = 34; + + const bool _T = true; + const bool _x = false; + const int minErrDist = 2; + + public Scanner scanner; + public Errors errors; + + public Token t; // last recognized token + public Token la; // lookahead token + int errDist = minErrDist; + +private MacroOperation root = new MacroOperation(OperationType.Unknown); + +internal MacroOperation Root +{ + get + { + return this.root; + } + set + { + this.root = value; + } +} + +bool IsFunctionCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _LPAREN && la.kind == _identifier) + return true; + return false; +} + +bool IsCompare() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _COMPARER) + return true; + return false; +} + +bool IsAssignment() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.val == "::" || next.val == ":=" || next.val == "->") + return true; + return false; +} + +bool IsArrayCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if(next.val == "[") + return true; + return false; +} + + + + public Parser(Scanner scanner) { + this.scanner = scanner; + errors = new Errors(); + } + + void SynErr (int n) { + if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n); + errDist = 0; + } + + public void SemErr (string msg) { + if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg); + errDist = 0; + } + + void Get () { + for (;;) { + t = la; + la = scanner.Scan(); + if (la.kind <= maxT) { ++errDist; break; } + + la = t; + } + } + + void Expect (int n) { + if (la.kind==n) Get(); else { SynErr(n); } + } + + bool StartOf (int s) { + return set[s, la.kind]; + } + + void ExpectWeak (int n, int follow) { + if (la.kind == n) Get(); + else { + SynErr(n); + while (!StartOf(follow)) Get(); + } + } + + + bool WeakSeparator(int n, int syFol, int repFol) { + int kind = la.kind; + if (kind == n) {Get(); return true;} + else if (StartOf(repFol)) {return false;} + else { + SynErr(n); + while (!(set[syFol, kind] || set[repFol, kind] || set[0, kind])) { + Get(); + kind = la.kind; + } + return StartOf(syFol); + } + } + + + void SCRIPT() { + string statement = string.Empty; + while (StartOf(1)) { + switch (la.kind) { + case 1: case 3: case 4: case 5: case 8: case 22: case 23: { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + this.root.Children.Add(operation); + + break; + } + case 11: { + IfBlock(ref this.root); + break; + } + case 15: { + WhileBlock(ref this.root); + break; + } + case 18: { + FunctionDeclaration(ref this.root); + break; + } + case 19: { + EchoStatement(ref this.root); + break; + } + case 20: { + SayStatement(ref this.root); + break; + } + case 21: { + DisplayStatement(ref this.root); + break; + } + case 16: { + ForBlock(ref this.root); + break; + } + } + } + } + + void Statement(out string value) { + value = string.Empty; + StringBuilder builder = new StringBuilder(); + + if (IsAssignment()) { + Assignment(ref builder); + value = builder.ToString(); + } else if (StartOf(2)) { + Expression(ref builder); + value = builder.ToString(); + } else SynErr(35); + } + + void IfBlock(ref MacroOperation parent) { + MacroOperation ifBlock = new MacroOperation(OperationType.If); + MacroOperation elseBlock = new MacroOperation(OperationType.Else); + string ifStatement = string.Empty; + string statement = string.Empty; + StringBuilder builder = new StringBuilder(); + bool hasElse = false; + + Expect(11); + Expect(8); + Comparison(ref builder); + ifStatement = builder.ToString(); ifBlock.Input.Add(ifStatement); + Expect(9); + Expect(12); + while (StartOf(3)) { + switch (la.kind) { + case 1: case 3: case 4: case 5: case 8: case 22: case 23: { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + ifBlock.Children.Add(operation); + + break; + } + case 11: { + IfBlock(ref ifBlock); + break; + } + case 15: { + WhileBlock(ref ifBlock); + break; + } + case 19: { + EchoStatement(ref ifBlock); + break; + } + case 20: { + SayStatement(ref ifBlock); + break; + } + case 21: { + DisplayStatement(ref ifBlock); + break; + } + case 16: { + ForBlock(ref ifBlock); + break; + } + } + } + Expect(13); + if (la.kind == 14) { + Get(); + hasElse = true; + Expect(12); + while (StartOf(3)) { + switch (la.kind) { + case 1: case 3: case 4: case 5: case 8: case 22: case 23: { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + elseBlock.Children.Add(operation); + + break; + } + case 11: { + IfBlock(ref elseBlock); + break; + } + case 15: { + WhileBlock(ref elseBlock); + break; + } + case 19: { + EchoStatement(ref elseBlock); + break; + } + case 20: { + SayStatement(ref elseBlock); + break; + } + case 21: { + DisplayStatement(ref elseBlock); + break; + } + case 16: { + ForBlock(ref elseBlock); + break; + } + } + } + Expect(13); + } + if(hasElse) + { + MacroOperation ifelse = new MacroOperation(OperationType.IfElse); + ifelse.Children.Add(ifBlock); + ifelse.Children.Add(elseBlock); + parent.Children.Add(ifelse); + } + else + { + parent.Children.Add(ifBlock); + } + + } + + void WhileBlock(ref MacroOperation parent) { + StringBuilder builder = new StringBuilder(); + MacroOperation whileBlock = new MacroOperation(OperationType.While); + string statement = string.Empty; + + Expect(15); + Expect(8); + Comparison(ref builder); + whileBlock.Input.Add(builder.ToString()); + Expect(9); + Expect(12); + while (StartOf(3)) { + switch (la.kind) { + case 1: case 3: case 4: case 5: case 8: case 22: case 23: { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + whileBlock.Children.Add(operation); + + break; + } + case 11: { + IfBlock(ref whileBlock); + break; + } + case 15: { + WhileBlock(ref whileBlock); + break; + } + case 19: { + EchoStatement(ref whileBlock); + break; + } + case 20: { + SayStatement(ref whileBlock); + break; + } + case 21: { + DisplayStatement(ref whileBlock); + break; + } + case 16: { + ForBlock(ref whileBlock); + break; + } + } + } + Expect(13); + parent.Children.Add(whileBlock); + + } + + void FunctionDeclaration(ref MacroOperation parent) { + StringBuilder builder = new StringBuilder(); + string statement = string.Empty; + MacroOperation func = new MacroOperation(OperationType.FunctionDeclaration); + + Expect(18); + Expect(8); + CommaList(ref builder); + string[] args = builder.ToString().Split(','); func.Input.AddRange(args); + Expect(9); + Expect(12); + while (StartOf(3)) { + switch (la.kind) { + case 1: case 3: case 4: case 5: case 8: case 22: case 23: { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + func.Children.Add(operation); + + break; + } + case 11: { + IfBlock(ref func); + break; + } + case 15: { + WhileBlock(ref func); + break; + } + case 19: { + EchoStatement(ref func); + break; + } + case 20: { + SayStatement(ref func); + break; + } + case 21: { + DisplayStatement(ref func); + break; + } + case 16: { + ForBlock(ref func); + break; + } + } + } + Expect(13); + parent.Children.Add(func); + + } + + void EchoStatement(ref MacroOperation parent) { + StringBuilder builder = new StringBuilder(); + MacroOperation echoStatement = new MacroOperation(OperationType.Echo); + string statement = string.Empty; + + Expect(19); + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + echoStatement.Children.Add(operation); + parent.Children.Add(echoStatement); + + } + + void SayStatement(ref MacroOperation parent) { + StringBuilder builder = new StringBuilder(); + MacroOperation sayStatement = new MacroOperation(OperationType.Say); + string statement = string.Empty; + + Expect(20); + Expect(7); + statement = t.val.Replace("\"", ""); + sayStatement.Input.Add(statement); + parent.Children.Add(sayStatement); + + } + + void DisplayStatement(ref MacroOperation parent) { + StringBuilder builder = new StringBuilder(); + MacroOperation displayStatement = new MacroOperation(OperationType.Display); + string statement = string.Empty; + + Expect(21); + if (StartOf(2)) { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + displayStatement.Children.Add(operation); + + } else if (la.kind == 7) { + Get(); + statement = t.val.Replace("\"", ""); + MacroOperation operation = new MacroOperation(OperationType.String); + operation.Input.Add(statement); + displayStatement.Children.Add(operation); + + } else SynErr(36); + while (la.kind == 17) { + Get(); + if (StartOf(2)) { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + displayStatement.Children.Add(operation); + + } else if (la.kind == 7) { + Get(); + statement = t.val.Replace("\"", ""); + MacroOperation operation = new MacroOperation(OperationType.String); + operation.Input.Add(statement); + displayStatement.Children.Add(operation); + + } else SynErr(37); + } + parent.Children.Add(displayStatement); + + } + + void ForBlock(ref MacroOperation parent) { + StringBuilder builder = new StringBuilder(); + string statement = string.Empty; + string statement2 = string.Empty; + MacroOperation forBlock = new MacroOperation(OperationType.For); + + Expect(16); + Expect(8); + Statement(out statement); + Expect(17); + Comparison(ref builder); + Expect(17); + Statement(out statement2); + forBlock.Input.Add(statement); forBlock.Input.Add(builder.ToString()); forBlock.Input.Add(statement2); + Expect(9); + Expect(12); + while (StartOf(3)) { + switch (la.kind) { + case 1: case 3: case 4: case 5: case 8: case 22: case 23: { + Statement(out statement); + MacroOperation operation = new MacroOperation(OperationType.Statement); + operation.Input.Add(statement); + forBlock.Children.Add(operation); + + break; + } + case 11: { + IfBlock(ref forBlock); + break; + } + case 15: { + WhileBlock(ref forBlock); + break; + } + case 19: { + EchoStatement(ref forBlock); + break; + } + case 20: { + SayStatement(ref forBlock); + break; + } + case 21: { + DisplayStatement(ref forBlock); + break; + } + case 16: { + ForBlock(ref forBlock); + break; + } + } + } + Expect(13); + parent.Children.Add(forBlock); + + } + + void Comparison(ref StringBuilder result) { + Expression(ref result); + Expect(10); + result.Append(t.val); + Expression(ref result); + } + + void CommaList(ref StringBuilder builder) { + Expression(ref builder); + while (la.kind == 17) { + Get(); + builder.Append(t.val); + Expression(ref builder); + } + } + + void Assignment(ref StringBuilder builder) { + Expect(1); + builder.Append(t.val); + if (la.kind == 30) { + Get(); + builder.Append(t.val); + Expression(ref builder); + } else if (la.kind == 31) { + Get(); + builder.Append(t.val); string value = string.Empty; + AnyExpression(out value); + builder.Append(value); + Expect(6); + } else if (la.kind == 32) { + Get(); + builder.Append(t.val); + ArrayL(ref builder); + } else SynErr(38); + } + + void Expression(ref StringBuilder builder) { + Term(ref builder); + while (la.kind == 22 || la.kind == 23 || la.kind == 24) { + if (la.kind == 22) { + Get(); + builder.Append(t.val); + Term(ref builder); + } else if (la.kind == 23) { + Get(); + builder.Append(t.val); + Term(ref builder); + } else { + Get(); + builder.Append(t.val); + Term(ref builder); + } + } + } + + void Term(ref StringBuilder builder) { + Factor(ref builder); + while (la.kind == 25 || la.kind == 26) { + if (la.kind == 25) { + Get(); + builder.Append(t.val); + Factor(ref builder); + } else { + Get(); + builder.Append(t.val); + Factor(ref builder); + } + } + } + + void Factor(ref StringBuilder builder) { + Value(ref builder); + while (la.kind == 27) { + Get(); + builder.Append(t.val); + Value(ref builder); + } + } + + void Value(ref StringBuilder builder) { + if (la.kind == 22 || la.kind == 23) { + if (la.kind == 22) { + Get(); + builder.Append(t.val); + } else { + Get(); + builder.Append(t.val); + } + } + if (IsFunctionCall()) { + Function(ref builder); + } else if (IsArrayCall()) { + ArrayCall(ref builder); + } else if (la.kind == 1) { + Get(); + builder.Append(t.val); + } else if (la.kind == 5) { + Get(); + builder.Append(t.val); + } else if (la.kind == 4) { + Get(); + builder.Append(t.val); + } else if (la.kind == 3) { + Get(); + builder.Append(t.val); + } else if (la.kind == 8) { + Get(); + builder.Append(t.val); + Expression(ref builder); + Expect(9); + builder.Append(t.val); + } else SynErr(39); + } + + void Function(ref StringBuilder builder) { + Expect(1); + builder.Append(t.val); + Expect(8); + builder.Append(t.val); + CommaList(ref builder); + Expect(9); + builder.Append(t.val); + } + + void ArrayCall(ref StringBuilder builder) { + Expect(1); + builder.Append(t.val); + Expect(28); + builder.Append(t.val); + Expression(ref builder); + Expect(29); + builder.Append(t.val); + } + + void ArrayL(ref StringBuilder builder) { + Expect(28); + builder.Append(t.val); + CommaList(ref builder); + Expect(29); + builder.Append(t.val); + } + + void AnyExpression(out string value) { + value = string.Empty; StringBuilder builder = new StringBuilder(); + Get(); + builder.Append(t.val); + while (StartOf(4)) { + Get(); + builder.Append(t.val); + } + Expect(33); + value = builder.ToString(); + } + + + + public void Parse() { + la = new Token(); + la.val = ""; + Get(); + SCRIPT(); + Expect(0); + + } + + static readonly bool[,] set = { + {_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, + {_x,_T,_x,_T, _T,_T,_x,_x, _T,_x,_x,_T, _x,_x,_x,_T, _T,_x,_T,_T, _T,_T,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, + {_x,_T,_x,_T, _T,_T,_x,_x, _T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, + {_x,_T,_x,_T, _T,_T,_x,_x, _T,_x,_x,_T, _x,_x,_x,_T, _T,_x,_x,_T, _T,_T,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, + {_x,_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,_x,_T,_x} + + }; +} // end Parser + + +public class Errors { + public int count = 0; // number of errors detected + public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream + public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text + + public virtual void SynErr (int line, int col, int n) { + string s; + switch (n) { + case 0: s = "EOF expected"; break; + case 1: s = "identifier expected"; break; + case 2: s = "sign expected"; break; + case 3: s = "binary expected"; break; + case 4: s = "hex expected"; break; + case 5: s = "number expected"; break; + case 6: s = "newline expected"; break; + case 7: s = "string expected"; break; + case 8: s = "LPAREN expected"; break; + case 9: s = "RPAREN expected"; break; + case 10: s = "COMPARER expected"; break; + case 11: s = "\"if\" expected"; break; + case 12: s = "\"{\" expected"; break; + case 13: s = "\"}\" expected"; break; + case 14: s = "\"else\" expected"; break; + case 15: s = "\"while\" expected"; break; + case 16: s = "\"for\" expected"; break; + case 17: s = "\",\" expected"; break; + case 18: s = "\"function\" expected"; break; + case 19: s = "\"echo:\" expected"; break; + case 20: s = "\"say:\" expected"; break; + case 21: s = "\"display:\" expected"; break; + case 22: s = "\"+\" expected"; break; + case 23: s = "\"-\" expected"; break; + case 24: s = "\"%\" expected"; break; + case 25: s = "\"*\" expected"; break; + case 26: s = "\"/\" expected"; break; + case 27: s = "\"^\" expected"; break; + case 28: s = "\"[\" expected"; break; + case 29: s = "\"]\" expected"; break; + case 30: s = "\"::\" expected"; break; + case 31: s = "\":=\" expected"; break; + case 32: s = "\"->\" expected"; break; + case 33: s = "\"\\n\" expected"; break; + case 34: s = "??? expected"; break; + case 35: s = "invalid Statement"; break; + case 36: s = "invalid DisplayStatement"; break; + case 37: s = "invalid DisplayStatement"; break; + case 38: s = "invalid Assignment"; break; + case 39: s = "invalid Value"; break; + + default: s = "error " + n; break; + } + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public virtual void SemErr (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public virtual void SemErr (string s) { + errorStream.WriteLine(s); + count++; + } + + public virtual void Warning (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + } + + public virtual void Warning(string s) { + errorStream.WriteLine(s); + } +} // Errors + + +public class FatalError: Exception { + public FatalError(string m): base(m) {} +} +} \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/ScriptParser/Parser.frame b/CS-MIC/csmic/csmic/ScriptParser/Parser.frame index ac4cdf0..85e022f 100644 --- a/CS-MIC/csmic/csmic/ScriptParser/Parser.frame +++ b/CS-MIC/csmic/csmic/ScriptParser/Parser.frame @@ -26,15 +26,13 @@ Coco/R itself) does not fall under the GNU General Public License. ----------------------------------------------------------------------*/ -->begin using System; -using System.CodeDom.Compiler; -->namespace -[GeneratedCodeAttribute("Coco/R", "")] public class Parser { -->constants - const bool T = true; - const bool x = false; + const bool _T = true; + const bool _x = false; const int minErrDist = 2; public Scanner scanner; @@ -110,7 +108,6 @@ public class Parser { la.val = ""; Get(); -->parseRoot - Expect(0); } static readonly bool[,] set = { @@ -122,9 +119,9 @@ public class Parser { public class Errors { public int count = 0; // number of errors detected public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream - public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text - - public void SynErr (int line, int col, int n) { + public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text + + public virtual void SynErr (int line, int col, int n) { string s; switch (n) { -->errors @@ -134,21 +131,21 @@ public class Errors { count++; } - public void SemErr (int line, int col, string s) { + public virtual void SemErr (int line, int col, string s) { errorStream.WriteLine(errMsgFormat, line, col, s); count++; } - public void SemErr (string s) { + public virtual void SemErr (string s) { errorStream.WriteLine(s); count++; } - public void Warning (int line, int col, string s) { + public virtual void Warning (int line, int col, string s) { errorStream.WriteLine(errMsgFormat, line, col, s); } - public void Warning(string s) { + public virtual void Warning(string s) { errorStream.WriteLine(s); } } // Errors @@ -157,4 +154,3 @@ public class Errors { public class FatalError: Exception { public FatalError(string m): base(m) {} } - diff --git a/CS-MIC/csmic/csmic/ScriptParser/Scanner.cs b/CS-MIC/csmic/csmic/ScriptParser/Scanner.cs index 846daae..5d86fec 100644 --- a/CS-MIC/csmic/csmic/ScriptParser/Scanner.cs +++ b/CS-MIC/csmic/csmic/ScriptParser/Scanner.cs @@ -2,12 +2,9 @@ using System; using System.IO; using System.Collections; -using System.Collections.Generic; -using System.CodeDom.Compiler; namespace csmic.Scripting { -[GeneratedCodeAttribute("Coco/R", "")] public class Token { public int kind; // token kind public int pos; // token position in bytes in the source text (starting at 0) @@ -219,7 +216,7 @@ public class Scanner { int col; // column number of current character int line; // line number of current character int oldEols; // EOLs that appeared in a comment; - static readonly Dictionary start; // maps first token character to start state + static readonly Hashtable start; // maps first token character to start state Token tokens; // list of tokens already peeked (first token is a dummy) Token pt; // current peek token @@ -228,7 +225,7 @@ public class Scanner { int tlen; // length of current token static Scanner() { - start = new Dictionary(128); + start = new Hashtable(128); for (int i = 65; i <= 90; ++i) start[i] = 1; for (int i = 97; i <= 99; ++i) start[i] = 1; for (int i = 102; i <= 114; ++i) start[i] = 1; @@ -393,7 +390,8 @@ public class Scanner { t = new Token(); t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; int state; - state = (int) start[ch]; + if (start.ContainsKey(ch)) { state = (int) start[ch]; } + else { state = 0; } tlen = 0; AddCh(); switch (state) { diff --git a/CS-MIC/csmic/csmic/ScriptParser/Scanner.cs.old b/CS-MIC/csmic/csmic/ScriptParser/Scanner.cs.old new file mode 100644 index 0000000..d4290ed --- /dev/null +++ b/CS-MIC/csmic/csmic/ScriptParser/Scanner.cs.old @@ -0,0 +1,635 @@ + +using System; +using System.IO; +using System.Collections; + +namespace csmic.Scripting { + +public class Token { + public int kind; // token kind + public int pos; // token position in bytes in the source text (starting at 0) + public int charPos; // token position in characters in the source text (starting at 0) + public int col; // token column (starting at 1) + public int line; // token line (starting at 1) + public string val; // token value + public Token next; // ML 2005-03-11 Tokens are kept in linked list +} + +//----------------------------------------------------------------------------------- +// Buffer +//----------------------------------------------------------------------------------- +public class Buffer { + // This Buffer supports the following cases: + // 1) seekable stream (file) + // a) whole stream in buffer + // b) part of stream in buffer + // 2) non seekable stream (network, console) + + public const int EOF = char.MaxValue + 1; + const int MIN_BUFFER_LENGTH = 1024; // 1KB + const int MAX_BUFFER_LENGTH = MIN_BUFFER_LENGTH * 64; // 64KB + byte[] buf; // input buffer + int bufStart; // position of first byte in buffer relative to input stream + int bufLen; // length of buffer + int fileLen; // length of input stream (may change if the stream is no file) + int bufPos; // current position in buffer + Stream stream; // input stream (seekable) + bool isUserStream; // was the stream opened by the user? + + public Buffer (Stream s, bool isUserStream) { + stream = s; this.isUserStream = isUserStream; + + if (stream.CanSeek) { + fileLen = (int) stream.Length; + bufLen = Math.Min(fileLen, MAX_BUFFER_LENGTH); + bufStart = Int32.MaxValue; // nothing in the buffer so far + } else { + fileLen = bufLen = bufStart = 0; + } + + buf = new byte[(bufLen>0) ? bufLen : MIN_BUFFER_LENGTH]; + if (fileLen > 0) Pos = 0; // setup buffer to position 0 (start) + else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid + if (bufLen == fileLen && stream.CanSeek) Close(); + } + + protected Buffer(Buffer b) { // called in UTF8Buffer constructor + buf = b.buf; + bufStart = b.bufStart; + bufLen = b.bufLen; + fileLen = b.fileLen; + bufPos = b.bufPos; + stream = b.stream; + // keep destructor from closing the stream + b.stream = null; + isUserStream = b.isUserStream; + } + + ~Buffer() { Close(); } + + protected void Close() { + if (!isUserStream && stream != null) { + stream.Close(); + stream = null; + } + } + + public virtual int Read () { + if (bufPos < bufLen) { + return buf[bufPos++]; + } else if (Pos < fileLen) { + Pos = Pos; // shift buffer start to Pos + return buf[bufPos++]; + } else if (stream != null && !stream.CanSeek && ReadNextStreamChunk() > 0) { + return buf[bufPos++]; + } else { + return EOF; + } + } + + public int Peek () { + int curPos = Pos; + int ch = Read(); + Pos = curPos; + return ch; + } + + // beg .. begin, zero-based, inclusive, in byte + // end .. end, zero-based, exclusive, in byte + public string GetString (int beg, int end) { + int len = 0; + char[] buf = new char[end - beg]; + int oldPos = Pos; + Pos = beg; + while (Pos < end) buf[len++] = (char) Read(); + Pos = oldPos; + return new String(buf, 0, len); + } + + public int Pos { + get { return bufPos + bufStart; } + set { + if (value >= fileLen && stream != null && !stream.CanSeek) { + // Wanted position is after buffer and the stream + // is not seek-able e.g. network or console, + // thus we have to read the stream manually till + // the wanted position is in sight. + while (value >= fileLen && ReadNextStreamChunk() > 0); + } + + if (value < 0 || value > fileLen) { + throw new FatalError("buffer out of bounds access, position: " + value); + } + + if (value >= bufStart && value < bufStart + bufLen) { // already in buffer + bufPos = value - bufStart; + } else if (stream != null) { // must be swapped in + stream.Seek(value, SeekOrigin.Begin); + bufLen = stream.Read(buf, 0, buf.Length); + bufStart = value; bufPos = 0; + } else { + // set the position to the end of the file, Pos will return fileLen. + bufPos = fileLen - bufStart; + } + } + } + + // Read the next chunk of bytes from the stream, increases the buffer + // if needed and updates the fields fileLen and bufLen. + // Returns the number of bytes read. + private int ReadNextStreamChunk() { + int free = buf.Length - bufLen; + if (free == 0) { + // in the case of a growing input stream + // we can neither seek in the stream, nor can we + // foresee the maximum length, thus we must adapt + // the buffer size on demand. + byte[] newBuf = new byte[bufLen * 2]; + Array.Copy(buf, newBuf, bufLen); + buf = newBuf; + free = bufLen; + } + int read = stream.Read(buf, bufLen, free); + if (read > 0) { + fileLen = bufLen = (bufLen + read); + return read; + } + // end of stream reached + return 0; + } +} + +//----------------------------------------------------------------------------------- +// UTF8Buffer +//----------------------------------------------------------------------------------- +public class UTF8Buffer: Buffer { + public UTF8Buffer(Buffer b): base(b) {} + + public override int Read() { + int ch; + do { + ch = base.Read(); + // until we find a utf8 start (0xxxxxxx or 11xxxxxx) + } while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EOF)); + if (ch < 128 || ch == EOF) { + // nothing to do, first 127 chars are the same in ascii and utf8 + // 0xxxxxxx or end of file character + } else if ((ch & 0xF0) == 0xF0) { + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x07; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; ch = base.Read(); + int c4 = ch & 0x3F; + ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4; + } else if ((ch & 0xE0) == 0xE0) { + // 1110xxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x0F; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; + ch = (((c1 << 6) | c2) << 6) | c3; + } else if ((ch & 0xC0) == 0xC0) { + // 110xxxxx 10xxxxxx + int c1 = ch & 0x1F; ch = base.Read(); + int c2 = ch & 0x3F; + ch = (c1 << 6) | c2; + } + return ch; + } +} + +//----------------------------------------------------------------------------------- +// Scanner +//----------------------------------------------------------------------------------- +public class Scanner { + const char EOL = '\n'; + const int eofSym = 0; /* pdt */ + const int maxT = 34; + const int noSym = 34; + + + public Buffer buffer; // scanner buffer + + Token t; // current token + int ch; // current input character + int pos; // byte position of current character + int charPos; // position by unicode characters starting with 0 + int col; // column number of current character + int line; // line number of current character + int oldEols; // EOLs that appeared in a comment; + static readonly Hashtable start; // maps first token character to start state + + Token tokens; // list of tokens already peeked (first token is a dummy) + Token pt; // current peek token + + char[] tval = new char[128]; // text of current token + int tlen; // length of current token + + static Scanner() { + start = new Hashtable(128); + for (int i = 65; i <= 90; ++i) start[i] = 1; + for (int i = 97; i <= 99; ++i) start[i] = 1; + for (int i = 102; i <= 114; ++i) start[i] = 1; + for (int i = 116; i <= 122; ++i) start[i] = 1; + start[43] = 2; + for (int i = 50; i <= 57; ++i) start[i] = 6; + for (int i = 10; i <= 10; ++i) start[i] = 12; + for (int i = 13; i <= 13; ++i) start[i] = 11; + start[48] = 19; + start[49] = 20; + start[34] = 13; + start[40] = 15; + start[41] = 16; + start[61] = 17; + start[60] = 21; + start[62] = 22; + start[123] = 23; + start[125] = 24; + start[44] = 25; + start[101] = 38; + start[115] = 39; + start[100] = 40; + start[37] = 29; + start[42] = 30; + start[47] = 31; + start[94] = 32; + start[91] = 33; + start[93] = 34; + start[58] = 41; + start[45] = 42; + start[Buffer.EOF] = -1; + + } + + public Scanner (string fileName) { + try { + Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + buffer = new Buffer(stream, false); + Init(); + } catch (IOException) { + throw new FatalError("Cannot open file " + fileName); + } + } + + public Scanner (Stream s) { + buffer = new Buffer(s, true); + Init(); + } + + void Init() { + pos = -1; line = 1; col = 0; charPos = -1; + oldEols = 0; + NextCh(); + if (ch == 0xEF) { // check optional byte order mark for UTF-8 + NextCh(); int ch1 = ch; + NextCh(); int ch2 = ch; + if (ch1 != 0xBB || ch2 != 0xBF) { + throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2)); + } + buffer = new UTF8Buffer(buffer); col = 0; charPos = -1; + NextCh(); + } + pt = tokens = new Token(); // first token is a dummy + } + + void NextCh() { + if (oldEols > 0) { ch = EOL; oldEols--; } + else { + pos = buffer.Pos; + // buffer reads unicode chars, if UTF8 has been detected + ch = buffer.Read(); col++; charPos++; + // replace isolated '\r' by '\n' in order to make + // eol handling uniform across Windows, Unix and Mac + if (ch == '\r' && buffer.Peek() != '\n') ch = EOL; + if (ch == EOL) { line++; col = 0; } + } + + } + + void AddCh() { + if (tlen >= tval.Length) { + char[] newBuf = new char[2 * tval.Length]; + Array.Copy(tval, 0, newBuf, 0, tval.Length); + tval = newBuf; + } + if (ch != Buffer.EOF) { + tval[tlen++] = (char) ch; + NextCh(); + } + } + + + + bool Comment0() { + int level = 1, pos0 = pos, line0 = line, col0 = col, charPos0 = charPos; + NextCh(); + if (ch == '/') { + NextCh(); + for(;;) { + if (ch == 10) { + level--; + if (level == 0) { oldEols = line - line0; NextCh(); return true; } + NextCh(); + } else if (ch == Buffer.EOF) return false; + else NextCh(); + } + } else { + buffer.Pos = pos0; NextCh(); line = line0; col = col0; charPos = charPos0; + } + return false; + } + + bool Comment1() { + int level = 1, pos0 = pos, line0 = line, col0 = col, charPos0 = charPos; + NextCh(); + if (ch == '*') { + NextCh(); + for(;;) { + if (ch == '*') { + NextCh(); + if (ch == '/') { + level--; + if (level == 0) { oldEols = line - line0; NextCh(); return true; } + NextCh(); + } + } else if (ch == '/') { + NextCh(); + if (ch == '*') { + level++; NextCh(); + } + } else if (ch == Buffer.EOF) return false; + else NextCh(); + } + } else { + buffer.Pos = pos0; NextCh(); line = line0; col = col0; charPos = charPos0; + } + return false; + } + + + void CheckLiteral() { + switch (t.val) { + case "if": t.kind = 11; break; + case "else": t.kind = 14; break; + case "while": t.kind = 15; break; + case "for": t.kind = 16; break; + case "function": t.kind = 18; break; + case "+": t.kind = 22; break; + case "-": t.kind = 23; break; + case "\n": t.kind = 33; break; + default: break; + } + } + + Token NextToken() { + while (ch == ' ' || + ch >= 9 && ch <= 10 || ch == 13 + ) NextCh(); + if (ch == '/' && Comment0() ||ch == '/' && Comment1()) return NextToken(); + int recKind = noSym; + int recEnd = pos; + t = new Token(); + t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; + int state; + if (start.ContainsKey(ch)) { state = (int) start[ch]; } + else { state = 0; } + tlen = 0; AddCh(); + + switch (state) { + case -1: { t.kind = eofSym; break; } // NextCh already done + case 0: { + if (recKind != noSym) { + tlen = recEnd - t.pos; + SetScannerBehindT(); + } + t.kind = recKind; break; + } // NextCh already done + case 1: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 2: + {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 3: + {t.kind = 3; break;} + case 4: + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} + else {goto case 0;} + case 5: + recEnd = pos; recKind = 4; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} + else {t.kind = 4; break;} + case 6: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 7: + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else if (ch == '+' || ch == '-') {AddCh(); goto case 8;} + else {goto case 0;} + case 8: + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else {goto case 0;} + case 9: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else {t.kind = 5; break;} + case 10: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 10;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else {t.kind = 5; break;} + case 11: + if (ch == 10) {AddCh(); goto case 12;} + else {goto case 0;} + case 12: + {t.kind = 6; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 13: + if (ch <= '!' || ch >= '#' && ch <= 65535) {AddCh(); goto case 13;} + else if (ch == '"') {AddCh(); goto case 14;} + else {goto case 0;} + case 14: + {t.kind = 7; break;} + case 15: + {t.kind = 8; break;} + case 16: + {t.kind = 9; break;} + case 17: + if (ch == '=') {AddCh(); goto case 18;} + else {goto case 0;} + case 18: + {t.kind = 10; break;} + case 19: + recEnd = pos; recKind = 5; + if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} + else if (ch >= '0' && ch <= '1') {AddCh(); goto case 20;} + else if (ch == 'x') {AddCh(); goto case 4;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 20: + recEnd = pos; recKind = 5; + if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} + else if (ch >= '0' && ch <= '1') {AddCh(); goto case 20;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 21: + recEnd = pos; recKind = 10; + if (ch == '=') {AddCh(); goto case 18;} + else {t.kind = 10; break;} + case 22: + recEnd = pos; recKind = 10; + if (ch == '=') {AddCh(); goto case 18;} + else {t.kind = 10; break;} + case 23: + {t.kind = 12; break;} + case 24: + {t.kind = 13; break;} + case 25: + {t.kind = 17; break;} + case 26: + {t.kind = 19; break;} + case 27: + {t.kind = 20; break;} + case 28: + {t.kind = 21; break;} + case 29: + {t.kind = 24; break;} + case 30: + {t.kind = 25; break;} + case 31: + {t.kind = 26; break;} + case 32: + {t.kind = 27; break;} + case 33: + {t.kind = 28; break;} + case 34: + {t.kind = 29; break;} + case 35: + {t.kind = 30; break;} + case 36: + {t.kind = 31; break;} + case 37: + {t.kind = 32; break;} + case 38: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'b' || ch >= 'd' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'c') {AddCh(); goto case 43;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 39: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'b' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'a') {AddCh(); goto case 44;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 40: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'h' || ch >= 'j' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'i') {AddCh(); goto case 45;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 41: + if (ch == ':') {AddCh(); goto case 35;} + else if (ch == '=') {AddCh(); goto case 36;} + else {goto case 0;} + case 42: + recEnd = pos; recKind = 2; + if (ch == '>') {AddCh(); goto case 37;} + else {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 43: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'g' || ch >= 'i' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'h') {AddCh(); goto case 46;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 44: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'x' || ch == 'z') {AddCh(); goto case 1;} + else if (ch == 'y') {AddCh(); goto case 47;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 45: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'r' || ch >= 't' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 's') {AddCh(); goto case 48;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 46: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'n' || ch >= 'p' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'o') {AddCh(); goto case 49;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 47: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == ':') {AddCh(); goto case 27;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 48: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'o' || ch >= 'q' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'p') {AddCh(); goto case 50;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 49: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == ':') {AddCh(); goto case 26;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 50: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'k' || ch >= 'm' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'l') {AddCh(); goto case 51;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 51: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'b' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == 'a') {AddCh(); goto case 52;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 52: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'x' || ch == 'z') {AddCh(); goto case 1;} + else if (ch == 'y') {AddCh(); goto case 53;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 53: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} + else if (ch == ':') {AddCh(); goto case 28;} + else {t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + + } + t.val = new String(tval, 0, tlen); + return t; + } + + private void SetScannerBehindT() { + buffer.Pos = t.pos; + NextCh(); + line = t.line; col = t.col; charPos = t.charPos; + for (int i = 0; i < tlen; i++) NextCh(); + } + + // get the next token (possibly a token already seen during peeking) + public Token Scan () { + if (tokens.next == null) { + return NextToken(); + } else { + pt = tokens = tokens.next; + return tokens; + } + } + + // peek for the next token, ignore pragmas + public Token Peek () { + do { + if (pt.next == null) { + pt.next = NextToken(); + } + pt = pt.next; + } while (pt.kind > maxT); // skip pragmas + + return pt; + } + + // make sure that peeking starts at the current scan position + public void ResetPeek () { pt = tokens; } + +} // end Scanner +} \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/ScriptParser/Scanner.frame b/CS-MIC/csmic/csmic/ScriptParser/Scanner.frame index 8010e59..abac75d 100644 --- a/CS-MIC/csmic/csmic/ScriptParser/Scanner.frame +++ b/CS-MIC/csmic/csmic/ScriptParser/Scanner.frame @@ -28,12 +28,9 @@ Coco/R itself) does not fall under the GNU General Public License. using System; using System.IO; using System.Collections; -using System.Collections.Generic; -using System.CodeDom.Compiler; -->namespace -[GeneratedCodeAttribute("Coco/R", "")] public class Token { public int kind; // token kind public int pos; // token position in bytes in the source text (starting at 0) @@ -243,7 +240,7 @@ public class Scanner { int col; // column number of current character int line; // line number of current character int oldEols; // EOLs that appeared in a comment; - static readonly Dictionary start; // maps first token character to start state + static readonly Hashtable start; // maps first token character to start state Token tokens; // list of tokens already peeked (first token is a dummy) Token pt; // current peek token @@ -252,7 +249,7 @@ public class Scanner { int tlen; // length of current token static Scanner() { - start = new Dictionary(128); + start = new Hashtable(128); -->initialization } @@ -330,7 +327,8 @@ public class Scanner { t = new Token(); t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; int state; - state = (int) start[ch]; + if (start.ContainsKey(ch)) { state = (int) start[ch]; } + else { state = 0; } tlen = 0; AddCh(); switch (state) { diff --git a/CS-MIC/csmic/csmic/bin/Debug/csmic.XML b/CS-MIC/csmic/csmic/bin/Debug/csmic.XML new file mode 100644 index 0000000..b170882 --- /dev/null +++ b/CS-MIC/csmic/csmic/bin/Debug/csmic.XML @@ -0,0 +1,1028 @@ + + + + csmic + + + +

Coded function factory. + + This class generates new coded functions dynamically. + + + + Creates a new ICodedFunction interface object that implements the dynamic method described. + Name of the function. + Number of expected arguments. + The method body. + An ICodedFunction interface object. + + + + A coded implementation of the absolute value function. + + + + + Expects 1 argument. + + + + + The name of the function. + + + + + Executes a code block. + + The arguments used in the code block. + The absolute value of the argument. + + + + A coded implementation of the exponential function based on the constant e. + + + + + Expects 1 argument. + + + + + The name of the function. + + + + + Executes a code block. + + The arguments used in the code block. + The constant e raised to the power of the argument. + + + + A coded implementation of the log function. + + + + + Expects 2 arguments. + + + + + The name of the function. + + + + + Executes a code block. + + The arguments used in the code block. + The log of the first argument to the base of the second argument. + + + + A coded implementation of a precision function. + + + + + Expects 2 arguments. + + + + + The name of the function. + + + + + Executes a code block. + + The arguments used in the code block. + The first argument to the precision of the argument. + + + + A coded implementation of the squre root function. + + + + + Expects 1 argument. + + + + + The name of the function. + + + + + Executes a code block. + + The arguments used in the code block. + The square root of the argument. + + + + A coded implementation of the cosine function. + + + + + Expects 1 argument. + + + + + The name of the function. + + + + + Executes a code block. + + The arguments used in the code block. + The cosine of the argument. + + + + A coded implementation of a rounded function. + + + + + Expects 1 argument. + + + + + The name of the function. + + + + + Executes a code block. + + The arguments used in the code block. + The rounded argument. + + + + A coded implementation of the sine function. + + + + + Expects 1 argument. + + + + + The name of the function. + + + + + Executes a code block. + + The arguments used in the code block. + The sine of the argument. + + + + A coded implementation of the tangent function. + + + + + Expects 1 argument. + + + + + The name of the function. + + + + + Executes a code block. + + The arguments used in the code block. + The tangent of the argument. + + + Computable class. + + + The expression to be built. + + + The interpreter to act as a base. + + + The add symbol. + + + The substract symbol. + + + The divide symbol. + + + The multiply symbol. + + + The modifier symbol. + + + The power symbol. + + + Gets the expression. + The expression. + + + Creates a Computable instance. + The expression. + The interpreter. + + + Resolves the computable as an input interpreter having calculated the input. + The computable as an input interpreter. + + + Resolve the computer to a type . + Generic type parameter. + The selector function. + . + + + Form the operation given the operation constant and an argument. + The operation constant. + The argument. + A string with the given operation appended. + + + Form the function with the current expression as the first argument, followed by . + The name of the function. + The arguments. + . + + + Adds addend. + The decimal to add. + A computable class after the addition. + + + Subtracts the subtrahend. + The subtrahend. + A computable class after the subtraction. + + + Multiplies the multiplicand. + The multiplicand. + A computable class after the mulitplication. + + + Divides the divisor. + The divisor. + A computable class after the divison. + + + Mods using a given divisor. + The divisor. + A computable class after the mod. + + + Raises to power of the given integer value. + The power. + A computable class after the power operation. + + + Applies the function with the current expression as the first argument, followed by . + The name of the function. + The arguments. + A computable class after the function is applied. + + + Executes a command for all items in a collection. + Generic type parameter. + The items of type . + The action belonging to type . + . + + + CS-MIC extension methods. + + + A string extension method that interprets as input the string that calls it. + The input to act on. + The output from the interpretation of the string. + + + A string extension method that executes as macro operation. + The script to act on. + The final output of the script. + + + + A string extension method that interprets as input the string that calls it. + + The collection to act on. + The output from the interpretation of the string. + + + + A string extension method that interprets as input the string that calls it. + + The collection to act on. + The action. + The output from the interpretation of the string. + + + Enumerates input in this collection, returning a selection on the interpreter. + Generic type parameter. + The collection to act on. + The selection. + + An enumerator that allows foreach to be used to process interpret< t> in this + collection. + + + + A string extension method that executes as macro operation. + The collection to act on. + The final output of the script. + + + Enumerates input in parallel in this collection. + The collection to act on. + + An enumerator that allows foreach to be used to process interpret in parallel in this + collection. + + + + Enumerates input in parallel this collection, returning a selection on the interpreter. + Generic type parameter. + The collection to act on. + The selection. + + An enumerator that allows foreach to be used to process interpret in parallel< t> in + this collection. + + + + + A string extension method that interprets as input the strings that calls it in parallel. + + The collection to act on. + The output from the interpretation of the string. + + + + A generically coded implementation of the ICodedFunction interface. + + + + Number of expected arguments. + + + Name of the function. + + + The method body. + + + Constructor. + Name of the function. + Number of expected arguments. + The method body. + + + Gets the number of expected arguments. + The total number of expected arguments. + + + Gets the name of the function. + The name of the function. + + + Executes a code block that computes the value of the function. + A variable-length parameters list containing arguments. + The decimal value computed by the function. + + + + Implements a function that is coded in the .Net environment. + + This interface is required to implement a method or function + that can be used by the CS-MIC inputInterpreter. It is worth noting that the + function's name will be the text that is used in the inputInterpreter as the + executable text. + + + + Gets the number of expected arguments. + + + + + Gets the name of the function. + + The input inputInterpreter will use this function name as + executable text, expecting an opening and closing parenthesis following + it. + + + + Executes a code block that computes the value of the function. + + An array of arguments passed to the function. + The decimal value computed by the function. + Any code block is valid. Error handling must be done by the + developer, as the inputInterpreter cannot determine if there is an error. + + This example shows how to implement the sine function through the interface's + Execute() function. + + public decimal Execute(params decimal[] args) + { + //Set up an output variable. + decimal output = 0; + + //Check to see if the number or arguments recieved + //is equal to the number of arguments expected. + if (args.Length == this.NumExpectedArguments) + { + //Grab the argument and set a local variable for clarity. + decimal input = args[0]; + + //Set the output as a sine of the input. + output = (decimal)Math.Sin((double)input); + } + + //Return the output. The function will return the sine if the arguments + //matched what was expected, and will return 0 otherwise. Returning 0 on + //errors is the standard in CS-MIC. + return output; + } + + + + + + An interpreter object that reads user input and evaluates the code. + + The interpreter does not support exceptions by design. Instead, invalid + calculations, parameters, etc. will result in a result of zero. + + InputInterpreter interpreter = new InputInterpreter(); + interpreter.Interpret("1/0"); // The result will be 0, not an exception. + + + + + + The output generated. + + + + + The variables assigned. + + + + + The time for execution. + + + + + The verbose message of the calculation. + + + + + The list of coded functions that can be executed. + + + + + The list of user defined functions that can be executed. + + + + + The private calculated value. + + + + + Creates a new InputInterpreter. + + + + + Creates a new InputInterpreter from an original. + + The orginal input interpreter to copy. + + + + Gets the message that represents the InputInterpreters output. + + + + + Gets the verbose message that is generated with a calculation. + + + + + Gets the value of the output as a decimal. + + + + + Gets the value of the output cast as an int. + + + + + Gets the value of the output cast as a float. + + + + + Gets the value of the output cast as a double. + + + + + Gets the value (cast as a long) converted to its binary equivalent. + + + + + Gets the execution time of the last calculation. + + + + + Gets or sets a list of coded functions that the interpreter supports. + + + + + Gets or sets a list of user generated interpreted functions that the interpreter supports. + + The interpreted functions. + + + Gets the variables. + The variables. + + + + Interprets and executes given input. + + The input to interpret and execute. + + + + Computes an expression and returns the result as a decimal. + + The expression to be calculated. + The value that was computed. + + + + Assigns a decimal value to a variable. + + The name of the variable. + The value of the variable. + True if the variable was set, false otherwise. + + + + Assigns a decimal value to a variable. + + The name of the variable. + The expression of the variable. + True if the variable was set, false otherwise. + + + + Assigns a decimal value to a variable. + + The name of the variable. + The values of the variable. + True if the variable was set, false otherwise. + + + + Executes a function stored in the interpreter. + + The name of the function to execute. + The arguments to pass to the function. + The value computed from the function execution. + + + + Loads the default coded functions supported by the interpreter. + + + + + Produces output given a single object. + + The object representing the output. + + + + Produces output given an object and a message. + + The object representing the output. + The message to be displayed with the output. + + + Interpret an input asynchronously. + The input to interpret and execute. + The callback. + + + Interpret asynchronous threading work. + The input to interpret and execute. + + + Interpret asynchronous delegate. + The input. + . + + + Converts this object to a computable. + This object as a Computable. + + + Treats the current object as a computable and performs an action in that context. + The action to execute as a computable object. + This object as a Computable, after the given action. + + + + Represents a user defined function that can be executed by the interpreter. + + + + + The name of the function. + + + + + The number of expected arguments. + + + + + The set of instructions to be passed to the internal inputInterpreter. + + + + + A set of arguments used in computation of the function. + + + + + The internal macro builder used for computation. + + + + + The internal input inputInterpreter that macro builder will use for computation. + + + + + Creates a new interpreted function. + + The name of the fuction. + The node to be used in computation. + A set of argument names to be used in computation. + + + + Gets the name of the function. + + + + + Gets the number of expected arguments for the function. + + + + + Computes the value of the function. + + The arguments used for computation. + The decimal value computed by the function. + + + + Because a function's internal pattern may be different, we must manually check to see if the function + names are the same. + + The object to test. + True if the functions are the same. + + + Serves as a hash function for a particular type. + A hash code for the current . + + + + Represents an argument made in an interpreted function. + + + + + The name of the argument. + + + + + The value of the argument. + + + + + Creates a new interpreted function argument. + + + + + Creates a new interpreted function argument. + + The name of the argument in the interpreted function. + The value of the argument to use in the interpreted function. + + + + Gets or sets the name of the argument. + + + + + Gets or sets the value of the argument. + + + + + A builder object that executes macro scripts. + + + + + The input inputInterpreter. + + + + The script to run as a macro. + + + + The output as a list of strings. + + + + + The time for execution. + + + + + The root macro operation. + + + + + Creates a new builder object that executes a given macro script. + + A list of strings representing the macro. + The InputInterpreter to be used. + + + + Creates a new builder object that executes a given macro script. + + A list of strings representing the macro. + The InputInterpreter to be used. + + + + Gets a list of strings representing the output. + + + + + Gets the execution time of the last script computation. + + + + + Gets the decimal value last computed by the macrobuilder. + + + + Runs this macro. + + + Executes the asynchronous operation. + The input. + The callback. + + + Executes the asynchronous threading work operation. + The input. + . + + + Macro asynchronous delegate. + The input. + . + + + + Represents the operation types supported by a scripted macro. + + + + + Represents a conditional block. + + + + + Represents a conditional else block. + + + + + Represents a complete conditional block. + + + + + A while block. + + + + + A for block. + + + + + A function declaration. + + + + + An echo statement. + + + + + A say statement. + + + + + A display statement. + + + + + A statement to execute. + + + + + A string to display. + + + + + An unknown or malformed block. + + + + + An operation object that executes a specified action. + + + + + The type of operation represented by the operation. + + + + + The collection of children nodes that belong to the operation. + + + + + A list of the necesary input to execute the operation. + + + + + Creates a new macro operation node. + + The type of operation the node represents. + + + + Gets or sets the children nodes of the operation. + + + + + Gets or sets the input for the operation. + + + + + Gets or sets the operation type for this operation. + + + + + Represents the data types supported in a variable. + + + + + Decimal + + + + + Equation + + + + + Array + + + + + Unknown + + + + + No type associated + + + + + An object that contains information about a variable. + + + + + The type of variable. + + + + + The value of the variable. + + + + + Creates an empty variable. + + + + + Gets or sets an object representing the variable's value. + + + + + Gets or sets the type of the variable. + + + + diff --git a/CS-MIC/csmic/csmic/bin/Debug/csmic.dll b/CS-MIC/csmic/csmic/bin/Debug/csmic.dll new file mode 100644 index 0000000000000000000000000000000000000000..f707ec37ae65926b8d6863569d92d2e0101fe264 GIT binary patch literal 58880 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 I|DFW?3F%Cd#Q*>R literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/csmic/bin/Debug/csmic.pdb b/CS-MIC/csmic/csmic/bin/Debug/csmic.pdb new file mode 100644 index 0000000000000000000000000000000000000000..6a42ea89eadf78325ea4a810786efba38b1eaa14 GIT binary patch literal 173568 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 A*8l(j literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/csmic/obj/Debug/csmic.csproj.CoreCompileInputs.cache b/CS-MIC/csmic/csmic/obj/Debug/csmic.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..6d52104 --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/Debug/csmic.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +5775a073493428828d0febeeaa7c8078a54e5d15 diff --git a/CS-MIC/csmic/csmic/obj/Debug/csmic.csproj.FileListAbsolute.txt b/CS-MIC/csmic/csmic/obj/Debug/csmic.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..0286e20 --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/Debug/csmic.csproj.FileListAbsolute.txt @@ -0,0 +1,6 @@ +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\bin\Debug\csmic.XML +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\bin\Debug\csmic.dll +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\bin\Debug\csmic.pdb +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Debug\csmic.csproj.CoreCompileInputs.cache +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Debug\csmic.dll +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Debug\csmic.pdb diff --git a/CS-MIC/csmic/csmic/obj/Debug/csmic.dll b/CS-MIC/csmic/csmic/obj/Debug/csmic.dll new file mode 100644 index 0000000000000000000000000000000000000000..f707ec37ae65926b8d6863569d92d2e0101fe264 GIT binary patch literal 58880 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 I|DFW?3F%Cd#Q*>R literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/csmic/obj/Debug/csmic.pdb b/CS-MIC/csmic/csmic/obj/Debug/csmic.pdb new file mode 100644 index 0000000000000000000000000000000000000000..6a42ea89eadf78325ea4a810786efba38b1eaa14 GIT binary patch literal 173568 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 Date: Tue, 12 Jun 2018 21:44:10 -0500 Subject: [PATCH 06/54] Create LICENSE --- LICENSE | 504 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 504 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8000a6f --- /dev/null +++ b/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random + Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! From dcef431e12c7ad43327a92772b1d44ad34a8bdd2 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Tue, 12 Jun 2018 21:52:05 -0500 Subject: [PATCH 07/54] Updating Nuget. Updating Nuget. --- CS-MIC/csmic/.vs/csmic/v15/.suo | Bin 52736 -> 52224 bytes .../csmic/v15/Server/sqlite3/storage.ide-shm | Bin 32768 -> 32768 bytes .../csmic/v15/Server/sqlite3/storage.ide-wal | Bin 1454392 -> 2892272 bytes .../CSMICTests/bin/Release/CSMICTests.dll | Bin 0 -> 10752 bytes .../CSMICTests/bin/Release/CSMICTests.pdb | Bin 0 -> 19968 bytes ...lStudio.QualityTools.UnitTestFramework.dll | Bin 0 -> 98856 bytes CS-MIC/csmic/CSMICTests/bin/Release/csmic.dll | Bin 0 -> 51712 bytes CS-MIC/csmic/CSMICTests/bin/Release/csmic.pdb | Bin 0 -> 23308 bytes .../CSMICTests.csproj.CoreCompileInputs.cache | 2 +- .../CSMICTests.csprojAssemblyReference.cache | Bin 26492 -> 33341 bytes CS-MIC/csmic/CSMICTests/obj/Debug/build.force | 0 .../Release/CSMICTests.csproj.CopyComplete | 0 .../CSMICTests.csproj.CoreCompileInputs.cache | 1 + .../CSMICTests.csproj.FileListAbsolute.txt | 10 ++ .../CSMICTests.csprojAssemblyReference.cache | Bin 0 -> 33629 bytes .../CSMICTests/obj/Release/CSMICTests.dll | Bin 0 -> 10752 bytes .../CSMICTests/obj/Release/CSMICTests.pdb | Bin 0 -> 19968 bytes CS-MIC/csmic/csmic/Properties/AssemblyInfo.cs | 36 ----- .../csmic/csmic/bin/Debug/csmic.1.1.4.nupkg | Bin 0 -> 24963 bytes CS-MIC/csmic/csmic/bin/Debug/net40/csmic.dll | Bin 0 -> 58880 bytes CS-MIC/csmic/csmic/bin/Debug/net40/csmic.pdb | Bin 0 -> 32344 bytes .../csmic/csmic/bin/Release/csmic.1.1.4.nupkg | Bin 0 -> 22647 bytes .../csmic/csmic/bin/Release/net40/csmic.dll | Bin 0 -> 51712 bytes .../csmic/csmic/bin/Release/net40/csmic.pdb | Bin 0 -> 23308 bytes CS-MIC/csmic/csmic/csmic.csproj | 149 +++--------------- .../DesignTimeResolveAssemblyReferences.cache | Bin 0 -> 683 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 6564 bytes .../csmic/csmic/obj/Debug/csmic.1.1.4.nuspec | 22 +++ .../Debug/csmic.csprojAssemblyReference.cache | Bin 0 -> 2926 bytes .../obj/Debug/net40/csmic.AssemblyInfo.cs | 25 +++ .../net40/csmic.AssemblyInfoInputs.cache | 1 + .../csmic.csproj.CoreCompileInputs.cache | 1 + .../net40/csmic.csproj.FileListAbsolute.txt | 8 + .../net40/csmic.csprojAssemblyReference.cache | Bin 0 -> 8095 bytes CS-MIC/csmic/csmic/obj/Debug/net40/csmic.dll | Bin 0 -> 58880 bytes CS-MIC/csmic/csmic/obj/Debug/net40/csmic.pdb | Bin 0 -> 32344 bytes ...le_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs | 0 ...le_5937a670-0e60-4077-877b-f7221da3dda1.cs | 0 ...le_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs | 0 .../obj/Debug/net46/csmic.AssemblyInfo.cs | 23 +++ .../net46/csmic.AssemblyInfoInputs.cache | 1 + .../csmic.csproj.CoreCompileInputs.cache | 1 + .../net46/csmic.csprojAssemblyReference.cache | Bin 0 -> 8613 bytes .../csmic/obj/Release/csmic.1.1.4.nuspec | 22 +++ .../obj/Release/net40/csmic.AssemblyInfo.cs | 25 +++ .../net40/csmic.AssemblyInfoInputs.cache | 1 + .../csmic.csproj.CoreCompileInputs.cache | 1 + .../net40/csmic.csproj.FileListAbsolute.txt | 7 + .../csmic/csmic/obj/Release/net40/csmic.dll | Bin 0 -> 51712 bytes .../csmic/csmic/obj/Release/net40/csmic.pdb | Bin 0 -> 23308 bytes .../csmic/csmic/obj/csmic.csproj.nuget.cache | 5 + .../csmic/obj/csmic.csproj.nuget.g.props | 15 ++ .../csmic/obj/csmic.csproj.nuget.g.targets | 6 + CS-MIC/csmic/csmic/obj/project.assets.json | 52 ++++++ 54 files changed, 246 insertions(+), 168 deletions(-) create mode 100644 CS-MIC/csmic/CSMICTests/bin/Release/CSMICTests.dll create mode 100644 CS-MIC/csmic/CSMICTests/bin/Release/CSMICTests.pdb create mode 100644 CS-MIC/csmic/CSMICTests/bin/Release/Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll create mode 100644 CS-MIC/csmic/CSMICTests/bin/Release/csmic.dll create mode 100644 CS-MIC/csmic/CSMICTests/bin/Release/csmic.pdb create mode 100644 CS-MIC/csmic/CSMICTests/obj/Debug/build.force create mode 100644 CS-MIC/csmic/CSMICTests/obj/Release/CSMICTests.csproj.CopyComplete create mode 100644 CS-MIC/csmic/CSMICTests/obj/Release/CSMICTests.csproj.CoreCompileInputs.cache create mode 100644 CS-MIC/csmic/CSMICTests/obj/Release/CSMICTests.csproj.FileListAbsolute.txt create mode 100644 CS-MIC/csmic/CSMICTests/obj/Release/CSMICTests.csprojAssemblyReference.cache create mode 100644 CS-MIC/csmic/CSMICTests/obj/Release/CSMICTests.dll create mode 100644 CS-MIC/csmic/CSMICTests/obj/Release/CSMICTests.pdb delete mode 100644 CS-MIC/csmic/csmic/Properties/AssemblyInfo.cs create mode 100644 CS-MIC/csmic/csmic/bin/Debug/csmic.1.1.4.nupkg create mode 100644 CS-MIC/csmic/csmic/bin/Debug/net40/csmic.dll create mode 100644 CS-MIC/csmic/csmic/bin/Debug/net40/csmic.pdb create mode 100644 CS-MIC/csmic/csmic/bin/Release/csmic.1.1.4.nupkg create mode 100644 CS-MIC/csmic/csmic/bin/Release/net40/csmic.dll create mode 100644 CS-MIC/csmic/csmic/bin/Release/net40/csmic.pdb create mode 100644 CS-MIC/csmic/csmic/obj/Debug/DesignTimeResolveAssemblyReferences.cache create mode 100644 CS-MIC/csmic/csmic/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache create mode 100644 CS-MIC/csmic/csmic/obj/Debug/csmic.1.1.4.nuspec create mode 100644 CS-MIC/csmic/csmic/obj/Debug/csmic.csprojAssemblyReference.cache create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net40/csmic.AssemblyInfo.cs create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net40/csmic.AssemblyInfoInputs.cache create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net40/csmic.csproj.CoreCompileInputs.cache create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net40/csmic.csproj.FileListAbsolute.txt create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net40/csmic.csprojAssemblyReference.cache create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net40/csmic.dll create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net40/csmic.pdb create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net46/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net46/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net46/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net46/csmic.AssemblyInfo.cs create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net46/csmic.AssemblyInfoInputs.cache create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net46/csmic.csproj.CoreCompileInputs.cache create mode 100644 CS-MIC/csmic/csmic/obj/Debug/net46/csmic.csprojAssemblyReference.cache create mode 100644 CS-MIC/csmic/csmic/obj/Release/csmic.1.1.4.nuspec create mode 100644 CS-MIC/csmic/csmic/obj/Release/net40/csmic.AssemblyInfo.cs create mode 100644 CS-MIC/csmic/csmic/obj/Release/net40/csmic.AssemblyInfoInputs.cache create mode 100644 CS-MIC/csmic/csmic/obj/Release/net40/csmic.csproj.CoreCompileInputs.cache create mode 100644 CS-MIC/csmic/csmic/obj/Release/net40/csmic.csproj.FileListAbsolute.txt create mode 100644 CS-MIC/csmic/csmic/obj/Release/net40/csmic.dll create mode 100644 CS-MIC/csmic/csmic/obj/Release/net40/csmic.pdb create mode 100644 CS-MIC/csmic/csmic/obj/csmic.csproj.nuget.cache create mode 100644 CS-MIC/csmic/csmic/obj/csmic.csproj.nuget.g.props create mode 100644 CS-MIC/csmic/csmic/obj/csmic.csproj.nuget.g.targets create mode 100644 CS-MIC/csmic/csmic/obj/project.assets.json diff --git a/CS-MIC/csmic/.vs/csmic/v15/.suo b/CS-MIC/csmic/.vs/csmic/v15/.suo index 4bccefeb47da69976f3b5140b58cd8745a05dd66..865e0861e2ec261e5a73ab63d170b4c361538a32 100644 GIT binary patch delta 5340 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 RRVU4FiMwvmeP>AazX6@apF#it delta 7334 zcmeHMeNa@_6@PCR5Mhx8l#hUd#1BLl9OPyrDLMPsT6i=x63*j2%gh1&Rm zMr9ANeqhrqwoR<1-(PcO}gp=IG}@m9}ba(}tQ#E0kitXS<}nW-OvN6^(=gC({q2>Rk}m{ zkMEDKUAsl`(ffG=k###uUb(z`VS(yGRS->8OrcIkC>7;yRIg2T{i^x>xP6)F_Ozjt z4_3(r49#j6i>N()p=u(G3JsjXV7hEAIcD#1XILWSZT8S}BuD1(T(6+Z59r49z@1lFMn$%OYL43XqGo|n{6(xf)3(CowDTT~LLtYf!Oe}k- z<-Zs#`qn>KUVpkV%XNR}$z#BIi^!6h6^t`mNb=sux*)3VJo!8AjSwGe9-K}d> zN-8fa@)nuTh@L!!yX-=c$ud_@7t2nGX6jlrKU73t1*L^mGNmQOcz3xf>h9gKfTC(Q z&|iDP;xdFfp-pHJS_M1UHu&KU`;QRmOMLD0jm0Tq1;4o~@{|ZP)Uz`&QiZkunz_ zK)xRG^+F*AYDP~E3}Q#AP^gvP?3i~udSkr>=8|I0NbaxI22(B2T`rhldfS8aTz7`^ zD;5YFF@@0&SOT+G1?Vwh9%QJCEiK0kZJ1vp>>ZxFe{jyF9@GibUn=hHi*DxIv_OUG<)P|edxw14TJX~i?|d4pD{MDH=%G6iW{Vkx#c zi5gn2Qhr;!D9|(Zv!0a-T2j~GZPR%=R6xrS^>r`6|ZxBP@Y z-L*-&yORfX;Mpz85zmlq9gBE07V+*JA;S@NEaKtp8BHED7V*X+-Utzo^LWG(mva(+ zl&6rSPzCdMI03Qq3HN&AS0@yD2fk|*y~geH{x3sectAX*d3((C&aUYb&iTT8j@fL| z_IK`4(9o`CYVV%q%ChAc8VvO-HTpU!N29IRXK8A)3=NtbU6xkLl4@7h>-3zga6ZCU zqw!JX42bD1t@bsW>qy&ea6OXbK`B^2r)3deQaTey`x4^BYC5r38y1i*?M;XusdBE` zR@;!BtF_s(^|=|6B<0Yh1d0B+tD}6h8BqWQVv0E>EB2>k@O&vO%A0t(F{Y0?Zy#ei|0?lqfv*PBd#If{JgM|??^2SEq*BMxG;jBTS4Fy69Y%ec z6k2mA*7KrBZyd4SEl1r4{^j=cscH4c?SEUNKG?3CSJPCz;|87ZOpEHmzYjhcCkXBM zRvH;12)*=2Pcnb;?>C;q<~`KeKX5{%Kb0G)^V$-9I)`>f$sqp3K0f tIu-W$QF`q8XuA4hDy1ClRcxqzumlYpwNvB|FN#a}IKwypXqs`{`5#_AH(3Ax diff --git a/CS-MIC/csmic/.vs/csmic/v15/Server/sqlite3/storage.ide-shm b/CS-MIC/csmic/.vs/csmic/v15/Server/sqlite3/storage.ide-shm index 58f3d59d3e5056aeb62e0c651f1ca5e7155d3847..25383631b9fa9f168b687734d0b6bfb58f64206f 100644 GIT binary patch literal 32768 zcmeI5b&wrJ7scn^jT`Z7l(@UQySuwWT!_27ySux4AP^-4hlD^Njs!x2JKyOg?=ei~ zy}8-EuC1@CyXsf3r~6KyJEuEal|SZA_^mvaYS{rD(kS&z`q)cN{?^QYPjy_~7Z zyeb#sjaYwX;_+P7<}M9?%6PT5YDcl|-?sM8sAYA4sA}p5Ay(MqezeEG(eWGOaX;qc z-&pwd#j3ba^;Hf&J*5#F!~tAOpw3&;wx0kt1FKu(YgVkTpK4<_Mf<~Y*XabsoW}rD} z0a}7qpfzX%+JbhVJ?H>Bf=-|_=mNTeZr}y*BIpi!fS#Zi=neXSzMvoI4+emjz(7F2 zw})!)eEX&LLd~hOWZzpguhz1!F$mYrb=3VTC#7$nQ)k3Jr`EF1s~qg}_BnO0eLk}H zs+=NwuX?7)-uwTm>pMU8y|C|t+aCMo)tuWolkTxPuaVVNXViZ0U|bJzjH&!WF|O7f z>R8+Uj7oz+7zp+^SmkSvQ|E0M7!F1Nb-%jy_0{~-^zHZB`}TG0?YYFab;ilfYy!1xy9gz;rMJ%mlN*Y%mAR1@pjsumCIs zi@;*A1S|#1z;dtxtOTpTYOn^Z1?#|iumNlYo4{tU1#AV|z;>_$>;${OZm)7vCF}`_quP;We;k#cwr@8MR51!Q*H!ov6_PQE=)qeTTfPF92`SacT2z}Fx1I7X4 zfN{V$U>qqu^(U#hv*@?$3jH3{T`)JfBzaTHeOH_$Z$gt@Gd1+Wq%3 z$knG>oMKcoNr>tt$x)#q4XTp#rhfDi4RO&@Z>`H(>`3_Fy>d}2`;T=Puq(# z{Y;BfVWphizxE4|f+`qMxfN~38UO{6I_oo3NoT0o0wIw~gYL*;{us8Vnh z)dU_`KUvW!9wnvBl#2>cMXEuKs0Fp7p0tcsQXEdh88|cN;tC;gu9n!T*R?n$mXCPr zT^9YLmQ0JHM#fguvN(cz6z5S_;zQJjxQm(xKUjZQVHB4VQ!2_xIjI1Zpz>6my3+fyYK+B7#%v*j-lrmn9H!L zWhraFY00#dOdL_iwCIcFBdYt#qVH?GgfHNCEt!_~E${hzT#LS^tUsWezvtDtrzO*Ds3yA#m0%B}V(U3nUi|G#&}7E>HbL@6l)<)HjD4>e?SQ*kOs)o42v406H~1)1}D%E0pt15Y_--qGTeLnO$h zs<|p_e`v|Hj7%I+C$#8`p4&C zIw}?l5ZEZd_>;r$YH{jGoj@b1(y^@lsU_30GI2zm)S@qzkNB2>Ecy#AndXp*BdRVn zrk2#6deKfw8}xi92|6nlbObhbTnD~#D27@AG~s`6)yp+2x52NqWSYlK%5`j{SU-i9J#FrqmD}JI zai(r}Kl_;aev7QJ7N;u7#1Zvs6g#E9mLzN6Xvs9MOdL_8Xe>>j$ux~-(j1yki)bmW zpw*O#vpV)L+;J_I2pZTT=&XJ6surj03c>s8%Vx3`rp2ksGI2z`7R64f?}W+P11*{6 zlZhj07d_7vxh6N{_S~CC@HAe+n_PD$6epRKI|kIVT=!$+Un|CgAlRv3_wad)hi+X3mL^#hE(q z49)dq@iH;AIHkTTDQoAV*s1=qG!gYkOQr?I`g_ItCAc;>;ZEF-NApZx&Rh9N2zI%R OIMYwWnTnT0;Qs)%0$NxA delta 1034 zcmb7>Ur1A77{i*u&yXI4L478tLbU6ANF>+`onK7{_)&&!a!-(+(hBL;G8e z+Sy~)Qao{zn5b17wVV0;fl|=tW&Y~*n)P9v*+Q?{$Ns)j&|Am+rOso#F57E%y@;x< zY-g2XNA+Dk`wNYe!07;IIYCq|s}yvHm_LT{7X3Muzc^-1 zn7xuXxt(jv!*uT`1zk0R{JwzI#f6hu3iUn|89>Mm}VurKXqe_bhP-pl+-DH!dcSF(@&v{De+uh}lt-HslhRoqMKnoyQHg diff --git a/CS-MIC/csmic/.vs/csmic/v15/Server/sqlite3/storage.ide-wal b/CS-MIC/csmic/.vs/csmic/v15/Server/sqlite3/storage.ide-wal index f5e5e53d7f54462f1b69bdec3aa5a59b43ec53f0..b82d38e2c9fb1bbe15ef04baa59a52cc498ba0d4 100644 GIT binary patch delta 426226 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

o5LNT4sEoZyR2j>UkFvMCmhdbhpmELm_nuT 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 literal 26492 zcmeI54{#h+9mnsI?A^UfOPW&tmOr7b{A;-+P13)V+FqNq(uUG21#H@MbJ6yjq83M~BjESDFMHj~+bSt` zMrQVP?wfn>-uvy_x1aZC-|l-2g+rmx`*8eAH?9h@VWpY23U(n=Oe`*$+1|t&-5#(L z$%19fXjp4lwpqw8Xl_e1Cz=vXGa8bmY_Vh+3-U&(XzAG*4Xa8$Su=g1F}$WQVB{C{ zG__>fGP5(y&An|+dW){{U}yLrBQMCc?G7`PnY=mW_AHCyTmdiSa;W@28dWYee2pppOC>$bZrwdlr z>~YQ`esnL(61}K9#~~cWqi`}Km)|)KC1n(sZY~;m)^FQ6@;DqhbM%f(AXb?9P0q2# z<5(+ktV?XPFkM&Zec*UWAzjKD`J&y`VHTH_db-l~c{wxPl}w$ta(NOydZhN4`K~2K zPpMD(X>tN<5n&U@Q0gcXC{8__$Zy9|CQ*)qXpA?#TzM*5KUr8#TQr^Z&-um*Q=KdH z*5ETxrRQsUjX^tNv(>USt2ks>RhfJ!R8DqN!+tZ`l=Nix?NjL&XV@$cgl`A}3m!TAJsE!aPHsLS=%J5Fk#5L?%Nj60kJX z1g9{;sZ4O%=mab|HNojj&;W^?0jW3wOIb}Y1)*Xp6HFVOfLBCK@G&MhlL^imoq$(Q zO>j07oWlg?j!K~MN{{6tvzq_ci>zhx=t*ia`Q^QlOb!io2AvTvdv!Q0Vl&2a<$1}E z1eIe(>hnmCMl+2|A8UN-7tcH7i0KFrGbralA_<7+QiVk$Lz^JuE4qqEGlD`>bWw8Z9D)7b5gcJQl8HH#xs-X3dSXu(CDV>^XOuAZ z?9WGXaXw`Mq@J~dE=u$ryZk%$OxHIc8A~*B0c2dhVCBr-yq?Hs2O|p+Qp=EhChY`# z{7^uz6R^lllg|vuD2qKIPMj#Knv+3xiDS>8NFte7LRm^_r*u%3QI=CaLAel8&nit9 zWqtiH*K!4ti$YS32vJ;x=M7LHuPGIBa=u@+y&rIgDc%&+sg3SVlzj@ywV%O-6^hd4g(?heIjw!zqaF!tec zUtyC+h^&KL!Y+PZV`F1-UZXQ$X>Q z>e+SB)v&i11sL1yNcT$pQw0luOf+4QZs!J4bgwpsOb#oVGzQ10biDVZ8@Caj&N61+ z8%>UHKG=Qc?Adx-x@}hT+?H0OY0g}YUCu|W7FW5oxT=c%cTM>JrxNcBmoLwuJMa!8 zZ&+s9xf93j!^Y-y>&7zFnb9yh_WyROVf}h?#gYt1bZE@Ie~XJActslGx-eUx@D9Mp z7KowYuiy(?5LWwmoZ~>jN~Lia6M&WN```2qA9b+$Ktn{H-NRyi~(j|<;8H3mPVl^oh=6vDBul(>Gp+AH-)Nu9Jvu_9AwLir5W^u5mUxKrBE^BKA4ZFlhv_ zWWh5F8y7d?C-HfR>m+2B7qU$%WZMy4DMuy!E2#z(0ESOHiPtUEx%VLHV- z@ss!}#B~y~jb6yQRmko}bd8Vd1IPl%BxGL$4HXk!_aH#r3vr!9>yuuzE?3dIAJMfW zBtR=bOQQ7vXz+B5-+)(q6XH4v)*3HZDHW^-5nWpX3BU@#l3;xcG?WMO55Xh84RM{s zs?&?rN)@Y}h^{S#1Xu-FNvysD8tM5DOL{gL7Y`#`JOXi@By5?Nunv{5?;*O@ z4haYg2$O_;A2d`9wjM=*_yNRq60OBvv=*soJ%;ES-!~1=3eb{h{RlK1J2Hd1#?tdP z7IJaLN?bgSU&N0gu9J+N?`3Sh%GeW#t}TNEj0KEI#(oAG)F;?aB2+vDah>FAmY1(K zm9Jfht}TZId63;_iCm}o63)wj;WP1=@<8q$>vH&s(*{?xEZTX?L zWyHmc2oWzqTqoI@=4ETD%GS$>uC0IsYz1sdwtfp5JaenBz$^AbTqnUg%?sA4Dp;=~ zy0#J$fE9ox!TJMea2qYY>=hTUAw;|mah+uAL@!$>sBHZS(X~!Uz*fMPWa~}PP@cEn z2anhfah=3!q8F=r6|27>x^@vHz$(B>V)a+h;5J#@jwvnww_L$=lgYz1tA0oiQT0SR~0 z(AA}U(aaeMJohp6thvS6jVUfB5Vm>+wzs^n?N?!&gcNmaaiF`LgH6NsG223+FToSx zq2XVhTGSk>0pa*J+%fURRsHif+;`U#-#svC&mZr&plkcJFX;0N7q%aKqtN_TYy7V1 z7fp)q+1mBYyPI}*Ox=HZ@>fqkld5lPnP+!A{rhy?ZQ(ype6B6IFWG+8qz9JlE>7!D zXMeKeohgsLzxVVV57<*4oH_Tv;-yzUeD2Wr(yrV0ZJ+kTj{Wyeej)$bPZy4_z4E5I zOOdA-K2@zd55B#ye#%YZ%iwFohiA@@h7X;#9ujo?LB}s^&~aeHGom~mUU33>8F8{{ ze#2W^URP_&$w;AXK#~Bg04xdCWFS%5?Vm!nPF2|YotLe>Dq9U?t2G3V2@wTT7^YS5*Udx(3Rp!1ap02JZGXaF1)CdLCVt~)neRIIa<|+q#SXy}sd~)h*fDcGj0|yiXd_3lBfKS0x1MesX z_#njB0H1fL2HsN)aKhWy0Oz$;1DwgMECWt!`WoQurD}lFRh0%fcjaqH$T*Htlpj-mgCxu`s)6He1E<#-`CqS)T%aHjao7Xm4V8#N`HTOpwC=v8Z2ynd>O-s+@@67;qdtQlm;ZEBe1^=7Hra5C-hlO1Z*CQQe2=23L0 zQMRsf8k2U}av0Pp-vs#2(wMKneapT%`#cfu_a;$pE8gyN&hU;ay#mOc4zA3r9l#^=t ztx&d`xT1}!o4>klH@91Eb3J^q4m6zce7Rap^URtja55;aCsbbGc`*b5P#M?3G6l z$n4c9;%XOlMe%^S2W+ivlv*{b-gJwX+szHFv0}+xShGvTq2Yy_Hx6No8`6&1b>LaG zOxG&bt>%(Gx!?2t6iAQGg7-DI)Nrb{B#bxXEMEGxX4CY(Oc%;&&cc^z-!NV|G{aVN z-NB|+XEh)pn1_FvuMtyc^%C;H0RQs2V?NqOM(h2@*I?>*Lx~m!iw1Y#LBOu)+l%4XFO%r zJImIDn|As9at)_BX*sD%9nYuEbTT2bz0;M4_u|=8&bKSaLt9X<2A7NvxBN^F*fqjK zk~EvdJ8vF(_*m9^n4XUv;tyzgVAAtpa+8bj5FhAUwrE+x;HjF0@0?1d_?BA8_VfRjg7i?Rnn16{+4Q!Q`=9Kc6*tX%ZtDI@zD3b)vjC?Vu#4n6kyVQFgZ5g z2{y$&0=OK8gXD^ir76mrEFYg1p+@Uq<(r z)BP3G-RHCK)$aaEx_>F%Up3u*KDB4V{g=EsfqE9 ziScF!+D=BLYVL6}rHPj5l=d>u(8g5B&fvq|!Rj7?EMA|xnJuB`K8Bt{X52b7VcL#i zy2DK;W4ps_Q{{N%L~9Tt!mia?Uhp96ST%EE!YU_{nGE9x=-VgJWI+|1Or@sPd)aI< zI}n_xa5HzRV;eN%Hc0mxj@{f_TlI2}YS*yx3)y2f``yW8^7F|+U@8J~xmC9uyW~Ye z(9C~p|E^s#X({&hOwawwhI&Ru2$t6xO<#sj15?G#Ai5xiaHv>Ivkrz=#{0PuA3DE? z=+((x5Nc#58O|9UO=LR{L+o!L_M2U&h$c%&Z-Dt^k{yASg+gIyWg#YrQwYvWG>B7R z5Qhf@L7YN6h*Llirw~L{rr0a+nL8yn(;!YRy%Fvn3f!5=@uAqDS7n?`Y!HQuD_}D0 zrg&GGv9HbZaD6}-?|AqcG%WN57*Lu&;YTEkY&F10N}Yp685&|1L@t;ziio8;0Zl(EXo z9lDbdx2CDR<(-ba~XC4eiJ0iI9ymX=;I{1*_mMKWdC8>vzYg6dUUh7ui@Z7 zyUzc-7Zzf4n>A@O+{Ht)NX*KF^Xa7w8}pu<{D0kN&Fx_mlGiBKR^u$lHK0JiO#q~6QMDsS9 zx5IR=fnn-mL*Y*Rq!Jgx{lkgGpJF4;`w!dOh6no-_+Cl;%Y6H}oe$mn=r2B=zv=F- zd!Ik$-;O`O@97V{=YKmUtAD)d=q=}e?$Rf3d-T|k9{llbk1RcXe(L5q&Z=h*fB43S z9zQVeLto1rc*}z0i%z}eDdXuUj?aJKuKzgxOu4ve?vV%YIePKPSnu6d?|ILCZ*_B| zvGAwQ+_3vIT@T&5`l55+ciND3R!{ALBTF`4_sEg1weTs6pVVj9jNaINEVnYb4qJqr z0fBHb_&ogmZ2a-5q`Y9u4w(~X32j%URiV1{z4Pm^Q<7Lbawoi??q5Z+&lm7Sh zS%uIjyhk@@_$YoO?tt-=WbCbB#zs}fK8EbZRv68gW=t~nanKOz zFMa}>;w~6JNwBU9gLSP6)~Ar&;A;R4mIh0L^=Z&>TBu>4AKqWZFvXm>8@~|u!1zfb zwmpp4u!`8d$Zqf@lSWJw zKWvp+7}9wtC%%ro;u|o2l6)-<^EIII^)Rv<9L}Zr(tJt2{t-0zv3jqY_)pj&z6s+e ziB?}2t%8cyBgk%Wkf26Oqb1S$4ruVJt}U2^i}B)aPJ9=8#W5H^Nxt3~=4*k<*Y}a# z;IL86m*z|I^(bfvHRXSRP4Pn*KS{7I41;xn3f51M-Pi@A!O~z!u>Kh|oFKmS7=9%l zhw+ny?EElf=c$lAf$Ro{x@*WZWD>HUf`&-L>tC@$JPG3`iPl+Rw9Zt~dJ5UQcDIj7 zB}egzqj{6J<^QQ?1*z0<<%b*t?C0yzx}MuVln zl3+ap8vJpEoY0#S|A{@~moR>kY|Ra`HAiLZzmeVGR2oSV^p&2MwWT;S1Ol-V6X{;nx0!VaEUnyZICvqfg z4ve2<#r0od!hWd|b}9+uG+j-YCQK661tcP|iFrh;TS4pJ!)X0nMe7WrHKEb+77NnT z8S%_ZzXnM7W9zp&X5GbV$Xp&YCtgd&&QusX9%k%Gm9f{6vHhAc%@`Pv)z>*dLVfXg zF8Ml7;p<<*d_Au6)kD4<&6nmY;A=jRIJ-S2XI;H%ITMcUTK;O+Iq`auc7a0LkHVz= zP$lgmlICjCG-&~8ZvYY}coTUsAzPq8_PsD<$5hCA30YG^rXdR;TL>hgA^SYpDkyAy zE6mn6Rkjw9Ew03*dy={*DVt)8fkY^_x`bd2C}90V7_4uoU@a$DlNu~tX$6(m3LxQE zT5|o8m1OHug{_CeY<*Q_>rG_qfM!dx6|l7iNCa{FHxsKt1*^XcWA$YftF^@HpvFpL z6=1avNcdHj92&8nY+bIf_19sx?pN8mf@~eqY-zRvwyp#cL6xR`&6v1 zB34}HR5#ys^IbOIw*rY!^L-n^8dkvi%P?5?s9^0NSX??+gQdZeVC@7FkvELj5Upz! zwEiND)?F%EMWXdKjh22C29LrKAQ5e5?Iv5J3R`!E*}6kzYm97hoo`)j>1s<>TO}aj z|K;6nt$Ne0SzH~?#^0#D-ut7IIZ-BT-X9SLIZSdC&TV1Xj;gTjC2Th!`%G3Q$1#bs zN_czDzZbmCYMRa-82nx0_4uX_0ZjBZAh$3+G zL;|_ z0$j3772wiLomtImt#@|zTgW4Ux6#~#CpJmcT|BdDFR%1C05{pSb?u70$gJw zR)9-ss2+UX7YNP)7g2~6;93c)0B6TXuL7sa#|m&pyeh!y&rt!+g^m^AlxJ0d(_Eth zobwth@RL}9$9#d{96Wv^fhS@GI8iO?0cWkndhk@N0B0LT1vvF6R)8~%f^)#?k*SMQ zN}>XsUlJ?8X(XxuCl5pgIFle&fD;B(ffp13ju?*>;K1-eAh?}5960I$#|Fm=a0sv} zz|o$bKyVp3^pgTP{Df1IBRo|Bj_HefzyW@-9&j9=D!>6-Q2~zLiWT4>EmeRca-sqp zo)as;Q8=mq2UZRRPAU zq5=$F#R@P+6$k`36XOz50R|~z1sID^1=#zH3a~30E5IJ7D!?vARDk`BSOIn`Q~@>{ WqXKM0#tN{hs0bu^G6+R-&i@0Mhu=E@ literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/CSMICTests/obj/Release/CSMICTests.dll b/CS-MIC/csmic/CSMICTests/obj/Release/CSMICTests.dll new file mode 100644 index 0000000000000000000000000000000000000000..129f7529782d568c03ca46a2a30fb7884d9686cd GIT binary patch literal 10752 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 literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/CSMICTests/obj/Release/CSMICTests.pdb b/CS-MIC/csmic/CSMICTests/obj/Release/CSMICTests.pdb new file mode 100644 index 0000000000000000000000000000000000000000..03f947d4935cbe59d52dd4f0e6b91f065c780d99 GIT binary patch literal 19968 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 literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/csmic/Properties/AssemblyInfo.cs b/CS-MIC/csmic/csmic/Properties/AssemblyInfo.cs deleted file mode 100644 index 842b681..0000000 --- a/CS-MIC/csmic/csmic/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("csmic")] -[assembly: AssemblyDescription("A .NET component for easy access to parsing simple math and scripting.")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Jordan Wages")] -[assembly: AssemblyProduct("csmic")] -[assembly: AssemblyCopyright("Copyright © 2012")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("e36b7d85-f0e6-4f24-ba03-ac53124dd97e")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.1.5.0")] -[assembly: AssemblyFileVersion("1.1.5.0")] diff --git a/CS-MIC/csmic/csmic/bin/Debug/csmic.1.1.4.nupkg b/CS-MIC/csmic/csmic/bin/Debug/csmic.1.1.4.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..881606c81d8b79a17ac6acc873e5ab91277bd1be GIT binary patch literal 24963 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 literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/csmic/bin/Debug/net40/csmic.dll b/CS-MIC/csmic/csmic/bin/Debug/net40/csmic.dll new file mode 100644 index 0000000000000000000000000000000000000000..c8b309662a758a711278ea3c2f89d12c9a1b3dd9 GIT binary patch literal 58880 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 C^5kLw literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/csmic/csmic.csproj b/CS-MIC/csmic/csmic/csmic.csproj index 3e1cbe5..67d0899 100644 --- a/CS-MIC/csmic/csmic/csmic.csproj +++ b/CS-MIC/csmic/csmic/csmic.csproj @@ -1,136 +1,23 @@ - - + - Debug - AnyCPU - 9.0.21022 - 2.0 - {7BBA4BA2-E885-4D89-8710-F1A609616B7D} - Library - Properties - csmic - csmic - v4.0 - 512 - true - csmic_open.snk - - - 3.5 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - SAK - SAK - SAK - SAK - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - bin\Debug\csmic.XML - AllRules.ruleset - - - pdbonly - true - bin\Release\ - - - prompt - 4 - bin\Release\csmic.XML - AllRules.ruleset - false + net40 + 1.1.4 + Jordan Wages + None + CS-MIC + true + false + Copyright © 2012 + https://github.com/wagesj45/cs-mic/blob/master/LICENSE + http://cs-mic.com/ + https://github.com/wagesj45/cs-mic + A .NET component for easy access to parsing simple math and scripting. + math parsing scripting - - - 3.5 - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - - "$(ProjectDir)\coco.exe" -namespace csmic.Interpreter -frames . "$(ProjectDir)\InterpreterParser\CSMIC.atg" -"$(ProjectDir)\coco.exe" -namespace csmic.Scripting -frames . "$(ProjectDir)\ScriptParser\Scripting.atg" - - \ No newline at end of file + diff --git a/CS-MIC/csmic/csmic/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/CS-MIC/csmic/csmic/obj/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 0000000000000000000000000000000000000000..28e76cac28d26e697fe727890dd40c59cd530c05 GIT binary patch literal 683 zcmaJfgc5Z(Bzj>{o;IJgoAP@|Qt5GY6yYOO|8EvS&FTr8xGJ*HOH-fCx^w)_un z{3QMf{0G=cO92tFlApc1Pcv`cGwU(Ne%M8CTK60aA70mmR;Vh&54u{Gd@gW_JX0Em z@fm2WRXa(?Jmm>bhH=(O(`lHr&>1b{Fh1=TvM!F{dajnxP8P|i8duM%G%d%87zv-6 z?QHHbyG8@e%m@R->Q}Xd_0D~8b7fUX35Br|kiQamZp1B;R)g|bV4rcWy@a#kwoC(_qW4My^em>dbmOJ z(LeRSzukLD!$uK_?|THkg#mrhMG#n!*^Ast`lv+{PpvB$Kf2m``Z#|F6=-M+i1!hp zvCaeLcjo3(%ZE#)mpOlPIRCv{J>f}yEAKrl_~Dg-mV!lIN;#nZ>j20upJ4Z{=3hU> zAA#+XtaVt#cNf>C+4fI~R>yS! literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/csmic/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/CS-MIC/csmic/csmic/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000000000000000000000000000000000000..80d1f9f81df852a51df57e24f77b5600a1c498d6 GIT binary patch literal 6564 zcmeHMZBH9V5VpZ=FeE9aDIw6LPMfMpYEHO7fJl5uYzS6Mglvbl;w-Xvw>BH@Zmr!t zjEnd!{RLHjVmouTkJr!&oh3f_kmvUH<=MH}ncHWUL^6>``~w%>@wz(%!r9`s6iU>! zvBOnB-HHwzE{uZkJmHs$>$&U>lZp#}Ex%;U<6kaY2wWXVw&t@yOX}vb+kxeB`)Ag! ziUa1aS@R3^rTTI`pLdq#=>i?WDOWx-)7yZ%4$fEdHIt(GtE9~)lSY}!lHUxpdIWtE2j|*0gzLcjKEcW=l?|q&VU@sAOuq*Z^^7-sAz6{tDVU<OyeUN;EQD`0 zDOrOnE!(F9((q!Mp$TUI=&Ui$%rbSMX-oM0fXSyS~z~#C_m{SgX%{|r~auKOxB{dx=R%Uf3nGaAKQg{IR36So~UTtU=GDL<6 zNhF3r4keRG0zZ(6p+83|ZKat9?g{H_Yjil{9rKyww($!X>tlX*_nIyc5j)fk*f!<=f8e@z9JH(ck>5{$lD!;n0$mUm8Yq{(6xTUK0!w$80&3en> zlF5OK_QQ*!XzB;}E%&LI18Cr&{qUiIgT}RS){@AB)59Rf(kU#Cpa43MNZ$bgw^0;n z6k{mHL5z{RAQR*sh_}b(E^~Ta0V3U^l9>_NHI4V{)rdpp4q=DS^$2K}Y_1=jko$n+ z6<(Vk6tGXTMH@_+MPUaX^R+VHalIK>rmf~YZkvV5+*YXoPx#Q0!un(unH4lZD&U<} z;6`PpgnJkf;Zq`H*wo%<=`T?K2@o^qRqXM7RF!0)eFEFF(K}=p$t2XK!uBt*h&VTm2F44NLzOOWqx-rN+S zLH0zG`G)cj$PA$Uc5}2aDQQXusmV5#usCMtX4Em8AhUq}dz|PMNML|ocHzGU_{z=U zE4JiKeU;vi0k|3y@OhP=#EOji164MtZjf&P`NPe1zPyr!3WQMzodxJUfQIy-0qdF# zlg8}xqm@@L%qVWM-LQqk>P&b?VR1gtO^gJyNAN>ee+rXWeV8Q5KO_t1`4;A>^=}@C z+7x~v2mAV9Uyn6|jhhySyUre*9C&JEPw_w4=-y%HC<|KtPDNpJIkO+6?Rbdy*%O9- z_N1u{|i{7hwK0V literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/csmic/obj/Debug/csmic.1.1.4.nuspec b/CS-MIC/csmic/csmic/obj/Debug/csmic.1.1.4.nuspec new file mode 100644 index 0000000..2deed10 --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/Debug/csmic.1.1.4.nuspec @@ -0,0 +1,22 @@ + + + + csmic + 1.1.4 + Jordan Wages + Jordan Wages + false + https://github.com/wagesj45/cs-mic/blob/master/LICENSE + http://cs-mic.com/ + A .NET component for easy access to parsing simple math and scripting. + Copyright © 2012 + math parsing scripting + + + + + + + + + \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/obj/Debug/csmic.csprojAssemblyReference.cache b/CS-MIC/csmic/csmic/obj/Debug/csmic.csprojAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..af5abcb9861ce75ae07b4f70b84030ae13467d72 GIT binary patch literal 2926 zcmcImOLN;)6qfvub(PR0P#&cP9Ow+~G-zznw4pRpQcu!mpqWxnjgT9AHl9HU;ztQ&;=~Y0ygaFe}MBzR%$gGhQRdB_|w(#x!-x*bB?X3ilY2Q z3s0=s62T`oTw8=P>__I+*!3K9$C5*7wnD*|>bqP>Hw@OAD`wMdn2n`+EB2yT@U?)) zk+8g_`pvlKx%T^fyb}(2u-0oV_gDHC`^~1a(y*4TDvT`_+h~tv#Qk<;MI2hJ?|M9W zE1ycgA}>6T+Yz}S&FhvNL{`t^@S2qgDu91ft&xK9L1;OfmK}wnHi<`Xh5pDAT+D;C z6*~N;2=`rw3mt;CdzV)zBB||KUd*MUl*>xBI-?ia+RC_27x=t&i2u=tt5+)U%7AYS zTUI5Q#}4sm8bPmhsY5R93CpiXFIoep9>z?yuL0a_bKySb`Fx;*(81b zSty1bb9-aw@!S4+v(Y(lPjJ)mJPr1{Pr;5a?NE4bFEOH%k=swf$RrqwV;7>-oA-%~C`6&CLQ=!kWWCaz6kEAA1l(H(KeJ)D2o*~eV;T`v6E;p8& z?UZdlz4p<~uK%TLxNX?Ph;7D~~$@T3@K$TM(4a=ip zRHmY<_C0G)*6dMi33~vY)>g@OYqS}xdwYyjk_i;)HqEh~C3$Vg$0N%XRZF%bQFCP* z#c1H@-2P)O)n6 z{7%1b|IJHuLTw)dzuQ$Xx0K3nME3uj&v7O_Z=kUa6@7y$QMES-wKPKpJ3}w*EJ3!C zsMKG{5kv;5`j9s8Y?=-on9?oLZf=tBHn(HCfw95fA}KQovX%1wGR^yQ0WX?5j|pgLb*ZZjyjq%lPP-Qhq&6dH*ow96ADZTe^R@vwPzFAD>sy9#3>J{$^<18`h_x zpodEnRO=@H`&joD-*@qAMH-4u3#!v=4#k->prTS?xT$6sqD1^S +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("None")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyCopyrightAttribute("Copyright © 2012")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("A .NET component for easy access to parsing simple math and scripting.")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.4.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.4")] +[assembly: System.Reflection.AssemblyProductAttribute("CS-MIC")] +[assembly: System.Reflection.AssemblyTitleAttribute("csmic")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.4.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/CS-MIC/csmic/csmic/obj/Debug/net40/csmic.AssemblyInfoInputs.cache b/CS-MIC/csmic/csmic/obj/Debug/net40/csmic.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4b2a50b --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/Debug/net40/csmic.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +0ea9b979dda5a9e32efff5e2f55623df53fb1778 diff --git a/CS-MIC/csmic/csmic/obj/Debug/net40/csmic.csproj.CoreCompileInputs.cache b/CS-MIC/csmic/csmic/obj/Debug/net40/csmic.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..fca1ddd --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/Debug/net40/csmic.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +a5e8f94baf8d8768320eb6d870d6fe889b53b39f diff --git a/CS-MIC/csmic/csmic/obj/Debug/net40/csmic.csproj.FileListAbsolute.txt b/CS-MIC/csmic/csmic/obj/Debug/net40/csmic.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..729e9a8 --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/Debug/net40/csmic.csproj.FileListAbsolute.txt @@ -0,0 +1,8 @@ +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Debug\net40\csmic.csprojAssemblyReference.cache +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Debug\net40\csmic.csproj.CoreCompileInputs.cache +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Debug\net40\csmic.AssemblyInfoInputs.cache +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Debug\net40\csmic.AssemblyInfo.cs +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\bin\Debug\net40\csmic.dll +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\bin\Debug\net40\csmic.pdb +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Debug\net40\csmic.dll +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Debug\net40\csmic.pdb diff --git a/CS-MIC/csmic/csmic/obj/Debug/net40/csmic.csprojAssemblyReference.cache b/CS-MIC/csmic/csmic/obj/Debug/net40/csmic.csprojAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..0944e8ca63ff780c9abc3d0574e0c286e6c1f5e6 GIT binary patch literal 8095 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 ZA)F0r`(+=(Z*jxrn~+_mzZXOQ{{S#D +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("csmic")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("csmic")] +[assembly: System.Reflection.AssemblyTitleAttribute("csmic")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/CS-MIC/csmic/csmic/obj/Debug/net46/csmic.AssemblyInfoInputs.cache b/CS-MIC/csmic/csmic/obj/Debug/net46/csmic.AssemblyInfoInputs.cache new file mode 100644 index 0000000..952fd2b --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/Debug/net46/csmic.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c9f038d5c3969ac143c7288bb74ddd78a58b070a diff --git a/CS-MIC/csmic/csmic/obj/Debug/net46/csmic.csproj.CoreCompileInputs.cache b/CS-MIC/csmic/csmic/obj/Debug/net46/csmic.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..ce41294 --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/Debug/net46/csmic.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +f925bdaaece993086be5b4f2ac93432cb385fcbe diff --git a/CS-MIC/csmic/csmic/obj/Debug/net46/csmic.csprojAssemblyReference.cache b/CS-MIC/csmic/csmic/obj/Debug/net46/csmic.csprojAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..add48df531cab0ff7e9948f6ef258d93639490d5 GIT binary patch literal 8613 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 literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/csmic/obj/Release/csmic.1.1.4.nuspec b/CS-MIC/csmic/csmic/obj/Release/csmic.1.1.4.nuspec new file mode 100644 index 0000000..4213247 --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/Release/csmic.1.1.4.nuspec @@ -0,0 +1,22 @@ + + + + csmic + 1.1.4 + Jordan Wages + Jordan Wages + false + https://github.com/wagesj45/cs-mic/blob/master/LICENSE + http://cs-mic.com/ + A .NET component for easy access to parsing simple math and scripting. + Copyright © 2012 + math parsing scripting + + + + + + + + + \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/obj/Release/net40/csmic.AssemblyInfo.cs b/CS-MIC/csmic/csmic/obj/Release/net40/csmic.AssemblyInfo.cs new file mode 100644 index 0000000..cbad0c9 --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/Release/net40/csmic.AssemblyInfo.cs @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("None")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyCopyrightAttribute("Copyright © 2012")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("A .NET component for easy access to parsing simple math and scripting.")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.4.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.4")] +[assembly: System.Reflection.AssemblyProductAttribute("CS-MIC")] +[assembly: System.Reflection.AssemblyTitleAttribute("csmic")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.4.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/CS-MIC/csmic/csmic/obj/Release/net40/csmic.AssemblyInfoInputs.cache b/CS-MIC/csmic/csmic/obj/Release/net40/csmic.AssemblyInfoInputs.cache new file mode 100644 index 0000000..b138ad9 --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/Release/net40/csmic.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +b9c3515eed0a5638d6a5b8c4e0d7bb5f37b7c757 diff --git a/CS-MIC/csmic/csmic/obj/Release/net40/csmic.csproj.CoreCompileInputs.cache b/CS-MIC/csmic/csmic/obj/Release/net40/csmic.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..fca1ddd --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/Release/net40/csmic.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +a5e8f94baf8d8768320eb6d870d6fe889b53b39f diff --git a/CS-MIC/csmic/csmic/obj/Release/net40/csmic.csproj.FileListAbsolute.txt b/CS-MIC/csmic/csmic/obj/Release/net40/csmic.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..4801eac --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/Release/net40/csmic.csproj.FileListAbsolute.txt @@ -0,0 +1,7 @@ +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\bin\Release\net40\csmic.dll +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\bin\Release\net40\csmic.pdb +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Release\net40\csmic.csproj.CoreCompileInputs.cache +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Release\net40\csmic.AssemblyInfoInputs.cache +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Release\net40\csmic.AssemblyInfo.cs +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Release\net40\csmic.dll +C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\Release\net40\csmic.pdb diff --git a/CS-MIC/csmic/csmic/obj/Release/net40/csmic.dll b/CS-MIC/csmic/csmic/obj/Release/net40/csmic.dll new file mode 100644 index 0000000000000000000000000000000000000000..038b76863944a92fc3d2a5071f922b7390a41106 GIT binary patch literal 51712 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 C^5kLw literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/csmic/obj/csmic.csproj.nuget.cache b/CS-MIC/csmic/csmic/obj/csmic.csproj.nuget.cache new file mode 100644 index 0000000..597ccad --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/csmic.csproj.nuget.cache @@ -0,0 +1,5 @@ +{ + "version": 1, + "dgSpecHash": "no1TIMbiu1fAXDTJGQ+TSDr5uOTLrmXNFCHSDYCotG8EIO5hC54bP1rMUbPWN+A9Fd4WjYcTSheJw73W11vQ6Q==", + "success": true +} \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/obj/csmic.csproj.nuget.g.props b/CS-MIC/csmic/csmic/obj/csmic.csproj.nuget.g.props new file mode 100644 index 0000000..df5bafa --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/csmic.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + C:\Users\wages\Documents\GitHub\cs-mic\CS-MIC\csmic\csmic\obj\project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\wages\.nuget\packages\;C:\Program Files\dotnet\sdk\NuGetFallbackFolder + PackageReference + 4.7.0 + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/obj/csmic.csproj.nuget.g.targets b/CS-MIC/csmic/csmic/obj/csmic.csproj.nuget.g.targets new file mode 100644 index 0000000..53cfaa1 --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/csmic.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + \ No newline at end of file diff --git a/CS-MIC/csmic/csmic/obj/project.assets.json b/CS-MIC/csmic/csmic/obj/project.assets.json new file mode 100644 index 0000000..971c66c --- /dev/null +++ b/CS-MIC/csmic/csmic/obj/project.assets.json @@ -0,0 +1,52 @@ +{ + "version": 3, + "targets": { + ".NETFramework,Version=v4.0": {} + }, + "libraries": {}, + "projectFileDependencyGroups": { + ".NETFramework,Version=v4.0": [] + }, + "packageFolders": { + "C:\\Users\\wages\\.nuget\\packages\\": {}, + "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder": {} + }, + "project": { + "version": "1.1.4", + "restore": { + "projectUniqueName": "C:\\Users\\wages\\Documents\\GitHub\\cs-mic\\CS-MIC\\csmic\\csmic\\csmic.csproj", + "projectName": "csmic", + "projectPath": "C:\\Users\\wages\\Documents\\GitHub\\cs-mic\\CS-MIC\\csmic\\csmic\\csmic.csproj", + "packagesPath": "C:\\Users\\wages\\.nuget\\packages\\", + "outputPath": "C:\\Users\\wages\\Documents\\GitHub\\cs-mic\\CS-MIC\\csmic\\csmic\\obj\\", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder" + ], + "configFilePaths": [ + "C:\\Users\\wages\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net40" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net40": { + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net40": {} + } + } +} \ No newline at end of file From ae51396d2c6bd75ff35a40ca040e6dc3bb2ccc37 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Thu, 14 Jun 2018 20:39:32 -0500 Subject: [PATCH 08/54] Update README.md --- README.md | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index fd65d51..ffa89a9 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ CS-MIC follows a few basic rules when interpreting user input, but should prove ``` while(bool expression) { -CODE BLOCK + CODE BLOCK } ``` @@ -94,7 +94,7 @@ CODE BLOCK ``` for(* expression, bool condition, * expression) { -CODE BLOCK + CODE BLOCK } ``` @@ -105,11 +105,11 @@ CODE BLOCK ``` if(bool expression) { -CODE BLOCK + CODE BLOCK } else { -CODE BLOCK + CODE BLOCK } ``` @@ -138,7 +138,7 @@ display: “string”, 12 * 2, “string”, sin(12) ``` function(newFunction, anyArgumentName) { - sin(anyArgumentName) + cos(anyArgumentName) + sin(anyArgumentName) + cos(anyArgumentName) } ``` @@ -162,23 +162,23 @@ y :: 1 echo: y for(x :: 1, x < 11, x :: temp + y) { -echo: x -temp :: y -y :: x + echo: x + temp :: y + y :: x } x :: 1 say: “While Loop” while(x < 10) { -if(x == 5) -{ -display: “The condition ‘x == 5’ has been met. x = “, x, “.” -} -else -{ -echo: sin(x) -} -x :: x + 1 + if(x == 5) + { + display: “The condition ‘x == 5’ has been met. x = “, x, “.” + } + else + { + echo: sin(x) + } + x :: x + 1 } ``` @@ -214,27 +214,27 @@ The following is a list of the internally recognized functions in CS-MIC: `sin(double expression)` -Returns the sine value of a given expression. +Returns the sine value of a given `expression`. `cos(double expression)` -Returns the cosine value of a given expression. +Returns the cosine value of a given `expression`. `tan(double expression)` -Returns the tangent value of a given expression. +Returns the tangent value of a given `expression`. `round(double expression)` -Rounds an expression to the nearest whole number. +Rounds an `expression` to the nearest whole number. `sqrt(double expression)` -Returns the square root of an expression. +Returns the square root of an `expression`. `abs(double expression)` -Returns the absolute value of a given expression. +Returns the absolute value of a given `expression`. `exp(double expression)` @@ -242,9 +242,9 @@ Returns the constant e raised to a given power. `log(double expression1, double expression2)` -Returns the log of expression1 to the base of expression2 +Returns the log of `expression1` to the base of `expression2` `precision(double expression1, int expression2)` -Returns the value of expression1 to a given precision. For example, precision(12.3456789, 4) will return 12.3456. +Returns the value of `expression1` to a given precision. For example, `precision(12.3456789, 4)` will return `12.3456`. From fd18b5533d8964672d1ea10f2b3d75e7339d5260 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Sat, 16 Jun 2018 22:37:20 -0500 Subject: [PATCH 09/54] Create CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..afec3eb --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at jordan@jordanwages.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ From 61a28fc5cd7ea056db2cc4d25ae28e7f5a2ece70 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Tue, 19 Jun 2018 16:31:25 -0400 Subject: [PATCH 10/54] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index ffa89a9..5b913d4 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,10 @@ CS-MIC is a .NET library written in C# designed to give developers easy access t *** +## Installation + +For your convience, CS-MIC is packaged and distributed via nuget. See [our instructions on how to get started](http://cs-mic.com/adding-cs-mic-to-your-project/). + ## Usage CS-MIC follows a few basic rules when interpreting user input, but should prove to be fairly straightforward for most developers. While CS-MIC tries to ensure that the order of operations as far as it knows them (parentheses – powers, multiplication, division – addition, subtraction), there may be instances where formatting fails. If this should be noticed, please [report it](https://github.com/wagesj45/cs-mic/issues). From b56158b7ed86cfce6a258ce45632d8698bf793ad Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Wed, 2 Sep 2020 23:24:38 -0500 Subject: [PATCH 11/54] Update README.md Added my patron page. --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 5b913d4..3b1d05c 100644 --- a/README.md +++ b/README.md @@ -252,3 +252,9 @@ Returns the log of `expression1` to the base of `expression2` Returns the value of `expression1` to a given precision. For example, `precision(12.3456789, 4)` will return `12.3456`. + +## Donations + +[![Donate with Trans Pay](https://support.jordanwages.com/static/donate-with-transpay-en.png)](https://support.jordanwages.com?project=2) + +If you would like to donate to the development of **cs-mic**, please direct you donation to my [patron page](https://support.jordanwages.com) (powered by Stripe) or directly via my [PayPal.Me](https://www.paypal.me/wagesj45) page. You can also donate Ethereum [to my wallet](https://etherscan.io/address/0x917f3d67e2a7ec8884d241118ee829af57cc4afd). From ed7e85a56ce02060c05e674b698d94d71ea85200 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Wed, 21 Apr 2021 19:32:02 -0500 Subject: [PATCH 12/54] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3b1d05c..58a7ab3 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ CS-MIC is a .NET library written in C# designed to give developers easy access t ## Installation -For your convience, CS-MIC is packaged and distributed via nuget. See [our instructions on how to get started](http://cs-mic.com/adding-cs-mic-to-your-project/). +CS-MIC is available as a package on [nuget.org](/https://nuget.org/packages/csmic) for ease and convenience. You can follow the instructions listed on the package site, or use the nuget package manager to search the nuget repository for cs-mic and install it from there. ## Usage From 07d6c8ca2d8155211cfa28bc8bc2df6a7734ad25 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Mon, 3 Jan 2022 16:40:03 -0600 Subject: [PATCH 13/54] Update README.md Adding analytics image. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 58a7ab3..b7f6d63 100644 --- a/README.md +++ b/README.md @@ -258,3 +258,4 @@ Returns the value of `expression1` to a given precision. For example, `precision [![Donate with Trans Pay](https://support.jordanwages.com/static/donate-with-transpay-en.png)](https://support.jordanwages.com?project=2) If you would like to donate to the development of **cs-mic**, please direct you donation to my [patron page](https://support.jordanwages.com) (powered by Stripe) or directly via my [PayPal.Me](https://www.paypal.me/wagesj45) page. You can also donate Ethereum [to my wallet](https://etherscan.io/address/0x917f3d67e2a7ec8884d241118ee829af57cc4afd). +![Image](https://t.thebreadsticks.com/js?idsite=7&rec=1&action_name=README.md) From 43e5746dafff3b063789fbcc90fb6a950acf98c3 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Mon, 3 Jan 2022 16:42:47 -0600 Subject: [PATCH 14/54] Update README.md Wrong tracking ID. Oops. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b7f6d63..1e48d95 100644 --- a/README.md +++ b/README.md @@ -258,4 +258,4 @@ Returns the value of `expression1` to a given precision. For example, `precision [![Donate with Trans Pay](https://support.jordanwages.com/static/donate-with-transpay-en.png)](https://support.jordanwages.com?project=2) If you would like to donate to the development of **cs-mic**, please direct you donation to my [patron page](https://support.jordanwages.com) (powered by Stripe) or directly via my [PayPal.Me](https://www.paypal.me/wagesj45) page. You can also donate Ethereum [to my wallet](https://etherscan.io/address/0x917f3d67e2a7ec8884d241118ee829af57cc4afd). -![Image](https://t.thebreadsticks.com/js?idsite=7&rec=1&action_name=README.md) +![Image](https://t.thebreadsticks.com/js?idsite=2&rec=1&action_name=README.md) From 0535640e57dafd616f434799fe46821cd26abaff Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Wed, 11 Jun 2025 02:47:24 -0500 Subject: [PATCH 15/54] Starting version 2 --- README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 From 506625791293eb8181e5beaa42ca93aafb3476e3 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Thu, 12 Jun 2025 02:18:27 -0500 Subject: [PATCH 16/54] Initial commit checkpoint only --- .gitignore | 407 +++++++++++++++++++++++++++++++++ src/.config/dotnet-tools.json | 13 ++ src/core/FunctionArgument.cs | 14 ++ src/core/FunctionValue.cs | 15 ++ src/core/ICodedFunction.cs | 23 ++ src/core/InputInterpreter.cs | 7 + src/core/ValueType.cs | 15 ++ src/core/cocor/Interpreter.atg | 143 ++++++++++++ src/core/cocor/Parser.frame | 156 +++++++++++++ src/core/cocor/Scanner.frame | 381 ++++++++++++++++++++++++++++++ src/core/core.csproj | 14 ++ src/cs-mic.sln | 28 +++ src/setup.ps1 | 3 + 13 files changed, 1219 insertions(+) create mode 100644 .gitignore create mode 100644 src/.config/dotnet-tools.json create mode 100644 src/core/FunctionArgument.cs create mode 100644 src/core/FunctionValue.cs create mode 100644 src/core/ICodedFunction.cs create mode 100644 src/core/InputInterpreter.cs create mode 100644 src/core/ValueType.cs create mode 100644 src/core/cocor/Interpreter.atg create mode 100644 src/core/cocor/Parser.frame create mode 100644 src/core/cocor/Scanner.frame create mode 100644 src/core/core.csproj create mode 100644 src/cs-mic.sln create mode 100644 src/setup.ps1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f16e0d --- /dev/null +++ b/.gitignore @@ -0,0 +1,407 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +[Aa][Rr][Mm]64[Ee][Cc]/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Approval Tests result files +*.received.* + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.idb +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +# but not Directory.Build.rsp, as it configures directory-level build defaults +!Directory.Build.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# AWS SAM Build and Temporary Artifacts folder +.aws-sam + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp \ No newline at end of file diff --git a/src/.config/dotnet-tools.json b/src/.config/dotnet-tools.json new file mode 100644 index 0000000..ef58252 --- /dev/null +++ b/src/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "cocor": { + "version": "2014.12.25", + "commands": [ + "coco" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/src/core/FunctionArgument.cs b/src/core/FunctionArgument.cs new file mode 100644 index 0000000..c4c33cd --- /dev/null +++ b/src/core/FunctionArgument.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace csmic +{ + public class FunctionArgument + { + public required string Name { get; set; } + public required FunctionValue Value { get; set; } + } +} diff --git a/src/core/FunctionValue.cs b/src/core/FunctionValue.cs new file mode 100644 index 0000000..4b9d991 --- /dev/null +++ b/src/core/FunctionValue.cs @@ -0,0 +1,15 @@ +using csmic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace csmic +{ + public class FunctionValue + { + public required csmic.ValueType Type { get; set; } + public object? Value { get; set; } + } +} diff --git a/src/core/ICodedFunction.cs b/src/core/ICodedFunction.cs new file mode 100644 index 0000000..140ce6a --- /dev/null +++ b/src/core/ICodedFunction.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace csmic +{ + public interface ICodedFunction + { + #region Properties + + IEnumerable ExpectedArguments { get; } + + #endregion + + #region Methods + + FunctionValue Execute(params FunctionArgument[] args); + + #endregion + } +} diff --git a/src/core/InputInterpreter.cs b/src/core/InputInterpreter.cs new file mode 100644 index 0000000..3d0ca37 --- /dev/null +++ b/src/core/InputInterpreter.cs @@ -0,0 +1,7 @@ +namespace csmic +{ + public class InputInterpreter + { + + } +} diff --git a/src/core/ValueType.cs b/src/core/ValueType.cs new file mode 100644 index 0000000..f944849 --- /dev/null +++ b/src/core/ValueType.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace csmic +{ + public enum ValueType + { + None, + Numeric, + String + } +} diff --git a/src/core/cocor/Interpreter.atg b/src/core/cocor/Interpreter.atg new file mode 100644 index 0000000..6a2ea0f --- /dev/null +++ b/src/core/cocor/Interpreter.atg @@ -0,0 +1,143 @@ +using csmic; +using System.Text; +using System.Collections.Generic; + +COMPILER INTERPRETER + +/* +* +* Class Structures +* +*/ + +private decimal calcValue = 0; +private string stringValue = string.Empty; + +public decimal CalculatedValue +{ + get + { + return this.calcValue; + } + set + { + this.calcValue = value; + } +} + +public string StringValue +{ + get + { + return this.stringValue + } + set + { + this.stringValue = value + } +} + +private InputInterpreter interpreter = null; + +public InputInterpreter Interpreter +{ + get + { + return this.interpreter; + } + set + { + this.interpreter = value; + } +} + +bool IsFunctionCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _LPAREN && la.kind == _identifier) + return true; + return false; +} + +bool IsCompare() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _COMPARER) + return true; + return false; +} + +bool IsAssignment() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.val == "::" || next.val == ":=" || next.val == "->") + return true; + return false; +} + +bool IsArrayCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if(next.val == "[") + return true; + return false; +} + +/* + * Parser definitions + * + */ + +CHARACTERS + + UpperLetter = 'A'..'Z'. + LowerLetter = 'a'..'z'. + letter = UpperLetter + LowerLetter. + digit = "0123456789" . + cr = '\r' . + lf = '\n' . + tab = '\t' . + PM = "+-" . + NoQuote = ANY - '\"' . + +TOKENS + + identifier = letter { letter | digit}. + sign = PM . + binary = ( '0' | '1' ) { '0' | '1' } ('B' | 'b') . + hex = "0x" ( digit | ('A' | 'B' | 'C' | 'D' | 'E' |'F') | ('a' | 'b' | 'c' | 'd' | 'e' |'f') ) { digit | ('A' | 'B' | 'C' | 'D' | 'E' |'F') | ('a' | 'b' | 'c' | 'd' | 'e' |'f') } . + number = digit { digit }['.' {digit}] [('E'|'e')['+'|'-'] digit {digit}] . + string = "\"" { NoQuote } "\"" . + LPAREN = '(' . + RPAREN = ')' . + COMPARER = "==" | "<" | ">" | "<=" | ">=" . + +IGNORE cr + tab + +/* + * Parser specification + * + */ + + PRODUCTIONS + + INTERPRETER (. + decimal decimalValue = 0; + string stringValue = string.Empty; + bool success = true; + if(this.interpreter == null) + { + return; + } + .) += + + IF(IsCompare()) + Comparison (. this.calcValue = (success == true) ? 1 : 0; .) + | + IF(IsAssignment()) + Assignment \ No newline at end of file diff --git a/src/core/cocor/Parser.frame b/src/core/cocor/Parser.frame new file mode 100644 index 0000000..6878147 --- /dev/null +++ b/src/core/cocor/Parser.frame @@ -0,0 +1,156 @@ +/*---------------------------------------------------------------------- +Compiler Generator Coco/R, +Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz +extended by M. Loeberbauer & A. Woess, Univ. of Linz +with improvements by Pat Terry, Rhodes University + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +As an exception, it is allowed to write an extension of Coco/R that is +used as a plugin in non-free software. + +If not otherwise stated, any source code generated by Coco/R (other than +Coco/R itself) does not fall under the GNU General Public License. +----------------------------------------------------------------------*/ +-->begin +using System; + +-->namespace + +public class Parser { +-->constants + const bool _T = true; + const bool _x = false; + const int minErrDist = 2; + + public Scanner scanner; + public Errors errors; + + public Token t; // last recognized token + public Token la; // lookahead token + int errDist = minErrDist; + +-->declarations + + public Parser(Scanner scanner) { + this.scanner = scanner; + errors = new Errors(); + } + + void SynErr (int n) { + if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n); + errDist = 0; + } + + public void SemErr (string msg) { + if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg); + errDist = 0; + } + + void Get () { + for (;;) { + t = la; + la = scanner.Scan(); + if (la.kind <= maxT) { ++errDist; break; } +-->pragmas + la = t; + } + } + + void Expect (int n) { + if (la.kind==n) Get(); else { SynErr(n); } + } + + bool StartOf (int s) { + return set[s, la.kind]; + } + + void ExpectWeak (int n, int follow) { + if (la.kind == n) Get(); + else { + SynErr(n); + while (!StartOf(follow)) Get(); + } + } + + + bool WeakSeparator(int n, int syFol, int repFol) { + int kind = la.kind; + if (kind == n) {Get(); return true;} + else if (StartOf(repFol)) {return false;} + else { + SynErr(n); + while (!(set[syFol, kind] || set[repFol, kind] || set[0, kind])) { + Get(); + kind = la.kind; + } + return StartOf(syFol); + } + } + + +-->productions + + public void Parse() { + la = new Token(); + la.val = ""; + Get(); +-->parseRoot + } + + static readonly bool[,] set = { +-->initialization + }; +} // end Parser + + +public class Errors { + public int count = 0; // number of errors detected + public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream + public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text + + public virtual void SynErr (int line, int col, int n) { + string s; + switch (n) { +-->errors + default: s = "error " + n; break; + } + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public virtual void SemErr (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public virtual void SemErr (string s) { + errorStream.WriteLine(s); + count++; + } + + public virtual void Warning (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + } + + public virtual void Warning(string s) { + errorStream.WriteLine(s); + } +} // Errors + + +public class FatalError: Exception { + public FatalError(string m): base(m) {} +} diff --git a/src/core/cocor/Scanner.frame b/src/core/cocor/Scanner.frame new file mode 100644 index 0000000..9ccf06b --- /dev/null +++ b/src/core/cocor/Scanner.frame @@ -0,0 +1,381 @@ +/*---------------------------------------------------------------------- +Compiler Generator Coco/R, +Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz +extended by M. Loeberbauer & A. Woess, Univ. of Linz +with improvements by Pat Terry, Rhodes University + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +As an exception, it is allowed to write an extension of Coco/R that is +used as a plugin in non-free software. + +If not otherwise stated, any source code generated by Coco/R (other than +Coco/R itself) does not fall under the GNU General Public License. +-----------------------------------------------------------------------*/ +-->begin +using System; +using System.IO; +using System.Collections; + +-->namespace + +public class Token { + public int kind; // token kind + public int pos; // token position in bytes in the source text (starting at 0) + public int charPos; // token position in characters in the source text (starting at 0) + public int col; // token column (starting at 1) + public int line; // token line (starting at 1) + public string val; // token value + public Token next; // ML 2005-03-11 Tokens are kept in linked list +} + +//----------------------------------------------------------------------------------- +// Buffer +//----------------------------------------------------------------------------------- +public class Buffer { + // This Buffer supports the following cases: + // 1) seekable stream (file) + // a) whole stream in buffer + // b) part of stream in buffer + // 2) non seekable stream (network, console) + + public const int EOF = char.MaxValue + 1; + const int MIN_BUFFER_LENGTH = 1024; // 1KB + const int MAX_BUFFER_LENGTH = MIN_BUFFER_LENGTH * 64; // 64KB + byte[] buf; // input buffer + int bufStart; // position of first byte in buffer relative to input stream + int bufLen; // length of buffer + int fileLen; // length of input stream (may change if the stream is no file) + int bufPos; // current position in buffer + Stream stream; // input stream (seekable) + bool isUserStream; // was the stream opened by the user? + + public Buffer (Stream s, bool isUserStream) { + stream = s; this.isUserStream = isUserStream; + + if (stream.CanSeek) { + fileLen = (int) stream.Length; + bufLen = Math.Min(fileLen, MAX_BUFFER_LENGTH); + bufStart = Int32.MaxValue; // nothing in the buffer so far + } else { + fileLen = bufLen = bufStart = 0; + } + + buf = new byte[(bufLen>0) ? bufLen : MIN_BUFFER_LENGTH]; + if (fileLen > 0) Pos = 0; // setup buffer to position 0 (start) + else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid + if (bufLen == fileLen && stream.CanSeek) Close(); + } + + protected Buffer(Buffer b) { // called in UTF8Buffer constructor + buf = b.buf; + bufStart = b.bufStart; + bufLen = b.bufLen; + fileLen = b.fileLen; + bufPos = b.bufPos; + stream = b.stream; + // keep destructor from closing the stream + b.stream = null; + isUserStream = b.isUserStream; + } + + ~Buffer() { Close(); } + + protected void Close() { + if (!isUserStream && stream != null) { + stream.Close(); + stream = null; + } + } + + public virtual int Read () { + if (bufPos < bufLen) { + return buf[bufPos++]; + } else if (Pos < fileLen) { + Pos = Pos; // shift buffer start to Pos + return buf[bufPos++]; + } else if (stream != null && !stream.CanSeek && ReadNextStreamChunk() > 0) { + return buf[bufPos++]; + } else { + return EOF; + } + } + + public int Peek () { + int curPos = Pos; + int ch = Read(); + Pos = curPos; + return ch; + } + + // beg .. begin, zero-based, inclusive, in byte + // end .. end, zero-based, exclusive, in byte + public string GetString (int beg, int end) { + int len = 0; + char[] buf = new char[end - beg]; + int oldPos = Pos; + Pos = beg; + while (Pos < end) buf[len++] = (char) Read(); + Pos = oldPos; + return new String(buf, 0, len); + } + + public int Pos { + get { return bufPos + bufStart; } + set { + if (value >= fileLen && stream != null && !stream.CanSeek) { + // Wanted position is after buffer and the stream + // is not seek-able e.g. network or console, + // thus we have to read the stream manually till + // the wanted position is in sight. + while (value >= fileLen && ReadNextStreamChunk() > 0); + } + + if (value < 0 || value > fileLen) { + throw new FatalError("buffer out of bounds access, position: " + value); + } + + if (value >= bufStart && value < bufStart + bufLen) { // already in buffer + bufPos = value - bufStart; + } else if (stream != null) { // must be swapped in + stream.Seek(value, SeekOrigin.Begin); + bufLen = stream.Read(buf, 0, buf.Length); + bufStart = value; bufPos = 0; + } else { + // set the position to the end of the file, Pos will return fileLen. + bufPos = fileLen - bufStart; + } + } + } + + // Read the next chunk of bytes from the stream, increases the buffer + // if needed and updates the fields fileLen and bufLen. + // Returns the number of bytes read. + private int ReadNextStreamChunk() { + int free = buf.Length - bufLen; + if (free == 0) { + // in the case of a growing input stream + // we can neither seek in the stream, nor can we + // foresee the maximum length, thus we must adapt + // the buffer size on demand. + byte[] newBuf = new byte[bufLen * 2]; + Array.Copy(buf, newBuf, bufLen); + buf = newBuf; + free = bufLen; + } + int read = stream.Read(buf, bufLen, free); + if (read > 0) { + fileLen = bufLen = (bufLen + read); + return read; + } + // end of stream reached + return 0; + } +} + +//----------------------------------------------------------------------------------- +// UTF8Buffer +//----------------------------------------------------------------------------------- +public class UTF8Buffer: Buffer { + public UTF8Buffer(Buffer b): base(b) {} + + public override int Read() { + int ch; + do { + ch = base.Read(); + // until we find a utf8 start (0xxxxxxx or 11xxxxxx) + } while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EOF)); + if (ch < 128 || ch == EOF) { + // nothing to do, first 127 chars are the same in ascii and utf8 + // 0xxxxxxx or end of file character + } else if ((ch & 0xF0) == 0xF0) { + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x07; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; ch = base.Read(); + int c4 = ch & 0x3F; + ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4; + } else if ((ch & 0xE0) == 0xE0) { + // 1110xxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x0F; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; + ch = (((c1 << 6) | c2) << 6) | c3; + } else if ((ch & 0xC0) == 0xC0) { + // 110xxxxx 10xxxxxx + int c1 = ch & 0x1F; ch = base.Read(); + int c2 = ch & 0x3F; + ch = (c1 << 6) | c2; + } + return ch; + } +} + +//----------------------------------------------------------------------------------- +// Scanner +//----------------------------------------------------------------------------------- +public class Scanner { + const char EOL = '\n'; + const int eofSym = 0; /* pdt */ +-->declarations + + public Buffer buffer; // scanner buffer + + Token t; // current token + int ch; // current input character + int pos; // byte position of current character + int charPos; // position by unicode characters starting with 0 + int col; // column number of current character + int line; // line number of current character + int oldEols; // EOLs that appeared in a comment; + static readonly Hashtable start; // maps first token character to start state + + Token tokens; // list of tokens already peeked (first token is a dummy) + Token pt; // current peek token + + char[] tval = new char[128]; // text of current token + int tlen; // length of current token + + static Scanner() { + start = new Hashtable(128); +-->initialization + } + + public Scanner (string fileName) { + try { + Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + buffer = new Buffer(stream, false); + Init(); + } catch (IOException) { + throw new FatalError("Cannot open file " + fileName); + } + } + + public Scanner (Stream s) { + buffer = new Buffer(s, true); + Init(); + } + + void Init() { + pos = -1; line = 1; col = 0; charPos = -1; + oldEols = 0; + NextCh(); + if (ch == 0xEF) { // check optional byte order mark for UTF-8 + NextCh(); int ch1 = ch; + NextCh(); int ch2 = ch; + if (ch1 != 0xBB || ch2 != 0xBF) { + throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2)); + } + buffer = new UTF8Buffer(buffer); col = 0; charPos = -1; + NextCh(); + } + pt = tokens = new Token(); // first token is a dummy + } + + void NextCh() { + if (oldEols > 0) { ch = EOL; oldEols--; } + else { + pos = buffer.Pos; + // buffer reads unicode chars, if UTF8 has been detected + ch = buffer.Read(); col++; charPos++; + // replace isolated '\r' by '\n' in order to make + // eol handling uniform across Windows, Unix and Mac + if (ch == '\r' && buffer.Peek() != '\n') ch = EOL; + if (ch == EOL) { line++; col = 0; } + } +-->casing1 + } + + void AddCh() { + if (tlen >= tval.Length) { + char[] newBuf = new char[2 * tval.Length]; + Array.Copy(tval, 0, newBuf, 0, tval.Length); + tval = newBuf; + } + if (ch != Buffer.EOF) { +-->casing2 + NextCh(); + } + } + + +-->comments + + void CheckLiteral() { +-->literals + } + + Token NextToken() { + while (ch == ' ' || +-->scan1 + ) NextCh(); +-->scan2 + int recKind = noSym; + int recEnd = pos; + t = new Token(); + t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; + int state; + if (start.ContainsKey(ch)) { state = (int) start[ch]; } + else { state = 0; } + tlen = 0; AddCh(); + + switch (state) { + case -1: { t.kind = eofSym; break; } // NextCh already done + case 0: { + if (recKind != noSym) { + tlen = recEnd - t.pos; + SetScannerBehindT(); + } + t.kind = recKind; break; + } // NextCh already done +-->scan3 + } + t.val = new String(tval, 0, tlen); + return t; + } + + private void SetScannerBehindT() { + buffer.Pos = t.pos; + NextCh(); + line = t.line; col = t.col; charPos = t.charPos; + for (int i = 0; i < tlen; i++) NextCh(); + } + + // get the next token (possibly a token already seen during peeking) + public Token Scan () { + if (tokens.next == null) { + return NextToken(); + } else { + pt = tokens = tokens.next; + return tokens; + } + } + + // peek for the next token, ignore pragmas + public Token Peek () { + do { + if (pt.next == null) { + pt.next = NextToken(); + } + pt = pt.next; + } while (pt.kind > maxT); // skip pragmas + + return pt; + } + + // make sure that peeking starts at the current scan position + public void ResetPeek () { pt = tokens; } + +} // end Scanner diff --git a/src/core/core.csproj b/src/core/core.csproj new file mode 100644 index 0000000..4a634f3 --- /dev/null +++ b/src/core/core.csproj @@ -0,0 +1,14 @@ + + + + net9.0 + cs_mic.core + enable + enable + + + + + + + diff --git a/src/cs-mic.sln b/src/cs-mic.sln new file mode 100644 index 0000000..74f32ae --- /dev/null +++ b/src/cs-mic.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.12.35707.178 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "core", "core\core.csproj", "{5387FF55-3044-4EB4-BB90-AD2E922131C1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6394EDF0-24F7-4B75-B4CE-E5F884EE88AC}" + ProjectSection(SolutionItems) = preProject + setup.ps1 = setup.ps1 + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + Description = CS-MIC is a .NET library written in C# designed to give developers easy access to expression parsing. + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5387FF55-3044-4EB4-BB90-AD2E922131C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5387FF55-3044-4EB4-BB90-AD2E922131C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5387FF55-3044-4EB4-BB90-AD2E922131C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5387FF55-3044-4EB4-BB90-AD2E922131C1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/setup.ps1 b/src/setup.ps1 new file mode 100644 index 0000000..d3bcb84 --- /dev/null +++ b/src/setup.ps1 @@ -0,0 +1,3 @@ +Write-Host "Restoring local dotnet tools..." +dotnet tool restore +Write-Host "Done. You can now run: dotnet tool run coco" \ No newline at end of file From eb3bbcb69eea4ed60f7ceadcc06c580da5943087 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Thu, 12 Jun 2025 04:32:18 -0500 Subject: [PATCH 17/54] Check in --- src/core/FunctionValue.cs | 17 ++++++++- src/core/ICodedFunction.cs | 1 + src/core/InputInterpreter.cs | 64 +++++++++++++++++++++++++++++++++- src/core/Variable.cs | 31 ++++++++++++++++ src/core/VariableType.cs | 18 ++++++++++ src/core/cocor/Interpreter.atg | 24 +++---------- 6 files changed, 134 insertions(+), 21 deletions(-) create mode 100644 src/core/Variable.cs create mode 100644 src/core/VariableType.cs diff --git a/src/core/FunctionValue.cs b/src/core/FunctionValue.cs index 4b9d991..418dd29 100644 --- a/src/core/FunctionValue.cs +++ b/src/core/FunctionValue.cs @@ -9,7 +9,22 @@ namespace csmic { public class FunctionValue { - public required csmic.ValueType Type { get; set; } + public ValueType Type { get; set; } public object? Value { get; set; } + + public static readonly FunctionValue TRUE = new FunctionValue(ValueType.Numeric, 1); + public static readonly FunctionValue FALSE = new FunctionValue(ValueType.Numeric, 0); + + public FunctionValue() + { + this.Type = ValueType.None; + this.Value = null; + } + + public FunctionValue(ValueType type, object? value) + { + this.Type = type; + this.Value = value; + } } } diff --git a/src/core/ICodedFunction.cs b/src/core/ICodedFunction.cs index 140ce6a..4baf142 100644 --- a/src/core/ICodedFunction.cs +++ b/src/core/ICodedFunction.cs @@ -11,6 +11,7 @@ namespace csmic #region Properties IEnumerable ExpectedArguments { get; } + FunctionValue ReturnValue { get; } #endregion diff --git a/src/core/InputInterpreter.cs b/src/core/InputInterpreter.cs index 3d0ca37..cae5446 100644 --- a/src/core/InputInterpreter.cs +++ b/src/core/InputInterpreter.cs @@ -1,7 +1,69 @@ -namespace csmic +using System.Runtime.CompilerServices; + +namespace csmic { public class InputInterpreter { + #region Members + private decimal numericValue = 0; + private string stringValue = string.Empty; + + #endregion + + #region Properties + + public decimal NumericValue + { + get + { + return numericValue; + } + } + + public string StringValue + { + get + { + return stringValue; + } + } + + #endregion + + #region Methods + + internal void ProduceOutput(decimal numericValue, string stringValue) + { + this.numericValue = numericValue; + this.stringValue = stringValue; + } + + internal void ProduceOutput(FunctionValue functionValue) + { + switch (functionValue.Type) + { + case ValueType.Numeric: + decimal numericValue = Convert.ToDecimal(functionValue.Value); + ProduceOutput(numericValue, string.Empty); + break; + case ValueType.String: + if (functionValue.Value != null && functionValue.Value is string) + { + ProduceOutput(0, functionValue.Value!.ToString()); + } + else + { + ProduceOutput(0, string.Empty); + } + break; + case ValueType.None: + default: + ProduceOutput(0, string.Empty); + break; + } + } + + #endregion } } diff --git a/src/core/Variable.cs b/src/core/Variable.cs new file mode 100644 index 0000000..166d4fb --- /dev/null +++ b/src/core/Variable.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace cs_mic.core +{ + public class Variable + { + #region Members + + private VariableType type; + + private string name; + + private object value; + + #endregion + + #region Constructor + + public Variable() + { + this.type = VariableType.None; + this.value = string.Empty; + } + + #endregion + } +} diff --git a/src/core/VariableType.cs b/src/core/VariableType.cs new file mode 100644 index 0000000..2c4bc76 --- /dev/null +++ b/src/core/VariableType.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace cs_mic.core +{ + public enum VariableType + { + None, + Numeric, + NumericArray, + String, + StringArray, + Expression, + } +} diff --git a/src/core/cocor/Interpreter.atg b/src/core/cocor/Interpreter.atg index 6a2ea0f..6932af5 100644 --- a/src/core/cocor/Interpreter.atg +++ b/src/core/cocor/Interpreter.atg @@ -10,30 +10,17 @@ COMPILER INTERPRETER * */ -private decimal calcValue = 0; -private string stringValue = string.Empty; +private FunctionValue value = new FunctionValue(); public decimal CalculatedValue { get { - return this.calcValue; + return this.value; } set { - this.calcValue = value; - } -} - -public string StringValue -{ - get - { - return this.stringValue - } - set - { - this.stringValue = value + this.value = value; } } @@ -126,8 +113,7 @@ IGNORE cr + tab PRODUCTIONS INTERPRETER (. - decimal decimalValue = 0; - string stringValue = string.Empty; + FunctionValue functionValue = new FunctionValue(); bool success = true; if(this.interpreter == null) { @@ -137,7 +123,7 @@ IGNORE cr + tab = IF(IsCompare()) - Comparison (. this.calcValue = (success == true) ? 1 : 0; .) + Comparison (. this.functionValue = (success == true) ? FunctionValue.TRUE : FunctionValue.FALSE; .) | IF(IsAssignment()) Assignment \ No newline at end of file From 87bec68e1f13088eb1f9cabf782a7577b82a926c Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Tue, 19 Aug 2025 03:06:13 -0500 Subject: [PATCH 18/54] docs: add Design Philosophy and Args-Only Strings guidance for v2 --- README.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/README.md b/README.md index e69de29..e014fad 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,54 @@ +Design Philosophy + +CS‑MIC is a small, embeddable expression interpreter designed primarily for UI scenarios where a user types flexible input (e.g., 2+2+someVar) but the host application needs a validated, deterministic numeric value. The library focuses on predictable evaluation, strong validation and extensibility through developer‑supplied variables and coded functions. + +Goals + +- Numeric‑first: Expressions evaluate to a numeric result the host can trust. +- Predictable semantics: No implicit coercions or surprising operator behavior. +- Embeddable: Tiny surface area, easy to host inside C# applications. +- Extensible: Developers inject variables and ICodedFunction implementations. +- Clear errors: Friendly, actionable diagnostics for invalid input. + +Core Principles + +- Determinism: The same input with the same variables/functions yields the same numeric output. +- Minimalism: Keep the grammar and runtime small; add features only when they reinforce the numeric‑first mission. +- Type clarity: Values carry explicit types; operators enforce type rules rather than auto‑converting. +- Safe composition: Functions are pure from the interpreter’s perspective; side effects are the host’s responsibility. + +Strings: Arguments‑Only, Numeric‑First + +CS‑MIC’s v2 scope treats strings as helpers for functions, not as first‑class expression values. This preserves the “numeric guarantee” while enabling rich, domain‑specific function usage. + +- Where strings are allowed: As literals in function argument lists (e.g., myFunc("key", 42)). +- Where strings are not allowed: As standalone primaries, in arithmetic (e.g., "a" + 1), or in comparisons; string variables are out of scope for v2. +- Function contract: ICodedFunction implementations may accept string arguments and should return a numeric result when the function’s value is used in an expression. +- Grammar posture: The grammar recognizes quoted string tokens; the parser accepts them only in function argument positions. +- Operator semantics: No string operators or concatenation; no implicit conversions from string to number. +- Errors: If a string is used outside an argument position or produced where a number is required, the interpreter emits a clear type error (e.g., "strings are only valid as function arguments"). + +Rationale + +- Preserves the primary mission: turn flexible user input into a validated numeric value. +- Keeps complexity low by avoiding general string semantics (concatenation, ordering, variables, etc.). +- Maximizes developer power: functions can receive text payloads (formats, keys, expressions) and return numbers, leveraging CS‑MIC for parsing, validation and invocation. + +Developer Guidance + +- Implementing ICodedFunction: Inspect FunctionArgument.Value.Type to branch on expected input. If a string is required, validate and produce a numeric FunctionValue. +- Argument metadata: Optionally use ExpectedArguments to document names and intended types for better diagnostics. +- Error messaging: Prefer precise, actionable messages (e.g., "arg 'pattern' must be a string"). + +Example + +// Pseudocode / sketch +// myFunc("HEX", 0xFF) → 255 +// myFunc("BIN", 1010b) → 10 +// sumWithLabel("groupA", 1, 2, 3) → 6 (label used for logging/selection) + +Future Directions (Non‑Goals for v2) + +- First‑class strings: Allow strings as values, variables, or return types in general expressions (would require defining operators and comparisons). +- Verbatim/opaque arguments: Special argument modes for embedding mini‑DSLs (higher parser complexity). +- Value tagging: Optional metadata (e.g., OriginalLiteral) attached to FunctionValue for advanced scenarios. From 841a10cb97e79000bee87aff5d3159d7ea8f6f60 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Tue, 19 Aug 2025 03:06:57 -0500 Subject: [PATCH 19/54] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e014fad..c420ae8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Design Philosophy +## Design Philosophy CS‑MIC is a small, embeddable expression interpreter designed primarily for UI scenarios where a user types flexible input (e.g., 2+2+someVar) but the host application needs a validated, deterministic numeric value. The library focuses on predictable evaluation, strong validation and extensibility through developer‑supplied variables and coded functions. From 66ec23a42045ee8f97f5a54d843141d5d73bcbf8 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Tue, 19 Aug 2025 03:09:41 -0500 Subject: [PATCH 20/54] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c420ae8..ed2bfdd 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Core Principles - Type clarity: Values carry explicit types; operators enforce type rules rather than auto‑converting. - Safe composition: Functions are pure from the interpreter’s perspective; side effects are the host’s responsibility. -Strings: Arguments‑Only, Numeric‑First +### Strings: Arguments‑Only, Numeric‑First CS‑MIC’s v2 scope treats strings as helpers for functions, not as first‑class expression values. This preserves the “numeric guarantee” while enabling rich, domain‑specific function usage. From f532d13d8c89e7e4ad06f764bc4da30e960fcef6 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Tue, 19 Aug 2025 03:45:57 -0500 Subject: [PATCH 21/54] v2: Implement Interpreter.atg with typed FunctionValue, mixed-arg functions, and expression-binding (:=); fix Coco/R csproj command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This completes the v2 grammar based on master’s capabilities while aligning with the v2 design philosophy (numeric-first, strings as function-args only): - Implement full arithmetic grammar ( +, -, *, /, %, ^, parentheses, unary sign ), with support for number/hex/binary literals. - Add variables and arrays: - Numeric variables via :: (evaluate RHS now and store numeric) - Expression-bound variables via := (capture RHS text; re-parse and evaluate at use-time) - Numeric arrays via -> and array literals + indexing (with bounds/type checks) - Add comparisons (==, <, >, <=, >=) producing FunctionValue TRUE/FALSE. - Add function calls with mixed arguments: numeric expressions and quoted string literals. - In numeric contexts, enforce numeric results; emit clear type errors if a function returns a string. - Root production always produces a FunctionValue through InputInterpreter.ProduceOutput(FunctionValue). Runtime integration (expected APIs on InputInterpreter): - Variable APIs: AssignNumeric, AssignExpression, AssignNumericArray; TryGetNumeric, TryGetExpression, TryGetNumericArray - Function dispatch: ExecuteFunction(name, FunctionArgument[]) - Expression evaluation for :=: EvaluateExpression(expressionText) Coco/R build fix: - Correct the PreBuild command in src/core/core.csproj: - Use -frames (without the stray space) and point to cocor - Use the correct case and path for the grammar: cocor/Interpreter.atg Notes: - Strings are valid only as function arguments and not as standalone values or variables. - Grammar emits concise, actionable error messages for type mismatches, missing variables, and array bounds. --- src/core/cocor/Interpreter.atg | 390 ++++++++++++++++++++++++++------- src/core/core.csproj | 2 +- 2 files changed, 307 insertions(+), 85 deletions(-) diff --git a/src/core/cocor/Interpreter.atg b/src/core/cocor/Interpreter.atg index 6932af5..5bc3ca1 100644 --- a/src/core/cocor/Interpreter.atg +++ b/src/core/cocor/Interpreter.atg @@ -1,129 +1,351 @@ -using csmic; +using System; using System.Text; using System.Collections.Generic; +using csmic; COMPILER INTERPRETER /* -* -* Class Structures -* -*/ + * Class structures and helpers + */ -private FunctionValue value = new FunctionValue(); +private FunctionValue functionValue = new FunctionValue(); -public decimal CalculatedValue +public FunctionValue Result { - get - { - return this.value; - } - set - { - this.value = value; - } + get { return this.functionValue; } + set { this.functionValue = value; } } private InputInterpreter interpreter = null; public InputInterpreter Interpreter { - get - { - return this.interpreter; - } - set - { - this.interpreter = value; - } + get { return this.interpreter; } + set { this.interpreter = value; } } -bool IsFunctionCall() +bool IsFunctionCall() { - scanner.ResetPeek(); - Token next = scanner.Peek(); - if (next.kind == _LPAREN && la.kind == _identifier) - return true; - return false; + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _LPAREN && la.kind == _identifier) return true; + return false; } -bool IsCompare() +bool IsCompare() { - scanner.ResetPeek(); - Token next = scanner.Peek(); - if (next.kind == _COMPARER) - return true; - return false; + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _COMPARER) return true; + return false; } -bool IsAssignment() +bool IsAssignment() { - scanner.ResetPeek(); - Token next = scanner.Peek(); - if (next.val == "::" || next.val == ":=" || next.val == "->") - return true; - return false; + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.val == "::" || next.val == ":=" || next.val == "->") return true; + return false; } bool IsArrayCall() { - scanner.ResetPeek(); - Token next = scanner.Peek(); - if(next.val == "[") - return true; - return false; + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.val == "[") return true; + return false; } /* - * Parser definitions - * + * Character sets and tokens */ CHARACTERS - UpperLetter = 'A'..'Z'. - LowerLetter = 'a'..'z'. - letter = UpperLetter + LowerLetter. - digit = "0123456789" . - cr = '\r' . - lf = '\n' . - tab = '\t' . - PM = "+-" . - NoQuote = ANY - '\"' . - + UpperLetter = 'A'..'Z'. + LowerLetter = 'a'..'z'. + letter = UpperLetter + LowerLetter. + digit = "0123456789" . + cr = '\r' . + lf = '\n' . + tab = '\t' . + PM = "+-" . + NoQuote = ANY - '\"' . + TOKENS - identifier = letter { letter | digit}. - sign = PM . - binary = ( '0' | '1' ) { '0' | '1' } ('B' | 'b') . - hex = "0x" ( digit | ('A' | 'B' | 'C' | 'D' | 'E' |'F') | ('a' | 'b' | 'c' | 'd' | 'e' |'f') ) { digit | ('A' | 'B' | 'C' | 'D' | 'E' |'F') | ('a' | 'b' | 'c' | 'd' | 'e' |'f') } . - number = digit { digit }['.' {digit}] [('E'|'e')['+'|'-'] digit {digit}] . - string = "\"" { NoQuote } "\"" . - LPAREN = '(' . - RPAREN = ')' . - COMPARER = "==" | "<" | ">" | "<=" | ">=" . - + identifier = letter { letter | digit}. + sign = PM . + binary = ( '0' | '1' ) { '0' | '1' } ('B' | 'b') . + hex = "0x" ( digit | ('A' | 'B' | 'C' | 'D' | 'E' |'F') | ('a' | 'b' | 'c' | 'd' | 'e' |'f') ) { digit | ('A' | 'B' | 'C' | 'D' | 'E' |'F') | ('a' | 'b' | 'c' | 'd' | 'e' |'f') } . + number = digit { digit }['.' {digit}] [('E'|'e')['+'|'-'] digit {digit}] . + string = "\"" { NoQuote } "\"" . + LPAREN = '(' . + RPAREN = ')' . + COMPARER = "==" | "<" | ">" | "<=" | ">=" . + IGNORE cr + tab /* - * Parser specification - * + * Grammar */ - PRODUCTIONS +PRODUCTIONS - INTERPRETER (. - FunctionValue functionValue = new FunctionValue(); - bool success = true; - if(this.interpreter == null) - { - return; - } - .) +INTERPRETER (. + FunctionValue fv = new FunctionValue(); + bool success = true; + if (this.interpreter == null) { return; } + .) = + IF(IsCompare()) + Comparison + (. this.functionValue = (success == true) ? FunctionValue.TRUE : FunctionValue.FALSE; + this.interpreter.ProduceOutput(this.functionValue); + .) + | + IF(IsAssignment()) + Assignment + (. this.functionValue = new FunctionValue(ValueType.Numeric, r); + this.interpreter.ProduceOutput(this.functionValue); + .) + | + Expression + (. this.functionValue = new FunctionValue(ValueType.Numeric, r); + this.interpreter.ProduceOutput(this.functionValue); + .) +. - IF(IsCompare()) - Comparison (. this.functionValue = (success == true) ? FunctionValue.TRUE : FunctionValue.FALSE; .) - | - IF(IsAssignment()) - Assignment \ No newline at end of file +Expression += + (. decimal r1 = 0; r = 0; .) + Term + { '+' Term (. r += r1; .) + | '-' Term (. r -= r1; .) + } +. + +Term += + (. decimal r1 = 0; r = 0; .) + Factor + { '*' Factor (. r *= r1; .) + | '/' Factor (. r /= r1; .) + | '%' Term (. r %= r1; .) + } +. + +Factor += + (. decimal r1 = 0; .) + Value + { '^' Expression + (. r = Convert.ToDecimal(Math.Pow(Convert.ToDouble(r), Convert.ToDouble(r1))); .) + } +. + +Value (. + r = 0; decimal r1 = 0; int signum = 1; + FunctionValue fvr = new FunctionValue(); + string ident = string.Empty; + .) += + [ '+' | '-' (. signum = -1; .) ] + ( + IF(IsFunctionCall()) + Function + (. + if (fvr.Type == ValueType.Numeric && fvr.Value != null) + { + try { r = signum * Convert.ToDecimal(fvr.Value); } + catch { SemErr("function returned non-numeric"); r = 0; } + } + else + { + SemErr("function returned a string; number required"); + r = 0; + } + .) + | + IF(IsArrayCall()) + ArrayCall (. r = signum * r; .) + | + identifier + (. + ident = t.val; + decimal temp = 0; + string expr = string.Empty; + bool ok = false; + // Prefer numeric binding + try + { + // runtime method expected + ok = this.interpreter.TryGetNumeric(ident, out temp); + } + catch { ok = false; } + if (ok) + { + r = signum * temp; + } + else + { + // Check expression binding + try + { + if (this.interpreter.TryGetExpression(ident, out expr)) + { + FunctionValue eval = this.interpreter.EvaluateExpression(expr); + if (eval.Type == ValueType.Numeric && eval.Value != null) + { + r = signum * Convert.ToDecimal(eval.Value); + } + else + { + SemErr("expression variable did not evaluate to a number"); + r = 0; + } + } + else + { + SemErr("variable '" + ident + "' is not numeric"); + r = 0; + } + } + catch { SemErr("error evaluating expression variable"); r = 0; } + } + .) + | + number (. r = signum * Convert.ToDecimal(t.val); .) + | + hex (. string hx = t.val.Remove(0,2); + try { r = signum * Convert.ToDecimal(Convert.ToInt64(hx, 16)); } + catch { r = 0; } + .) + | + binary (. string bx = t.val.Remove(t.val.Length - 1); + try { r = signum * Convert.ToDecimal(Convert.ToInt64(bx, 2)); } + catch { r = 0; } + .) + | + '(' Expression ')' + (. r = signum * r; .) + ) +. + +ArrayL += + (. List list = new List(); decimal r = 0; d = new decimal[0]; .) + '[' + Expression (. list.Add(r); d = list.ToArray(); .) + { ',' Expression (. list.Add(r); d = list.ToArray(); .) } + ']' +. + +ArrayCall (. string ident = string.Empty; r = 0; decimal pos = 0; .) += + identifier (. ident = t.val; .) + '[' + Expression + (. + try + { + int i = Convert.ToInt32(pos); + decimal[] values; + if (this.interpreter.TryGetNumericArray(ident, out values)) + { + if (i >= 0 && i < values.Length) { r = values[i]; } + else { SemErr("array index out of range"); r = 0; } + } + else + { + SemErr("variable '" + ident + "' is not a numeric array"); + r = 0; + } + } + catch { SemErr("invalid array index"); r = 0; } + .) + ']' +. + +Assignment + (. string identifier = string.Empty; string expression = string.Empty; decimal[] d = new decimal[0]; r = 0; .) += + identifier (. identifier = t.val; .) + ( + ( + "::" + Expression + (. this.interpreter.AssignNumeric(identifier, r); .) + ) + | + ( + ":=" + AnyExpression + (. this.interpreter.AssignExpression(identifier, expression); r = 0; .) + ) + | + ( + "->" + ArrayL + (. this.interpreter.AssignNumericArray(identifier, d); r = 0; .) + ) + ) +. + +// Function call with mixed arguments (numeric expressions and strings) +Function + (. string functionName = string.Empty; FunctionArgument[] args = new FunctionArgument[0]; r = new FunctionValue(); .) += + identifier (. functionName = t.val; .) + '(' + ArgList + ')' + (. r = this.interpreter.ExecuteFunction(functionName, args); .) +. + +ArgList + (. List list = new List(); FunctionArgument a = new FunctionArgument { Name = string.Empty, Value = new FunctionValue() }; args = new FunctionArgument[0]; .) += + [ + Arg (. list.Add(a); args = list.ToArray(); .) + { ',' Arg (. list.Add(a); args = list.ToArray(); .) } + ] +. + +Arg + (. arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue() }; decimal r = 0; string s = string.Empty; .) += + ( + string (. s = t.val.Substring(1, t.val.Length - 2); arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue(ValueType.String, s) }; .) + | + Expression (. arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue(ValueType.Numeric, r) }; .) + ) +. + +Comparison + (. decimal firstValue = 0; decimal secondValue = 0; string compareType = string.Empty; result = false; .) += + Expression + COMPARER (. compareType = t.val; .) + Expression + (. + switch(compareType) + { + case "==": result = (firstValue == secondValue); break; + case ">": result = (firstValue > secondValue); break; + case "<": result = (firstValue < secondValue); break; + case ">=": result = (firstValue >= secondValue); break; + case "<=": result = (firstValue <= secondValue); break; + default: result = false; break; + } + .) +. + +AnyExpression + (. value = string.Empty; StringBuilder builder = new StringBuilder(); .) += + ANY (. builder.Append(t.val); .) { ANY (. builder.Append(t.val); .) } (. value = builder.ToString(); .) +. + +END INTERPRETER. diff --git a/src/core/core.csproj b/src/core/core.csproj index 4a634f3..7fdff38 100644 --- a/src/core/core.csproj +++ b/src/core/core.csproj @@ -8,7 +8,7 @@ - + From c5f35b9d34233806d36e499b7d2a31c462e4f9fc Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Tue, 19 Aug 2025 03:51:05 -0500 Subject: [PATCH 22/54] v2: Wire InputInterpreter runtime APIs for v2 grammar Add in-memory stores and APIs required by the v2 Coco/R grammar: - Variables: AssignNumeric, AssignExpression, AssignNumericArray; TryGetNumeric, TryGetExpression, TryGetNumericArray. - Mixed-arg function dispatch: ExecuteFunction(name, FunctionArgument[]), plus RegisterFunction. - Expression evaluation for :=: EvaluateExpression(expressionText) via generated Scanner/Parser with a child interpreter sharing stores. - Output handling preserved: ProduceOutput(FunctionValue) updates NumericValue/StringValue. These changes allow the generated parser to compile and run against the v2 runtime, enforcing the numeric-first, strings-as-arguments-only model. --- src/core/InputInterpreter.cs | 133 +++++++++++++++++++++++++++++------ 1 file changed, 111 insertions(+), 22 deletions(-) diff --git a/src/core/InputInterpreter.cs b/src/core/InputInterpreter.cs index cae5446..9bcb797 100644 --- a/src/core/InputInterpreter.cs +++ b/src/core/InputInterpreter.cs @@ -1,4 +1,6 @@ using System.Runtime.CompilerServices; +using System.Text; +using System.IO; namespace csmic { @@ -9,29 +11,45 @@ namespace csmic private decimal numericValue = 0; private string stringValue = string.Empty; + // Variable stores + private readonly Dictionary numericVariables; + private readonly Dictionary numericArrayVariables; + private readonly Dictionary expressionVariables; + + // Function registry + private readonly Dictionary functions; + + #endregion + + #region Constructors + + public InputInterpreter() + { + numericVariables = new(StringComparer.Ordinal); + numericArrayVariables = new(StringComparer.Ordinal); + expressionVariables = new(StringComparer.Ordinal); + functions = new(StringComparer.Ordinal); + } + + // Internal constructor to create a child interpreter that shares stores + internal InputInterpreter(InputInterpreter parent) + { + this.numericVariables = parent.numericVariables; + this.numericArrayVariables = parent.numericArrayVariables; + this.expressionVariables = parent.expressionVariables; + this.functions = parent.functions; + } + #endregion #region Properties - public decimal NumericValue - { - get - { - return numericValue; - } - } - - public string StringValue - { - get - { - return stringValue; - } - } + public decimal NumericValue => numericValue; + public string StringValue => stringValue; #endregion - #region Methods + #region Output Plumbing internal void ProduceOutput(decimal numericValue, string stringValue) { @@ -48,14 +66,10 @@ namespace csmic ProduceOutput(numericValue, string.Empty); break; case ValueType.String: - if (functionValue.Value != null && functionValue.Value is string) - { - ProduceOutput(0, functionValue.Value!.ToString()); - } + if (functionValue.Value is string s) + ProduceOutput(0, s); else - { ProduceOutput(0, string.Empty); - } break; case ValueType.None: default: @@ -65,5 +79,80 @@ namespace csmic } #endregion + + #region Variable APIs + + internal bool TryGetNumeric(string name, out decimal value) + => numericVariables.TryGetValue(name, out value); + + internal bool TryGetNumericArray(string name, out decimal[] values) + => numericArrayVariables.TryGetValue(name, out values!); + + internal bool TryGetExpression(string name, out string expr) + => expressionVariables.TryGetValue(name, out expr!); + + internal void AssignNumeric(string name, decimal value) + { + numericVariables[name] = value; + // Remove conflicting bindings + expressionVariables.Remove(name); + } + + internal void AssignNumericArray(string name, decimal[] values) + { + numericArrayVariables[name] = values; + } + + internal void AssignExpression(string name, string expressionText) + { + expressionVariables[name] = expressionText; + // Remove conflicting numeric value + numericVariables.Remove(name); + } + + #endregion + + #region Expression Evaluation + + internal FunctionValue EvaluateExpression(string expressionText) + { + // Create a child interpreter sharing stores, so ProduceOutput doesn't affect parent state + var child = new InputInterpreter(this); + using var ms = new MemoryStream(Encoding.UTF8.GetBytes(expressionText)); + var scanner = new csmic.Interpreter.Scanner(ms); + var parser = new csmic.Interpreter.Parser(scanner) + { + Interpreter = child + }; + parser.Parse(); + return parser.Result; + } + + #endregion + + #region Functions + + internal void RegisterFunction(string name, ICodedFunction function) + { + functions[name] = function; + } + + internal FunctionValue ExecuteFunction(string name, params FunctionArgument[] args) + { + if (functions.TryGetValue(name, out var fn)) + { + try + { + return fn.Execute(args); + } + catch + { + return new FunctionValue(ValueType.None, null); + } + } + return new FunctionValue(ValueType.None, null); + } + + #endregion } } From b2213663d1132ecdc6cc4b3f7e6960d6b33cdfbe Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Tue, 19 Aug 2025 04:00:31 -0500 Subject: [PATCH 23/54] Fixed minor gramar issue. --- src/core/VariableType.cs | 2 - src/core/cocor/Interpreter.atg | 1 + src/core/cocor/Parser.cs | 522 +++++++++++++++++++++++++++++++++ src/core/cocor/Parser.cs.old | 522 +++++++++++++++++++++++++++++++++ src/core/cocor/Scanner.cs | 489 ++++++++++++++++++++++++++++++ src/core/cocor/Scanner.cs.old | 489 ++++++++++++++++++++++++++++++ 6 files changed, 2023 insertions(+), 2 deletions(-) create mode 100644 src/core/cocor/Parser.cs create mode 100644 src/core/cocor/Parser.cs.old create mode 100644 src/core/cocor/Scanner.cs create mode 100644 src/core/cocor/Scanner.cs.old diff --git a/src/core/VariableType.cs b/src/core/VariableType.cs index 2c4bc76..4061f70 100644 --- a/src/core/VariableType.cs +++ b/src/core/VariableType.cs @@ -11,8 +11,6 @@ namespace cs_mic.core None, Numeric, NumericArray, - String, - StringArray, Expression, } } diff --git a/src/core/cocor/Interpreter.atg b/src/core/cocor/Interpreter.atg index 5bc3ca1..7fedc2a 100644 --- a/src/core/cocor/Interpreter.atg +++ b/src/core/cocor/Interpreter.atg @@ -96,6 +96,7 @@ PRODUCTIONS INTERPRETER (. FunctionValue fv = new FunctionValue(); bool success = true; + decimal r = 0; if (this.interpreter == null) { return; } .) = diff --git a/src/core/cocor/Parser.cs b/src/core/cocor/Parser.cs new file mode 100644 index 0000000..880d873 --- /dev/null +++ b/src/core/cocor/Parser.cs @@ -0,0 +1,522 @@ +using System; +using System.Text; +using System.Collections.Generic; +using csmic; + + + +using System; + +namespace csmic.Interpreter { + + + +public class Parser { + public const int _EOF = 0; + public const int _identifier = 1; + public const int _sign = 2; + public const int _binary = 3; + public const int _hex = 4; + public const int _number = 5; + public const int _string = 6; + public const int _LPAREN = 7; + public const int _RPAREN = 8; + public const int _COMPARER = 9; + public const int maxT = 22; + + const bool _T = true; + const bool _x = false; + const int minErrDist = 2; + + public Scanner scanner; + public Errors errors; + + public Token t; // last recognized token + public Token la; // lookahead token + int errDist = minErrDist; + +private FunctionValue functionValue = new FunctionValue(); + +public FunctionValue Result +{ + get { return this.functionValue; } + set { this.functionValue = value; } +} + +private InputInterpreter interpreter = null; + +public InputInterpreter Interpreter +{ + get { return this.interpreter; } + set { this.interpreter = value; } +} + +bool IsFunctionCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _LPAREN && la.kind == _identifier) return true; + return false; +} + +bool IsCompare() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _COMPARER) return true; + return false; +} + +bool IsAssignment() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.val == "::" || next.val == ":=" || next.val == "->") return true; + return false; +} + +bool IsArrayCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.val == "[") return true; + return false; +} + +/* + * Character sets and tokens + */ + + + + public Parser(Scanner scanner) { + this.scanner = scanner; + errors = new Errors(); + } + + void SynErr (int n) { + if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n); + errDist = 0; + } + + public void SemErr (string msg) { + if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg); + errDist = 0; + } + + void Get () { + for (;;) { + t = la; + la = scanner.Scan(); + if (la.kind <= maxT) { ++errDist; break; } + + la = t; + } + } + + void Expect (int n) { + if (la.kind==n) Get(); else { SynErr(n); } + } + + bool StartOf (int s) { + return set[s, la.kind]; + } + + void ExpectWeak (int n, int follow) { + if (la.kind == n) Get(); + else { + SynErr(n); + while (!StartOf(follow)) Get(); + } + } + + + bool WeakSeparator(int n, int syFol, int repFol) { + int kind = la.kind; + if (kind == n) {Get(); return true;} + else if (StartOf(repFol)) {return false;} + else { + SynErr(n); + while (!(set[syFol, kind] || set[repFol, kind] || set[0, kind])) { + Get(); + kind = la.kind; + } + return StartOf(syFol); + } + } + + + void INTERPRETER() { + FunctionValue fv = new FunctionValue(); + bool success = true; + decimal r = 0; + if (this.interpreter == null) { return; } + + if (IsCompare()) { + Comparison(out success); + this.functionValue = (success == true) ? FunctionValue.TRUE : FunctionValue.FALSE; + this.interpreter.ProduceOutput(this.functionValue); + + } else if (IsAssignment()) { + Assignment(out r); + this.functionValue = new FunctionValue(ValueType.Numeric, r); + this.interpreter.ProduceOutput(this.functionValue); + + } else if (StartOf(1)) { + Expression(out r); + this.functionValue = new FunctionValue(ValueType.Numeric, r); + this.interpreter.ProduceOutput(this.functionValue); + + } else SynErr(23); + } + + void Comparison(out bool result) { + decimal firstValue = 0; decimal secondValue = 0; string compareType = string.Empty; result = false; + Expression(out firstValue); + Expect(9); + compareType = t.val; + Expression(out secondValue); + switch(compareType) + { + case "==": result = (firstValue == secondValue); break; + case ">": result = (firstValue > secondValue); break; + case "<": result = (firstValue < secondValue); break; + case ">=": result = (firstValue >= secondValue); break; + case "<=": result = (firstValue <= secondValue); break; + default: result = false; break; + } + + } + + void Assignment(out decimal r) { + string identifier = string.Empty; string expression = string.Empty; decimal[] d = new decimal[0]; r = 0; + Expect(1); + identifier = t.val; + if (la.kind == 19) { + Get(); + Expression(out r); + this.interpreter.AssignNumeric(identifier, r); + } else if (la.kind == 20) { + Get(); + AnyExpression(out expression); + this.interpreter.AssignExpression(identifier, expression); r = 0; + } else if (la.kind == 21) { + Get(); + ArrayL(out d); + this.interpreter.AssignNumericArray(identifier, d); r = 0; + } else SynErr(24); + } + + void Expression(out decimal r) { + decimal r1 = 0; r = 0; + Term(out r); + while (la.kind == 10 || la.kind == 11) { + if (la.kind == 10) { + Get(); + Term(out r1); + r += r1; + } else { + Get(); + Term(out r1); + r -= r1; + } + } + } + + void Term(out decimal r) { + decimal r1 = 0; r = 0; + Factor(out r); + while (la.kind == 12 || la.kind == 13 || la.kind == 14) { + if (la.kind == 12) { + Get(); + Factor(out r1); + r *= r1; + } else if (la.kind == 13) { + Get(); + Factor(out r1); + r /= r1; + } else { + Get(); + Term(out r1); + r %= r1; + } + } + } + + void Factor(out decimal r) { + decimal r1 = 0; + Value(out r); + while (la.kind == 15) { + Get(); + Expression(out r1); + r = Convert.ToDecimal(Math.Pow(Convert.ToDouble(r), Convert.ToDouble(r1))); + } + } + + void Value(out decimal r) { + r = 0; decimal r1 = 0; int signum = 1; + FunctionValue fvr = new FunctionValue(); + string ident = string.Empty; + + if (la.kind == 10 || la.kind == 11) { + if (la.kind == 10) { + Get(); + } else { + Get(); + signum = -1; + } + } + if (IsFunctionCall()) { + Function(out fvr); + if (fvr.Type == ValueType.Numeric && fvr.Value != null) + { + try { r = signum * Convert.ToDecimal(fvr.Value); } + catch { SemErr("function returned non-numeric"); r = 0; } + } + else + { + SemErr("function returned a string; number required"); + r = 0; + } + + } else if (IsArrayCall()) { + ArrayCall(out r); + r = signum * r; + } else if (la.kind == 1) { + Get(); + ident = t.val; + decimal temp = 0; + string expr = string.Empty; + bool ok = false; + // Prefer numeric binding + try + { + // runtime method expected + ok = this.interpreter.TryGetNumeric(ident, out temp); + } + catch { ok = false; } + if (ok) + { + r = signum * temp; + } + else + { + // Check expression binding + try + { + if (this.interpreter.TryGetExpression(ident, out expr)) + { + FunctionValue eval = this.interpreter.EvaluateExpression(expr); + if (eval.Type == ValueType.Numeric && eval.Value != null) + { + r = signum * Convert.ToDecimal(eval.Value); + } + else + { + SemErr("expression variable did not evaluate to a number"); + r = 0; + } + } + else + { + SemErr("variable '" + ident + "' is not numeric"); + r = 0; + } + } + catch { SemErr("error evaluating expression variable"); r = 0; } + } + + } else if (la.kind == 5) { + Get(); + r = signum * Convert.ToDecimal(t.val); + } else if (la.kind == 4) { + Get(); + string hx = t.val.Remove(0,2); + try { r = signum * Convert.ToDecimal(Convert.ToInt64(hx, 16)); } + catch { r = 0; } + + } else if (la.kind == 3) { + Get(); + string bx = t.val.Remove(t.val.Length - 1); + try { r = signum * Convert.ToDecimal(Convert.ToInt64(bx, 2)); } + catch { r = 0; } + + } else if (la.kind == 7) { + Get(); + Expression(out r); + Expect(8); + r = signum * r; + } else SynErr(25); + } + + void Function(out FunctionValue r) { + string functionName = string.Empty; FunctionArgument[] args = new FunctionArgument[0]; r = new FunctionValue(); + Expect(1); + functionName = t.val; + Expect(7); + ArgList(out args); + Expect(8); + r = this.interpreter.ExecuteFunction(functionName, args); + } + + void ArrayCall(out decimal r) { + string ident = string.Empty; r = 0; decimal pos = 0; + Expect(1); + ident = t.val; + Expect(16); + Expression(out pos); + try + { + int i = Convert.ToInt32(pos); + decimal[] values; + if (this.interpreter.TryGetNumericArray(ident, out values)) + { + if (i >= 0 && i < values.Length) { r = values[i]; } + else { SemErr("array index out of range"); r = 0; } + } + else + { + SemErr("variable '" + ident + "' is not a numeric array"); + r = 0; + } + } + catch { SemErr("invalid array index"); r = 0; } + + Expect(18); + } + + void ArrayL(out decimal[] d) { + List list = new List(); decimal r = 0; d = new decimal[0]; + Expect(16); + Expression(out r); + list.Add(r); d = list.ToArray(); + while (la.kind == 17) { + Get(); + Expression(out r); + list.Add(r); d = list.ToArray(); + } + Expect(18); + } + + void AnyExpression(out string value) { + value = string.Empty; StringBuilder builder = new StringBuilder(); + Get(); + builder.Append(t.val); + while (StartOf(2)) { + Get(); + builder.Append(t.val); + } + value = builder.ToString(); + } + + void ArgList(out FunctionArgument[] args) { + List list = new List(); FunctionArgument a = new FunctionArgument { Name = string.Empty, Value = new FunctionValue() }; args = new FunctionArgument[0]; + if (StartOf(3)) { + Arg(out a); + list.Add(a); args = list.ToArray(); + while (la.kind == 17) { + Get(); + Arg(out a); + list.Add(a); args = list.ToArray(); + } + } + } + + void Arg(out FunctionArgument arg) { + arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue() }; decimal r = 0; string s = string.Empty; + if (la.kind == 6) { + Get(); + s = t.val.Substring(1, t.val.Length - 2); arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue(ValueType.String, s) }; + } else if (StartOf(1)) { + Expression(out r); + arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue(ValueType.Numeric, r) }; + } else SynErr(26); + } + + + + public void Parse() { + la = new Token(); + la.val = ""; + Get(); + INTERPRETER(); + Expect(0); + + } + + static readonly bool[,] set = { + {_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, + {_x,_T,_x,_T, _T,_T,_x,_T, _x,_x,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, + {_x,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_x}, + {_x,_T,_x,_T, _T,_T,_T,_T, _x,_x,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x} + + }; +} // end Parser + + +public class Errors { + public int count = 0; // number of errors detected + public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream + public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text + + public virtual void SynErr (int line, int col, int n) { + string s; + switch (n) { + case 0: s = "EOF expected"; break; + case 1: s = "identifier expected"; break; + case 2: s = "sign expected"; break; + case 3: s = "binary expected"; break; + case 4: s = "hex expected"; break; + case 5: s = "number expected"; break; + case 6: s = "string expected"; break; + case 7: s = "LPAREN expected"; break; + case 8: s = "RPAREN expected"; break; + case 9: s = "COMPARER expected"; break; + case 10: s = "\"+\" expected"; break; + case 11: s = "\"-\" expected"; break; + case 12: s = "\"*\" expected"; break; + case 13: s = "\"/\" expected"; break; + case 14: s = "\"%\" expected"; break; + case 15: s = "\"^\" expected"; break; + case 16: s = "\"[\" expected"; break; + case 17: s = "\",\" expected"; break; + case 18: s = "\"]\" expected"; break; + case 19: s = "\"::\" expected"; break; + case 20: s = "\":=\" expected"; break; + case 21: s = "\"->\" expected"; break; + case 22: s = "??? expected"; break; + case 23: s = "invalid INTERPRETER"; break; + case 24: s = "invalid Assignment"; break; + case 25: s = "invalid Value"; break; + case 26: s = "invalid Arg"; break; + + default: s = "error " + n; break; + } + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public virtual void SemErr (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public virtual void SemErr (string s) { + errorStream.WriteLine(s); + count++; + } + + public virtual void Warning (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + } + + public virtual void Warning(string s) { + errorStream.WriteLine(s); + } +} // Errors + + +public class FatalError: Exception { + public FatalError(string m): base(m) {} +} +} \ No newline at end of file diff --git a/src/core/cocor/Parser.cs.old b/src/core/cocor/Parser.cs.old new file mode 100644 index 0000000..639d4f6 --- /dev/null +++ b/src/core/cocor/Parser.cs.old @@ -0,0 +1,522 @@ +using System; +using System.Text; +using System.Collections.Generic; +using csmic; + + + +using System; + +namespace csmic.Interpreter { + + + +public class Parser { + public const int _EOF = 0; + public const int _identifier = 1; + public const int _sign = 2; + public const int _binary = 3; + public const int _hex = 4; + public const int _number = 5; + public const int _string = 6; + public const int _LPAREN = 7; + public const int _RPAREN = 8; + public const int _COMPARER = 9; + public const int maxT = 22; + + const bool _T = true; + const bool _x = false; + const int minErrDist = 2; + + public Scanner scanner; + public Errors errors; + + public Token t; // last recognized token + public Token la; // lookahead token + int errDist = minErrDist; + +private FunctionValue functionValue = new FunctionValue(); + +public FunctionValue Result +{ + get { return this.functionValue; } + set { this.functionValue = value; } +} + +private InputInterpreter interpreter = null; + +public InputInterpreter Interpreter +{ + get { return this.interpreter; } + set { this.interpreter = value; } +} + +bool IsFunctionCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _LPAREN && la.kind == _identifier) return true; + return false; +} + +bool IsCompare() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.kind == _COMPARER) return true; + return false; +} + +bool IsAssignment() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.val == "::" || next.val == ":=" || next.val == "->") return true; + return false; +} + +bool IsArrayCall() +{ + scanner.ResetPeek(); + Token next = scanner.Peek(); + if (next.val == "[") return true; + return false; +} + +/* + * Character sets and tokens + */ + + + + public Parser(Scanner scanner) { + this.scanner = scanner; + errors = new Errors(); + } + + void SynErr (int n) { + if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n); + errDist = 0; + } + + public void SemErr (string msg) { + if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg); + errDist = 0; + } + + void Get () { + for (;;) { + t = la; + la = scanner.Scan(); + if (la.kind <= maxT) { ++errDist; break; } + + la = t; + } + } + + void Expect (int n) { + if (la.kind==n) Get(); else { SynErr(n); } + } + + bool StartOf (int s) { + return set[s, la.kind]; + } + + void ExpectWeak (int n, int follow) { + if (la.kind == n) Get(); + else { + SynErr(n); + while (!StartOf(follow)) Get(); + } + } + + + bool WeakSeparator(int n, int syFol, int repFol) { + int kind = la.kind; + if (kind == n) {Get(); return true;} + else if (StartOf(repFol)) {return false;} + else { + SynErr(n); + while (!(set[syFol, kind] || set[repFol, kind] || set[0, kind])) { + Get(); + kind = la.kind; + } + return StartOf(syFol); + } + } + + + void INTERPRETER() { + FunctionValue fv = new FunctionValue(); + bool success = true; + decimal r = 0.0; + if (this.interpreter == null) { return; } + + if (IsCompare()) { + Comparison(out success); + this.functionValue = (success == true) ? FunctionValue.TRUE : FunctionValue.FALSE; + this.interpreter.ProduceOutput(this.functionValue); + + } else if (IsAssignment()) { + Assignment(out r); + this.functionValue = new FunctionValue(ValueType.Numeric, r); + this.interpreter.ProduceOutput(this.functionValue); + + } else if (StartOf(1)) { + Expression(out r); + this.functionValue = new FunctionValue(ValueType.Numeric, r); + this.interpreter.ProduceOutput(this.functionValue); + + } else SynErr(23); + } + + void Comparison(out bool result) { + decimal firstValue = 0; decimal secondValue = 0; string compareType = string.Empty; result = false; + Expression(out firstValue); + Expect(9); + compareType = t.val; + Expression(out secondValue); + switch(compareType) + { + case "==": result = (firstValue == secondValue); break; + case ">": result = (firstValue > secondValue); break; + case "<": result = (firstValue < secondValue); break; + case ">=": result = (firstValue >= secondValue); break; + case "<=": result = (firstValue <= secondValue); break; + default: result = false; break; + } + + } + + void Assignment(out decimal r) { + string identifier = string.Empty; string expression = string.Empty; decimal[] d = new decimal[0]; r = 0; + Expect(1); + identifier = t.val; + if (la.kind == 19) { + Get(); + Expression(out r); + this.interpreter.AssignNumeric(identifier, r); + } else if (la.kind == 20) { + Get(); + AnyExpression(out expression); + this.interpreter.AssignExpression(identifier, expression); r = 0; + } else if (la.kind == 21) { + Get(); + ArrayL(out d); + this.interpreter.AssignNumericArray(identifier, d); r = 0; + } else SynErr(24); + } + + void Expression(out decimal r) { + decimal r1 = 0; r = 0; + Term(out r); + while (la.kind == 10 || la.kind == 11) { + if (la.kind == 10) { + Get(); + Term(out r1); + r += r1; + } else { + Get(); + Term(out r1); + r -= r1; + } + } + } + + void Term(out decimal r) { + decimal r1 = 0; r = 0; + Factor(out r); + while (la.kind == 12 || la.kind == 13 || la.kind == 14) { + if (la.kind == 12) { + Get(); + Factor(out r1); + r *= r1; + } else if (la.kind == 13) { + Get(); + Factor(out r1); + r /= r1; + } else { + Get(); + Term(out r1); + r %= r1; + } + } + } + + void Factor(out decimal r) { + decimal r1 = 0; + Value(out r); + while (la.kind == 15) { + Get(); + Expression(out r1); + r = Convert.ToDecimal(Math.Pow(Convert.ToDouble(r), Convert.ToDouble(r1))); + } + } + + void Value(out decimal r) { + r = 0; decimal r1 = 0; int signum = 1; + FunctionValue fvr = new FunctionValue(); + string ident = string.Empty; + + if (la.kind == 10 || la.kind == 11) { + if (la.kind == 10) { + Get(); + } else { + Get(); + signum = -1; + } + } + if (IsFunctionCall()) { + Function(out fvr); + if (fvr.Type == ValueType.Numeric && fvr.Value != null) + { + try { r = signum * Convert.ToDecimal(fvr.Value); } + catch { SemErr("function returned non-numeric"); r = 0; } + } + else + { + SemErr("function returned a string; number required"); + r = 0; + } + + } else if (IsArrayCall()) { + ArrayCall(out r); + r = signum * r; + } else if (la.kind == 1) { + Get(); + ident = t.val; + decimal temp = 0; + string expr = string.Empty; + bool ok = false; + // Prefer numeric binding + try + { + // runtime method expected + ok = this.interpreter.TryGetNumeric(ident, out temp); + } + catch { ok = false; } + if (ok) + { + r = signum * temp; + } + else + { + // Check expression binding + try + { + if (this.interpreter.TryGetExpression(ident, out expr)) + { + FunctionValue eval = this.interpreter.EvaluateExpression(expr); + if (eval.Type == ValueType.Numeric && eval.Value != null) + { + r = signum * Convert.ToDecimal(eval.Value); + } + else + { + SemErr("expression variable did not evaluate to a number"); + r = 0; + } + } + else + { + SemErr("variable '" + ident + "' is not numeric"); + r = 0; + } + } + catch { SemErr("error evaluating expression variable"); r = 0; } + } + + } else if (la.kind == 5) { + Get(); + r = signum * Convert.ToDecimal(t.val); + } else if (la.kind == 4) { + Get(); + string hx = t.val.Remove(0,2); + try { r = signum * Convert.ToDecimal(Convert.ToInt64(hx, 16)); } + catch { r = 0; } + + } else if (la.kind == 3) { + Get(); + string bx = t.val.Remove(t.val.Length - 1); + try { r = signum * Convert.ToDecimal(Convert.ToInt64(bx, 2)); } + catch { r = 0; } + + } else if (la.kind == 7) { + Get(); + Expression(out r); + Expect(8); + r = signum * r; + } else SynErr(25); + } + + void Function(out FunctionValue r) { + string functionName = string.Empty; FunctionArgument[] args = new FunctionArgument[0]; r = new FunctionValue(); + Expect(1); + functionName = t.val; + Expect(7); + ArgList(out args); + Expect(8); + r = this.interpreter.ExecuteFunction(functionName, args); + } + + void ArrayCall(out decimal r) { + string ident = string.Empty; r = 0; decimal pos = 0; + Expect(1); + ident = t.val; + Expect(16); + Expression(out pos); + try + { + int i = Convert.ToInt32(pos); + decimal[] values; + if (this.interpreter.TryGetNumericArray(ident, out values)) + { + if (i >= 0 && i < values.Length) { r = values[i]; } + else { SemErr("array index out of range"); r = 0; } + } + else + { + SemErr("variable '" + ident + "' is not a numeric array"); + r = 0; + } + } + catch { SemErr("invalid array index"); r = 0; } + + Expect(18); + } + + void ArrayL(out decimal[] d) { + List list = new List(); decimal r = 0; d = new decimal[0]; + Expect(16); + Expression(out r); + list.Add(r); d = list.ToArray(); + while (la.kind == 17) { + Get(); + Expression(out r); + list.Add(r); d = list.ToArray(); + } + Expect(18); + } + + void AnyExpression(out string value) { + value = string.Empty; StringBuilder builder = new StringBuilder(); + Get(); + builder.Append(t.val); + while (StartOf(2)) { + Get(); + builder.Append(t.val); + } + value = builder.ToString(); + } + + void ArgList(out FunctionArgument[] args) { + List list = new List(); FunctionArgument a = new FunctionArgument { Name = string.Empty, Value = new FunctionValue() }; args = new FunctionArgument[0]; + if (StartOf(3)) { + Arg(out a); + list.Add(a); args = list.ToArray(); + while (la.kind == 17) { + Get(); + Arg(out a); + list.Add(a); args = list.ToArray(); + } + } + } + + void Arg(out FunctionArgument arg) { + arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue() }; decimal r = 0; string s = string.Empty; + if (la.kind == 6) { + Get(); + s = t.val.Substring(1, t.val.Length - 2); arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue(ValueType.String, s) }; + } else if (StartOf(1)) { + Expression(out r); + arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue(ValueType.Numeric, r) }; + } else SynErr(26); + } + + + + public void Parse() { + la = new Token(); + la.val = ""; + Get(); + INTERPRETER(); + Expect(0); + + } + + static readonly bool[,] set = { + {_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, + {_x,_T,_x,_T, _T,_T,_x,_T, _x,_x,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, + {_x,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_x}, + {_x,_T,_x,_T, _T,_T,_T,_T, _x,_x,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x} + + }; +} // end Parser + + +public class Errors { + public int count = 0; // number of errors detected + public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream + public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text + + public virtual void SynErr (int line, int col, int n) { + string s; + switch (n) { + case 0: s = "EOF expected"; break; + case 1: s = "identifier expected"; break; + case 2: s = "sign expected"; break; + case 3: s = "binary expected"; break; + case 4: s = "hex expected"; break; + case 5: s = "number expected"; break; + case 6: s = "string expected"; break; + case 7: s = "LPAREN expected"; break; + case 8: s = "RPAREN expected"; break; + case 9: s = "COMPARER expected"; break; + case 10: s = "\"+\" expected"; break; + case 11: s = "\"-\" expected"; break; + case 12: s = "\"*\" expected"; break; + case 13: s = "\"/\" expected"; break; + case 14: s = "\"%\" expected"; break; + case 15: s = "\"^\" expected"; break; + case 16: s = "\"[\" expected"; break; + case 17: s = "\",\" expected"; break; + case 18: s = "\"]\" expected"; break; + case 19: s = "\"::\" expected"; break; + case 20: s = "\":=\" expected"; break; + case 21: s = "\"->\" expected"; break; + case 22: s = "??? expected"; break; + case 23: s = "invalid INTERPRETER"; break; + case 24: s = "invalid Assignment"; break; + case 25: s = "invalid Value"; break; + case 26: s = "invalid Arg"; break; + + default: s = "error " + n; break; + } + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public virtual void SemErr (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + count++; + } + + public virtual void SemErr (string s) { + errorStream.WriteLine(s); + count++; + } + + public virtual void Warning (int line, int col, string s) { + errorStream.WriteLine(errMsgFormat, line, col, s); + } + + public virtual void Warning(string s) { + errorStream.WriteLine(s); + } +} // Errors + + +public class FatalError: Exception { + public FatalError(string m): base(m) {} +} +} \ No newline at end of file diff --git a/src/core/cocor/Scanner.cs b/src/core/cocor/Scanner.cs new file mode 100644 index 0000000..023a785 --- /dev/null +++ b/src/core/cocor/Scanner.cs @@ -0,0 +1,489 @@ + +using System; +using System.IO; +using System.Collections; + +namespace csmic.Interpreter { + +public class Token { + public int kind; // token kind + public int pos; // token position in bytes in the source text (starting at 0) + public int charPos; // token position in characters in the source text (starting at 0) + public int col; // token column (starting at 1) + public int line; // token line (starting at 1) + public string val; // token value + public Token next; // ML 2005-03-11 Tokens are kept in linked list +} + +//----------------------------------------------------------------------------------- +// Buffer +//----------------------------------------------------------------------------------- +public class Buffer { + // This Buffer supports the following cases: + // 1) seekable stream (file) + // a) whole stream in buffer + // b) part of stream in buffer + // 2) non seekable stream (network, console) + + public const int EOF = char.MaxValue + 1; + const int MIN_BUFFER_LENGTH = 1024; // 1KB + const int MAX_BUFFER_LENGTH = MIN_BUFFER_LENGTH * 64; // 64KB + byte[] buf; // input buffer + int bufStart; // position of first byte in buffer relative to input stream + int bufLen; // length of buffer + int fileLen; // length of input stream (may change if the stream is no file) + int bufPos; // current position in buffer + Stream stream; // input stream (seekable) + bool isUserStream; // was the stream opened by the user? + + public Buffer (Stream s, bool isUserStream) { + stream = s; this.isUserStream = isUserStream; + + if (stream.CanSeek) { + fileLen = (int) stream.Length; + bufLen = Math.Min(fileLen, MAX_BUFFER_LENGTH); + bufStart = Int32.MaxValue; // nothing in the buffer so far + } else { + fileLen = bufLen = bufStart = 0; + } + + buf = new byte[(bufLen>0) ? bufLen : MIN_BUFFER_LENGTH]; + if (fileLen > 0) Pos = 0; // setup buffer to position 0 (start) + else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid + if (bufLen == fileLen && stream.CanSeek) Close(); + } + + protected Buffer(Buffer b) { // called in UTF8Buffer constructor + buf = b.buf; + bufStart = b.bufStart; + bufLen = b.bufLen; + fileLen = b.fileLen; + bufPos = b.bufPos; + stream = b.stream; + // keep destructor from closing the stream + b.stream = null; + isUserStream = b.isUserStream; + } + + ~Buffer() { Close(); } + + protected void Close() { + if (!isUserStream && stream != null) { + stream.Close(); + stream = null; + } + } + + public virtual int Read () { + if (bufPos < bufLen) { + return buf[bufPos++]; + } else if (Pos < fileLen) { + Pos = Pos; // shift buffer start to Pos + return buf[bufPos++]; + } else if (stream != null && !stream.CanSeek && ReadNextStreamChunk() > 0) { + return buf[bufPos++]; + } else { + return EOF; + } + } + + public int Peek () { + int curPos = Pos; + int ch = Read(); + Pos = curPos; + return ch; + } + + // beg .. begin, zero-based, inclusive, in byte + // end .. end, zero-based, exclusive, in byte + public string GetString (int beg, int end) { + int len = 0; + char[] buf = new char[end - beg]; + int oldPos = Pos; + Pos = beg; + while (Pos < end) buf[len++] = (char) Read(); + Pos = oldPos; + return new String(buf, 0, len); + } + + public int Pos { + get { return bufPos + bufStart; } + set { + if (value >= fileLen && stream != null && !stream.CanSeek) { + // Wanted position is after buffer and the stream + // is not seek-able e.g. network or console, + // thus we have to read the stream manually till + // the wanted position is in sight. + while (value >= fileLen && ReadNextStreamChunk() > 0); + } + + if (value < 0 || value > fileLen) { + throw new FatalError("buffer out of bounds access, position: " + value); + } + + if (value >= bufStart && value < bufStart + bufLen) { // already in buffer + bufPos = value - bufStart; + } else if (stream != null) { // must be swapped in + stream.Seek(value, SeekOrigin.Begin); + bufLen = stream.Read(buf, 0, buf.Length); + bufStart = value; bufPos = 0; + } else { + // set the position to the end of the file, Pos will return fileLen. + bufPos = fileLen - bufStart; + } + } + } + + // Read the next chunk of bytes from the stream, increases the buffer + // if needed and updates the fields fileLen and bufLen. + // Returns the number of bytes read. + private int ReadNextStreamChunk() { + int free = buf.Length - bufLen; + if (free == 0) { + // in the case of a growing input stream + // we can neither seek in the stream, nor can we + // foresee the maximum length, thus we must adapt + // the buffer size on demand. + byte[] newBuf = new byte[bufLen * 2]; + Array.Copy(buf, newBuf, bufLen); + buf = newBuf; + free = bufLen; + } + int read = stream.Read(buf, bufLen, free); + if (read > 0) { + fileLen = bufLen = (bufLen + read); + return read; + } + // end of stream reached + return 0; + } +} + +//----------------------------------------------------------------------------------- +// UTF8Buffer +//----------------------------------------------------------------------------------- +public class UTF8Buffer: Buffer { + public UTF8Buffer(Buffer b): base(b) {} + + public override int Read() { + int ch; + do { + ch = base.Read(); + // until we find a utf8 start (0xxxxxxx or 11xxxxxx) + } while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EOF)); + if (ch < 128 || ch == EOF) { + // nothing to do, first 127 chars are the same in ascii and utf8 + // 0xxxxxxx or end of file character + } else if ((ch & 0xF0) == 0xF0) { + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x07; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; ch = base.Read(); + int c4 = ch & 0x3F; + ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4; + } else if ((ch & 0xE0) == 0xE0) { + // 1110xxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x0F; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; + ch = (((c1 << 6) | c2) << 6) | c3; + } else if ((ch & 0xC0) == 0xC0) { + // 110xxxxx 10xxxxxx + int c1 = ch & 0x1F; ch = base.Read(); + int c2 = ch & 0x3F; + ch = (c1 << 6) | c2; + } + return ch; + } +} + +//----------------------------------------------------------------------------------- +// Scanner +//----------------------------------------------------------------------------------- +public class Scanner { + const char EOL = '\n'; + const int eofSym = 0; /* pdt */ + const int maxT = 22; + const int noSym = 22; + + + public Buffer buffer; // scanner buffer + + Token t; // current token + int ch; // current input character + int pos; // byte position of current character + int charPos; // position by unicode characters starting with 0 + int col; // column number of current character + int line; // line number of current character + int oldEols; // EOLs that appeared in a comment; + static readonly Hashtable start; // maps first token character to start state + + Token tokens; // list of tokens already peeked (first token is a dummy) + Token pt; // current peek token + + char[] tval = new char[128]; // text of current token + int tlen; // length of current token + + static Scanner() { + start = new Hashtable(128); + for (int i = 65; i <= 90; ++i) start[i] = 1; + for (int i = 97; i <= 122; ++i) start[i] = 1; + start[43] = 2; + for (int i = 50; i <= 57; ++i) start[i] = 6; + start[48] = 17; + start[49] = 18; + start[34] = 11; + start[40] = 13; + start[41] = 14; + start[61] = 15; + start[60] = 19; + start[62] = 20; + start[42] = 21; + start[47] = 22; + start[37] = 23; + start[94] = 24; + start[91] = 25; + start[44] = 26; + start[93] = 27; + start[58] = 31; + start[45] = 32; + start[Buffer.EOF] = -1; + + } + + public Scanner (string fileName) { + try { + Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + buffer = new Buffer(stream, false); + Init(); + } catch (IOException) { + throw new FatalError("Cannot open file " + fileName); + } + } + + public Scanner (Stream s) { + buffer = new Buffer(s, true); + Init(); + } + + void Init() { + pos = -1; line = 1; col = 0; charPos = -1; + oldEols = 0; + NextCh(); + if (ch == 0xEF) { // check optional byte order mark for UTF-8 + NextCh(); int ch1 = ch; + NextCh(); int ch2 = ch; + if (ch1 != 0xBB || ch2 != 0xBF) { + throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2)); + } + buffer = new UTF8Buffer(buffer); col = 0; charPos = -1; + NextCh(); + } + pt = tokens = new Token(); // first token is a dummy + } + + void NextCh() { + if (oldEols > 0) { ch = EOL; oldEols--; } + else { + pos = buffer.Pos; + // buffer reads unicode chars, if UTF8 has been detected + ch = buffer.Read(); col++; charPos++; + // replace isolated '\r' by '\n' in order to make + // eol handling uniform across Windows, Unix and Mac + if (ch == '\r' && buffer.Peek() != '\n') ch = EOL; + if (ch == EOL) { line++; col = 0; } + } + + } + + void AddCh() { + if (tlen >= tval.Length) { + char[] newBuf = new char[2 * tval.Length]; + Array.Copy(tval, 0, newBuf, 0, tval.Length); + tval = newBuf; + } + if (ch != Buffer.EOF) { + tval[tlen++] = (char) ch; + NextCh(); + } + } + + + + + void CheckLiteral() { + switch (t.val) { + case "+": t.kind = 10; break; + case "-": t.kind = 11; break; + default: break; + } + } + + Token NextToken() { + while (ch == ' ' || + ch == 9 || ch == 13 + ) NextCh(); + + int recKind = noSym; + int recEnd = pos; + t = new Token(); + t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; + int state; + if (start.ContainsKey(ch)) { state = (int) start[ch]; } + else { state = 0; } + tlen = 0; AddCh(); + + switch (state) { + case -1: { t.kind = eofSym; break; } // NextCh already done + case 0: { + if (recKind != noSym) { + tlen = recEnd - t.pos; + SetScannerBehindT(); + } + t.kind = recKind; break; + } // NextCh already done + case 1: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} + else {t.kind = 1; break;} + case 2: + {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 3: + {t.kind = 3; break;} + case 4: + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} + else {goto case 0;} + case 5: + recEnd = pos; recKind = 4; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} + else {t.kind = 4; break;} + case 6: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 7: + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else if (ch == '+' || ch == '-') {AddCh(); goto case 8;} + else {goto case 0;} + case 8: + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else {goto case 0;} + case 9: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else {t.kind = 5; break;} + case 10: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 10;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else {t.kind = 5; break;} + case 11: + if (ch <= '!' || ch >= '#' && ch <= 65535) {AddCh(); goto case 11;} + else if (ch == '"') {AddCh(); goto case 12;} + else {goto case 0;} + case 12: + {t.kind = 6; break;} + case 13: + {t.kind = 7; break;} + case 14: + {t.kind = 8; break;} + case 15: + if (ch == '=') {AddCh(); goto case 16;} + else {goto case 0;} + case 16: + {t.kind = 9; break;} + case 17: + recEnd = pos; recKind = 5; + if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} + else if (ch >= '0' && ch <= '1') {AddCh(); goto case 18;} + else if (ch == 'x') {AddCh(); goto case 4;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 18: + recEnd = pos; recKind = 5; + if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} + else if (ch >= '0' && ch <= '1') {AddCh(); goto case 18;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 19: + recEnd = pos; recKind = 9; + if (ch == '=') {AddCh(); goto case 16;} + else {t.kind = 9; break;} + case 20: + recEnd = pos; recKind = 9; + if (ch == '=') {AddCh(); goto case 16;} + else {t.kind = 9; break;} + case 21: + {t.kind = 12; break;} + case 22: + {t.kind = 13; break;} + case 23: + {t.kind = 14; break;} + case 24: + {t.kind = 15; break;} + case 25: + {t.kind = 16; break;} + case 26: + {t.kind = 17; break;} + case 27: + {t.kind = 18; break;} + case 28: + {t.kind = 19; break;} + case 29: + {t.kind = 20; break;} + case 30: + {t.kind = 21; break;} + case 31: + if (ch == ':') {AddCh(); goto case 28;} + else if (ch == '=') {AddCh(); goto case 29;} + else {goto case 0;} + case 32: + recEnd = pos; recKind = 2; + if (ch == '>') {AddCh(); goto case 30;} + else {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + + } + t.val = new String(tval, 0, tlen); + return t; + } + + private void SetScannerBehindT() { + buffer.Pos = t.pos; + NextCh(); + line = t.line; col = t.col; charPos = t.charPos; + for (int i = 0; i < tlen; i++) NextCh(); + } + + // get the next token (possibly a token already seen during peeking) + public Token Scan () { + if (tokens.next == null) { + return NextToken(); + } else { + pt = tokens = tokens.next; + return tokens; + } + } + + // peek for the next token, ignore pragmas + public Token Peek () { + do { + if (pt.next == null) { + pt.next = NextToken(); + } + pt = pt.next; + } while (pt.kind > maxT); // skip pragmas + + return pt; + } + + // make sure that peeking starts at the current scan position + public void ResetPeek () { pt = tokens; } + +} // end Scanner +} \ No newline at end of file diff --git a/src/core/cocor/Scanner.cs.old b/src/core/cocor/Scanner.cs.old new file mode 100644 index 0000000..023a785 --- /dev/null +++ b/src/core/cocor/Scanner.cs.old @@ -0,0 +1,489 @@ + +using System; +using System.IO; +using System.Collections; + +namespace csmic.Interpreter { + +public class Token { + public int kind; // token kind + public int pos; // token position in bytes in the source text (starting at 0) + public int charPos; // token position in characters in the source text (starting at 0) + public int col; // token column (starting at 1) + public int line; // token line (starting at 1) + public string val; // token value + public Token next; // ML 2005-03-11 Tokens are kept in linked list +} + +//----------------------------------------------------------------------------------- +// Buffer +//----------------------------------------------------------------------------------- +public class Buffer { + // This Buffer supports the following cases: + // 1) seekable stream (file) + // a) whole stream in buffer + // b) part of stream in buffer + // 2) non seekable stream (network, console) + + public const int EOF = char.MaxValue + 1; + const int MIN_BUFFER_LENGTH = 1024; // 1KB + const int MAX_BUFFER_LENGTH = MIN_BUFFER_LENGTH * 64; // 64KB + byte[] buf; // input buffer + int bufStart; // position of first byte in buffer relative to input stream + int bufLen; // length of buffer + int fileLen; // length of input stream (may change if the stream is no file) + int bufPos; // current position in buffer + Stream stream; // input stream (seekable) + bool isUserStream; // was the stream opened by the user? + + public Buffer (Stream s, bool isUserStream) { + stream = s; this.isUserStream = isUserStream; + + if (stream.CanSeek) { + fileLen = (int) stream.Length; + bufLen = Math.Min(fileLen, MAX_BUFFER_LENGTH); + bufStart = Int32.MaxValue; // nothing in the buffer so far + } else { + fileLen = bufLen = bufStart = 0; + } + + buf = new byte[(bufLen>0) ? bufLen : MIN_BUFFER_LENGTH]; + if (fileLen > 0) Pos = 0; // setup buffer to position 0 (start) + else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid + if (bufLen == fileLen && stream.CanSeek) Close(); + } + + protected Buffer(Buffer b) { // called in UTF8Buffer constructor + buf = b.buf; + bufStart = b.bufStart; + bufLen = b.bufLen; + fileLen = b.fileLen; + bufPos = b.bufPos; + stream = b.stream; + // keep destructor from closing the stream + b.stream = null; + isUserStream = b.isUserStream; + } + + ~Buffer() { Close(); } + + protected void Close() { + if (!isUserStream && stream != null) { + stream.Close(); + stream = null; + } + } + + public virtual int Read () { + if (bufPos < bufLen) { + return buf[bufPos++]; + } else if (Pos < fileLen) { + Pos = Pos; // shift buffer start to Pos + return buf[bufPos++]; + } else if (stream != null && !stream.CanSeek && ReadNextStreamChunk() > 0) { + return buf[bufPos++]; + } else { + return EOF; + } + } + + public int Peek () { + int curPos = Pos; + int ch = Read(); + Pos = curPos; + return ch; + } + + // beg .. begin, zero-based, inclusive, in byte + // end .. end, zero-based, exclusive, in byte + public string GetString (int beg, int end) { + int len = 0; + char[] buf = new char[end - beg]; + int oldPos = Pos; + Pos = beg; + while (Pos < end) buf[len++] = (char) Read(); + Pos = oldPos; + return new String(buf, 0, len); + } + + public int Pos { + get { return bufPos + bufStart; } + set { + if (value >= fileLen && stream != null && !stream.CanSeek) { + // Wanted position is after buffer and the stream + // is not seek-able e.g. network or console, + // thus we have to read the stream manually till + // the wanted position is in sight. + while (value >= fileLen && ReadNextStreamChunk() > 0); + } + + if (value < 0 || value > fileLen) { + throw new FatalError("buffer out of bounds access, position: " + value); + } + + if (value >= bufStart && value < bufStart + bufLen) { // already in buffer + bufPos = value - bufStart; + } else if (stream != null) { // must be swapped in + stream.Seek(value, SeekOrigin.Begin); + bufLen = stream.Read(buf, 0, buf.Length); + bufStart = value; bufPos = 0; + } else { + // set the position to the end of the file, Pos will return fileLen. + bufPos = fileLen - bufStart; + } + } + } + + // Read the next chunk of bytes from the stream, increases the buffer + // if needed and updates the fields fileLen and bufLen. + // Returns the number of bytes read. + private int ReadNextStreamChunk() { + int free = buf.Length - bufLen; + if (free == 0) { + // in the case of a growing input stream + // we can neither seek in the stream, nor can we + // foresee the maximum length, thus we must adapt + // the buffer size on demand. + byte[] newBuf = new byte[bufLen * 2]; + Array.Copy(buf, newBuf, bufLen); + buf = newBuf; + free = bufLen; + } + int read = stream.Read(buf, bufLen, free); + if (read > 0) { + fileLen = bufLen = (bufLen + read); + return read; + } + // end of stream reached + return 0; + } +} + +//----------------------------------------------------------------------------------- +// UTF8Buffer +//----------------------------------------------------------------------------------- +public class UTF8Buffer: Buffer { + public UTF8Buffer(Buffer b): base(b) {} + + public override int Read() { + int ch; + do { + ch = base.Read(); + // until we find a utf8 start (0xxxxxxx or 11xxxxxx) + } while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EOF)); + if (ch < 128 || ch == EOF) { + // nothing to do, first 127 chars are the same in ascii and utf8 + // 0xxxxxxx or end of file character + } else if ((ch & 0xF0) == 0xF0) { + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x07; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; ch = base.Read(); + int c4 = ch & 0x3F; + ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4; + } else if ((ch & 0xE0) == 0xE0) { + // 1110xxxx 10xxxxxx 10xxxxxx + int c1 = ch & 0x0F; ch = base.Read(); + int c2 = ch & 0x3F; ch = base.Read(); + int c3 = ch & 0x3F; + ch = (((c1 << 6) | c2) << 6) | c3; + } else if ((ch & 0xC0) == 0xC0) { + // 110xxxxx 10xxxxxx + int c1 = ch & 0x1F; ch = base.Read(); + int c2 = ch & 0x3F; + ch = (c1 << 6) | c2; + } + return ch; + } +} + +//----------------------------------------------------------------------------------- +// Scanner +//----------------------------------------------------------------------------------- +public class Scanner { + const char EOL = '\n'; + const int eofSym = 0; /* pdt */ + const int maxT = 22; + const int noSym = 22; + + + public Buffer buffer; // scanner buffer + + Token t; // current token + int ch; // current input character + int pos; // byte position of current character + int charPos; // position by unicode characters starting with 0 + int col; // column number of current character + int line; // line number of current character + int oldEols; // EOLs that appeared in a comment; + static readonly Hashtable start; // maps first token character to start state + + Token tokens; // list of tokens already peeked (first token is a dummy) + Token pt; // current peek token + + char[] tval = new char[128]; // text of current token + int tlen; // length of current token + + static Scanner() { + start = new Hashtable(128); + for (int i = 65; i <= 90; ++i) start[i] = 1; + for (int i = 97; i <= 122; ++i) start[i] = 1; + start[43] = 2; + for (int i = 50; i <= 57; ++i) start[i] = 6; + start[48] = 17; + start[49] = 18; + start[34] = 11; + start[40] = 13; + start[41] = 14; + start[61] = 15; + start[60] = 19; + start[62] = 20; + start[42] = 21; + start[47] = 22; + start[37] = 23; + start[94] = 24; + start[91] = 25; + start[44] = 26; + start[93] = 27; + start[58] = 31; + start[45] = 32; + start[Buffer.EOF] = -1; + + } + + public Scanner (string fileName) { + try { + Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); + buffer = new Buffer(stream, false); + Init(); + } catch (IOException) { + throw new FatalError("Cannot open file " + fileName); + } + } + + public Scanner (Stream s) { + buffer = new Buffer(s, true); + Init(); + } + + void Init() { + pos = -1; line = 1; col = 0; charPos = -1; + oldEols = 0; + NextCh(); + if (ch == 0xEF) { // check optional byte order mark for UTF-8 + NextCh(); int ch1 = ch; + NextCh(); int ch2 = ch; + if (ch1 != 0xBB || ch2 != 0xBF) { + throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2)); + } + buffer = new UTF8Buffer(buffer); col = 0; charPos = -1; + NextCh(); + } + pt = tokens = new Token(); // first token is a dummy + } + + void NextCh() { + if (oldEols > 0) { ch = EOL; oldEols--; } + else { + pos = buffer.Pos; + // buffer reads unicode chars, if UTF8 has been detected + ch = buffer.Read(); col++; charPos++; + // replace isolated '\r' by '\n' in order to make + // eol handling uniform across Windows, Unix and Mac + if (ch == '\r' && buffer.Peek() != '\n') ch = EOL; + if (ch == EOL) { line++; col = 0; } + } + + } + + void AddCh() { + if (tlen >= tval.Length) { + char[] newBuf = new char[2 * tval.Length]; + Array.Copy(tval, 0, newBuf, 0, tval.Length); + tval = newBuf; + } + if (ch != Buffer.EOF) { + tval[tlen++] = (char) ch; + NextCh(); + } + } + + + + + void CheckLiteral() { + switch (t.val) { + case "+": t.kind = 10; break; + case "-": t.kind = 11; break; + default: break; + } + } + + Token NextToken() { + while (ch == ' ' || + ch == 9 || ch == 13 + ) NextCh(); + + int recKind = noSym; + int recEnd = pos; + t = new Token(); + t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; + int state; + if (start.ContainsKey(ch)) { state = (int) start[ch]; } + else { state = 0; } + tlen = 0; AddCh(); + + switch (state) { + case -1: { t.kind = eofSym; break; } // NextCh already done + case 0: { + if (recKind != noSym) { + tlen = recEnd - t.pos; + SetScannerBehindT(); + } + t.kind = recKind; break; + } // NextCh already done + case 1: + recEnd = pos; recKind = 1; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} + else {t.kind = 1; break;} + case 2: + {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + case 3: + {t.kind = 3; break;} + case 4: + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} + else {goto case 0;} + case 5: + recEnd = pos; recKind = 4; + if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} + else {t.kind = 4; break;} + case 6: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 7: + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else if (ch == '+' || ch == '-') {AddCh(); goto case 8;} + else {goto case 0;} + case 8: + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else {goto case 0;} + case 9: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} + else {t.kind = 5; break;} + case 10: + recEnd = pos; recKind = 5; + if (ch >= '0' && ch <= '9') {AddCh(); goto case 10;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else {t.kind = 5; break;} + case 11: + if (ch <= '!' || ch >= '#' && ch <= 65535) {AddCh(); goto case 11;} + else if (ch == '"') {AddCh(); goto case 12;} + else {goto case 0;} + case 12: + {t.kind = 6; break;} + case 13: + {t.kind = 7; break;} + case 14: + {t.kind = 8; break;} + case 15: + if (ch == '=') {AddCh(); goto case 16;} + else {goto case 0;} + case 16: + {t.kind = 9; break;} + case 17: + recEnd = pos; recKind = 5; + if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} + else if (ch >= '0' && ch <= '1') {AddCh(); goto case 18;} + else if (ch == 'x') {AddCh(); goto case 4;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 18: + recEnd = pos; recKind = 5; + if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} + else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} + else if (ch >= '0' && ch <= '1') {AddCh(); goto case 18;} + else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} + else if (ch == '.') {AddCh(); goto case 10;} + else {t.kind = 5; break;} + case 19: + recEnd = pos; recKind = 9; + if (ch == '=') {AddCh(); goto case 16;} + else {t.kind = 9; break;} + case 20: + recEnd = pos; recKind = 9; + if (ch == '=') {AddCh(); goto case 16;} + else {t.kind = 9; break;} + case 21: + {t.kind = 12; break;} + case 22: + {t.kind = 13; break;} + case 23: + {t.kind = 14; break;} + case 24: + {t.kind = 15; break;} + case 25: + {t.kind = 16; break;} + case 26: + {t.kind = 17; break;} + case 27: + {t.kind = 18; break;} + case 28: + {t.kind = 19; break;} + case 29: + {t.kind = 20; break;} + case 30: + {t.kind = 21; break;} + case 31: + if (ch == ':') {AddCh(); goto case 28;} + else if (ch == '=') {AddCh(); goto case 29;} + else {goto case 0;} + case 32: + recEnd = pos; recKind = 2; + if (ch == '>') {AddCh(); goto case 30;} + else {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} + + } + t.val = new String(tval, 0, tlen); + return t; + } + + private void SetScannerBehindT() { + buffer.Pos = t.pos; + NextCh(); + line = t.line; col = t.col; charPos = t.charPos; + for (int i = 0; i < tlen; i++) NextCh(); + } + + // get the next token (possibly a token already seen during peeking) + public Token Scan () { + if (tokens.next == null) { + return NextToken(); + } else { + pt = tokens = tokens.next; + return tokens; + } + } + + // peek for the next token, ignore pragmas + public Token Peek () { + do { + if (pt.next == null) { + pt.next = NextToken(); + } + pt = pt.next; + } while (pt.kind > maxT); // skip pragmas + + return pt; + } + + // make sure that peeking starts at the current scan position + public void ResetPeek () { pt = tokens; } + +} // end Scanner +} \ No newline at end of file From 53a904e0b0bb7ffea5dc38a706dcacf26625068b Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Tue, 19 Aug 2025 04:31:53 -0500 Subject: [PATCH 24/54] v2: Add public Interpret(string) with soft-error semantics and elapsed time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements developer-facing Interpret API that: - Parses and executes input via generated Scanner/Parser and current interpreter state. - Returns the numeric result (decimal) and updates NumericValue/StringValue. - Emits soft errors: never throws; on error sets NumericValue=0 and StringValue to parser error format or exception message. - Restores LastExecutionTime measurement for the previous interpretation. This preserves the original nomenclature while aligning to v2’s FunctionValue model. --- src/core/InputInterpreter.cs | 41 ++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/core/InputInterpreter.cs b/src/core/InputInterpreter.cs index 9bcb797..bd409a4 100644 --- a/src/core/InputInterpreter.cs +++ b/src/core/InputInterpreter.cs @@ -10,6 +10,7 @@ namespace csmic private decimal numericValue = 0; private string stringValue = string.Empty; + private TimeSpan lastExecutionTime = TimeSpan.Zero; // Variable stores private readonly Dictionary numericVariables; @@ -47,6 +48,8 @@ namespace csmic public decimal NumericValue => numericValue; public string StringValue => stringValue; + public TimeSpan LastExecutionTime => lastExecutionTime; + #endregion #region Output Plumbing @@ -128,6 +131,44 @@ namespace csmic return parser.Result; } + // Primary developer-facing API: interpret input and return numeric result + public decimal Interpret(string input) + { + DateTime start = DateTime.Now; + try + { + using var ms = new MemoryStream(Encoding.UTF8.GetBytes(input ?? string.Empty)); + var scanner = new csmic.Interpreter.Scanner(ms); + var parser = new csmic.Interpreter.Parser(scanner) + { + Interpreter = this + }; + parser.Parse(); + + if (parser.errors.count > 0) + { + // Soft error: set numeric to 0 and report a parse error message + ProduceOutput(0m, parser.errors.errMsgFormat); + } + else + { + ProduceOutput(parser.Result); + } + } + catch (Exception ex) + { + // Soft error: never throw, capture message + ProduceOutput(0m, ex.Message); + } + finally + { + DateTime end = DateTime.Now; + lastExecutionTime = end - start; + } + + return this.numericValue; + } + #endregion #region Functions From 3efc97e9d09bc5135def29768cd7365d6e9883d9 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Tue, 19 Aug 2025 04:42:37 -0500 Subject: [PATCH 25/54] Stub test project --- src/core/cocor/Parser.cs.old | 2 +- src/tests/UnitTest1.cs | 16 ++++++++++++++++ src/tests/tests.csproj | 23 +++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/tests/UnitTest1.cs create mode 100644 src/tests/tests.csproj diff --git a/src/core/cocor/Parser.cs.old b/src/core/cocor/Parser.cs.old index 639d4f6..880d873 100644 --- a/src/core/cocor/Parser.cs.old +++ b/src/core/cocor/Parser.cs.old @@ -149,7 +149,7 @@ bool IsArrayCall() void INTERPRETER() { FunctionValue fv = new FunctionValue(); bool success = true; - decimal r = 0.0; + decimal r = 0; if (this.interpreter == null) { return; } if (IsCompare()) { diff --git a/src/tests/UnitTest1.cs b/src/tests/UnitTest1.cs new file mode 100644 index 0000000..90f7233 --- /dev/null +++ b/src/tests/UnitTest1.cs @@ -0,0 +1,16 @@ +namespace tests +{ + public class Tests + { + [SetUp] + public void Setup() + { + } + + [Test] + public void Test1() + { + Assert.Pass(); + } + } +} diff --git a/src/tests/tests.csproj b/src/tests/tests.csproj new file mode 100644 index 0000000..4407814 --- /dev/null +++ b/src/tests/tests.csproj @@ -0,0 +1,23 @@ + + + + net9.0 + latest + enable + enable + false + + + + + + + + + + + + + + + From f0670b081c29d6e31ce8a71c104a669d4a496889 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Tue, 19 Aug 2025 04:47:43 -0500 Subject: [PATCH 26/54] Added reference to core project --- src/tests/tests.csproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tests/tests.csproj b/src/tests/tests.csproj index 4407814..6c89a8b 100644 --- a/src/tests/tests.csproj +++ b/src/tests/tests.csproj @@ -16,6 +16,10 @@ + + + + From 2cfd01f06f162fd413d92b8a43f64a0c7c6da5d0 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Tue, 19 Aug 2025 04:50:05 -0500 Subject: [PATCH 27/54] Naming Convention fix --- src/tests/{UnitTest1.cs => InputInterpreterTests.cs} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/tests/{UnitTest1.cs => InputInterpreterTests.cs} (82%) diff --git a/src/tests/UnitTest1.cs b/src/tests/InputInterpreterTests.cs similarity index 82% rename from src/tests/UnitTest1.cs rename to src/tests/InputInterpreterTests.cs index 90f7233..95ec79e 100644 --- a/src/tests/UnitTest1.cs +++ b/src/tests/InputInterpreterTests.cs @@ -1,6 +1,6 @@ namespace tests { - public class Tests + public class InputInterpreterTests { [SetUp] public void Setup() From 648bd3bad0cf27e2135d32749cd692e2420acc75 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Tue, 19 Aug 2025 04:52:37 -0500 Subject: [PATCH 28/54] tests: Add NUnit suite for InputInterpreter.Interpret covering arithmetic, comparisons, variables, := binding, arrays, soft errors, and timing Adds InputInterpreterTests with: - Arithmetic cases including precedence, hex/binary, exponent. - Comparisons yielding numeric booleans. - Variable assignment (::) and persistence across calls; unknown variable soft error. - Expression binding (:=) re-evaluated at use-time; invalid expression soft error. - Array assignment (->) and indexing; out-of-range and index-expression scenarios. - String literal used as expression soft error. - Divide-by-zero soft error (no thrown exception). - LastExecutionTime measured across calls. Each test asserts both the return value and NumericValue/StringValue for consistency. --- src/tests/InputInterpreterTests.cs | 149 ++++++++++++++++++++++++++--- 1 file changed, 136 insertions(+), 13 deletions(-) diff --git a/src/tests/InputInterpreterTests.cs b/src/tests/InputInterpreterTests.cs index 95ec79e..4368e52 100644 --- a/src/tests/InputInterpreterTests.cs +++ b/src/tests/InputInterpreterTests.cs @@ -1,16 +1,139 @@ -namespace tests -{ - public class InputInterpreterTests - { - [SetUp] - public void Setup() - { - } +using System.Globalization; +using csmic; - [Test] - public void Test1() - { - Assert.Pass(); - } +namespace tests; + +public class InputInterpreterTests +{ + private InputInterpreter _interp = null!; + + [SetUp] + public void Setup() + { + CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; + _interp = new InputInterpreter(); + } + + private static void AssertSuccess(decimal result, decimal expected, InputInterpreter interp) + { + Assert.That(result, Is.EqualTo(expected)); + Assert.That(interp.NumericValue, Is.EqualTo(expected)); + Assert.That(interp.StringValue, Is.EqualTo(string.Empty)); + } + + private static void AssertSoftError(decimal result, InputInterpreter interp) + { + Assert.That(result, Is.EqualTo(0m)); + Assert.That(interp.NumericValue, Is.EqualTo(0m)); + Assert.That(string.IsNullOrEmpty(interp.StringValue), Is.False); + } + + [TestCase("2", 2)] + [TestCase("-5", -5)] + [TestCase("2+3*4", 14)] + [TestCase("(2+3)*4", 20)] + [TestCase("8/2", 4)] + [TestCase("7%4", 3)] + [TestCase("2^3", 8)] + [TestCase("1e2", 100)] + [TestCase("0xFF", 255)] + [TestCase("1010b", 10)] + public void Arithmetic_Works(string expr, decimal expected) + { + var result = _interp.Interpret(expr); + AssertSuccess(result, expected, _interp); + } + + [TestCase("2==2", 1)] + [TestCase("2<3", 1)] + [TestCase("3<2", 0)] + [TestCase("2>=2", 1)] + [TestCase("2<=1", 0)] + public void Comparisons_YieldBooleanAsNumeric(string expr, decimal expected) + { + var result = _interp.Interpret(expr); + AssertSuccess(result, expected, _interp); + } + + [Test] + public void Variables_AssignAndUse_PersistAcrossCalls() + { + AssertSuccess(_interp.Interpret("x :: 2"), 2, _interp); + AssertSuccess(_interp.Interpret("x+1"), 3, _interp); + AssertSuccess(_interp.Interpret("x :: 3"), 3, _interp); + AssertSuccess(_interp.Interpret("x+1"), 4, _interp); + } + + [Test] + public void UnknownVariable_ProducesSoftError() + { + var result = _interp.Interpret("nope + 1"); + AssertSoftError(result, _interp); + } + + [Test] + public void ExpressionBinding_EvaluatesAtUseTime() + { + AssertSuccess(_interp.Interpret("num :: 2"), 2, _interp); + AssertSuccess(_interp.Interpret("exp := 1 + num"), 0, _interp); // assignment returns 0 + AssertSuccess(_interp.Interpret("exp"), 3, _interp); + + AssertSuccess(_interp.Interpret("num :: 3"), 3, _interp); + AssertSuccess(_interp.Interpret("exp"), 4, _interp); + } + + [Test] + public void ExpressionBinding_InvalidExpression_ProducesSoftError() + { + _interp.Interpret("exp := bad + 1"); + var result = _interp.Interpret("exp"); + AssertSoftError(result, _interp); + } + + [Test] + public void Arrays_AssignAndIndex() + { + AssertSuccess(_interp.Interpret("arr -> [1,2,3]"), 0, _interp); // array assignment returns 0 + AssertSuccess(_interp.Interpret("arr[0]"), 1, _interp); + AssertSuccess(_interp.Interpret("arr[2]"), 3, _interp); + } + + [Test] + public void Arrays_OutOfRange_ProducesSoftError() + { + _interp.Interpret("arr -> [1,2,3]"); + var result = _interp.Interpret("arr[3]"); + AssertSoftError(result, _interp); + } + + [Test] + public void Arrays_IndexExpression_Works() + { + _interp.Interpret("arr -> [1,2,3]"); + _interp.Interpret("i :: 1"); + AssertSuccess(_interp.Interpret("arr[i+1]"), 3, _interp); + } + + [Test] + public void StringLiteral_Alone_IsError() + { + var result = _interp.Interpret("\"hi\""); + AssertSoftError(result, _interp); + } + + [Test] + public void DivideByZero_ProducesSoftError() + { + var result = _interp.Interpret("1/0"); + AssertSoftError(result, _interp); + } + + [Test] + public void LastExecutionTime_IsMeasured() + { + _interp.Interpret("2+2"); + Assert.That(_interp.LastExecutionTime, Is.GreaterThanOrEqualTo(TimeSpan.Zero)); + _interp.Interpret("3+3"); + Assert.That(_interp.LastExecutionTime, Is.GreaterThanOrEqualTo(TimeSpan.Zero)); } } From 362af6f7bf6f7debf354eb520532e4bc69ca6d21 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Tue, 19 Aug 2025 05:15:13 -0500 Subject: [PATCH 29/54] Fixed number to decimal parsing, additional tests --- src/core/cocor/Interpreter.atg | 3 ++- src/core/cocor/Parser.cs | 3 ++- src/core/cocor/Parser.cs.old | 3 ++- src/cs-mic.sln | 6 ++++++ src/tests/InputInterpreterTests.cs | 4 +++- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/core/cocor/Interpreter.atg b/src/core/cocor/Interpreter.atg index 7fedc2a..5d19d0d 100644 --- a/src/core/cocor/Interpreter.atg +++ b/src/core/cocor/Interpreter.atg @@ -1,4 +1,5 @@ using System; +using System.Globalization; using System.Text; using System.Collections.Generic; using csmic; @@ -217,7 +218,7 @@ Value (. } .) | - number (. r = signum * Convert.ToDecimal(t.val); .) + number (. r = signum * decimal.Parse(t.val, NumberStyles.Float); .) | hex (. string hx = t.val.Remove(0,2); try { r = signum * Convert.ToDecimal(Convert.ToInt64(hx, 16)); } diff --git a/src/core/cocor/Parser.cs b/src/core/cocor/Parser.cs index 880d873..43f1ee0 100644 --- a/src/core/cocor/Parser.cs +++ b/src/core/cocor/Parser.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; using System.Text; using System.Collections.Generic; using csmic; @@ -328,7 +329,7 @@ bool IsArrayCall() } else if (la.kind == 5) { Get(); - r = signum * Convert.ToDecimal(t.val); + r = signum * decimal.Parse(t.val, NumberStyles.Float); } else if (la.kind == 4) { Get(); string hx = t.val.Remove(0,2); diff --git a/src/core/cocor/Parser.cs.old b/src/core/cocor/Parser.cs.old index 880d873..43f1ee0 100644 --- a/src/core/cocor/Parser.cs.old +++ b/src/core/cocor/Parser.cs.old @@ -1,4 +1,5 @@ using System; +using System.Globalization; using System.Text; using System.Collections.Generic; using csmic; @@ -328,7 +329,7 @@ bool IsArrayCall() } else if (la.kind == 5) { Get(); - r = signum * Convert.ToDecimal(t.val); + r = signum * decimal.Parse(t.val, NumberStyles.Float); } else if (la.kind == 4) { Get(); string hx = t.val.Remove(0,2); diff --git a/src/cs-mic.sln b/src/cs-mic.sln index 74f32ae..eab7569 100644 --- a/src/cs-mic.sln +++ b/src/cs-mic.sln @@ -10,6 +10,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution setup.ps1 = setup.ps1 EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tests", "tests\tests.csproj", "{F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ Global {5387FF55-3044-4EB4-BB90-AD2E922131C1}.Debug|Any CPU.Build.0 = Debug|Any CPU {5387FF55-3044-4EB4-BB90-AD2E922131C1}.Release|Any CPU.ActiveCfg = Release|Any CPU {5387FF55-3044-4EB4-BB90-AD2E922131C1}.Release|Any CPU.Build.0 = Release|Any CPU + {F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/tests/InputInterpreterTests.cs b/src/tests/InputInterpreterTests.cs index 4368e52..2622526 100644 --- a/src/tests/InputInterpreterTests.cs +++ b/src/tests/InputInterpreterTests.cs @@ -36,8 +36,10 @@ public class InputInterpreterTests [TestCase("7%4", 3)] [TestCase("2^3", 8)] [TestCase("1e2", 100)] + [TestCase("2.0e2", 200)] [TestCase("0xFF", 255)] [TestCase("1010b", 10)] + [TestCase("0xFF*1010b", 2550)] public void Arithmetic_Works(string expr, decimal expected) { var result = _interp.Interpret(expr); @@ -85,7 +87,7 @@ public class InputInterpreterTests [Test] public void ExpressionBinding_InvalidExpression_ProducesSoftError() { - _interp.Interpret("exp := bad + 1"); + _interp.Interpret("exp :== bad + 1"); var result = _interp.Interpret("exp"); AssertSoftError(result, _interp); } From 0e230f7a498f5bfd62f5aad090fca5a06308a439 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Tue, 19 Aug 2025 18:48:57 -0500 Subject: [PATCH 30/54] Ignoring autogenerated .old files --- .gitignore | 4 +- src/core/cocor/Parser.cs.old | 523 ---------------------------------- src/core/cocor/Scanner.cs.old | 489 ------------------------------- 3 files changed, 3 insertions(+), 1013 deletions(-) delete mode 100644 src/core/cocor/Parser.cs.old delete mode 100644 src/core/cocor/Scanner.cs.old diff --git a/.gitignore b/.gitignore index 2f16e0d..7041ee6 100644 --- a/.gitignore +++ b/.gitignore @@ -404,4 +404,6 @@ FodyWeavers.xsd *.msi *.msix *.msm -*.msp \ No newline at end of file +*.msp +/src/core/cocor/Parser.cs.old +/src/core/cocor/Scanner.cs.old diff --git a/src/core/cocor/Parser.cs.old b/src/core/cocor/Parser.cs.old deleted file mode 100644 index 43f1ee0..0000000 --- a/src/core/cocor/Parser.cs.old +++ /dev/null @@ -1,523 +0,0 @@ -using System; -using System.Globalization; -using System.Text; -using System.Collections.Generic; -using csmic; - - - -using System; - -namespace csmic.Interpreter { - - - -public class Parser { - public const int _EOF = 0; - public const int _identifier = 1; - public const int _sign = 2; - public const int _binary = 3; - public const int _hex = 4; - public const int _number = 5; - public const int _string = 6; - public const int _LPAREN = 7; - public const int _RPAREN = 8; - public const int _COMPARER = 9; - public const int maxT = 22; - - const bool _T = true; - const bool _x = false; - const int minErrDist = 2; - - public Scanner scanner; - public Errors errors; - - public Token t; // last recognized token - public Token la; // lookahead token - int errDist = minErrDist; - -private FunctionValue functionValue = new FunctionValue(); - -public FunctionValue Result -{ - get { return this.functionValue; } - set { this.functionValue = value; } -} - -private InputInterpreter interpreter = null; - -public InputInterpreter Interpreter -{ - get { return this.interpreter; } - set { this.interpreter = value; } -} - -bool IsFunctionCall() -{ - scanner.ResetPeek(); - Token next = scanner.Peek(); - if (next.kind == _LPAREN && la.kind == _identifier) return true; - return false; -} - -bool IsCompare() -{ - scanner.ResetPeek(); - Token next = scanner.Peek(); - if (next.kind == _COMPARER) return true; - return false; -} - -bool IsAssignment() -{ - scanner.ResetPeek(); - Token next = scanner.Peek(); - if (next.val == "::" || next.val == ":=" || next.val == "->") return true; - return false; -} - -bool IsArrayCall() -{ - scanner.ResetPeek(); - Token next = scanner.Peek(); - if (next.val == "[") return true; - return false; -} - -/* - * Character sets and tokens - */ - - - - public Parser(Scanner scanner) { - this.scanner = scanner; - errors = new Errors(); - } - - void SynErr (int n) { - if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n); - errDist = 0; - } - - public void SemErr (string msg) { - if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg); - errDist = 0; - } - - void Get () { - for (;;) { - t = la; - la = scanner.Scan(); - if (la.kind <= maxT) { ++errDist; break; } - - la = t; - } - } - - void Expect (int n) { - if (la.kind==n) Get(); else { SynErr(n); } - } - - bool StartOf (int s) { - return set[s, la.kind]; - } - - void ExpectWeak (int n, int follow) { - if (la.kind == n) Get(); - else { - SynErr(n); - while (!StartOf(follow)) Get(); - } - } - - - bool WeakSeparator(int n, int syFol, int repFol) { - int kind = la.kind; - if (kind == n) {Get(); return true;} - else if (StartOf(repFol)) {return false;} - else { - SynErr(n); - while (!(set[syFol, kind] || set[repFol, kind] || set[0, kind])) { - Get(); - kind = la.kind; - } - return StartOf(syFol); - } - } - - - void INTERPRETER() { - FunctionValue fv = new FunctionValue(); - bool success = true; - decimal r = 0; - if (this.interpreter == null) { return; } - - if (IsCompare()) { - Comparison(out success); - this.functionValue = (success == true) ? FunctionValue.TRUE : FunctionValue.FALSE; - this.interpreter.ProduceOutput(this.functionValue); - - } else if (IsAssignment()) { - Assignment(out r); - this.functionValue = new FunctionValue(ValueType.Numeric, r); - this.interpreter.ProduceOutput(this.functionValue); - - } else if (StartOf(1)) { - Expression(out r); - this.functionValue = new FunctionValue(ValueType.Numeric, r); - this.interpreter.ProduceOutput(this.functionValue); - - } else SynErr(23); - } - - void Comparison(out bool result) { - decimal firstValue = 0; decimal secondValue = 0; string compareType = string.Empty; result = false; - Expression(out firstValue); - Expect(9); - compareType = t.val; - Expression(out secondValue); - switch(compareType) - { - case "==": result = (firstValue == secondValue); break; - case ">": result = (firstValue > secondValue); break; - case "<": result = (firstValue < secondValue); break; - case ">=": result = (firstValue >= secondValue); break; - case "<=": result = (firstValue <= secondValue); break; - default: result = false; break; - } - - } - - void Assignment(out decimal r) { - string identifier = string.Empty; string expression = string.Empty; decimal[] d = new decimal[0]; r = 0; - Expect(1); - identifier = t.val; - if (la.kind == 19) { - Get(); - Expression(out r); - this.interpreter.AssignNumeric(identifier, r); - } else if (la.kind == 20) { - Get(); - AnyExpression(out expression); - this.interpreter.AssignExpression(identifier, expression); r = 0; - } else if (la.kind == 21) { - Get(); - ArrayL(out d); - this.interpreter.AssignNumericArray(identifier, d); r = 0; - } else SynErr(24); - } - - void Expression(out decimal r) { - decimal r1 = 0; r = 0; - Term(out r); - while (la.kind == 10 || la.kind == 11) { - if (la.kind == 10) { - Get(); - Term(out r1); - r += r1; - } else { - Get(); - Term(out r1); - r -= r1; - } - } - } - - void Term(out decimal r) { - decimal r1 = 0; r = 0; - Factor(out r); - while (la.kind == 12 || la.kind == 13 || la.kind == 14) { - if (la.kind == 12) { - Get(); - Factor(out r1); - r *= r1; - } else if (la.kind == 13) { - Get(); - Factor(out r1); - r /= r1; - } else { - Get(); - Term(out r1); - r %= r1; - } - } - } - - void Factor(out decimal r) { - decimal r1 = 0; - Value(out r); - while (la.kind == 15) { - Get(); - Expression(out r1); - r = Convert.ToDecimal(Math.Pow(Convert.ToDouble(r), Convert.ToDouble(r1))); - } - } - - void Value(out decimal r) { - r = 0; decimal r1 = 0; int signum = 1; - FunctionValue fvr = new FunctionValue(); - string ident = string.Empty; - - if (la.kind == 10 || la.kind == 11) { - if (la.kind == 10) { - Get(); - } else { - Get(); - signum = -1; - } - } - if (IsFunctionCall()) { - Function(out fvr); - if (fvr.Type == ValueType.Numeric && fvr.Value != null) - { - try { r = signum * Convert.ToDecimal(fvr.Value); } - catch { SemErr("function returned non-numeric"); r = 0; } - } - else - { - SemErr("function returned a string; number required"); - r = 0; - } - - } else if (IsArrayCall()) { - ArrayCall(out r); - r = signum * r; - } else if (la.kind == 1) { - Get(); - ident = t.val; - decimal temp = 0; - string expr = string.Empty; - bool ok = false; - // Prefer numeric binding - try - { - // runtime method expected - ok = this.interpreter.TryGetNumeric(ident, out temp); - } - catch { ok = false; } - if (ok) - { - r = signum * temp; - } - else - { - // Check expression binding - try - { - if (this.interpreter.TryGetExpression(ident, out expr)) - { - FunctionValue eval = this.interpreter.EvaluateExpression(expr); - if (eval.Type == ValueType.Numeric && eval.Value != null) - { - r = signum * Convert.ToDecimal(eval.Value); - } - else - { - SemErr("expression variable did not evaluate to a number"); - r = 0; - } - } - else - { - SemErr("variable '" + ident + "' is not numeric"); - r = 0; - } - } - catch { SemErr("error evaluating expression variable"); r = 0; } - } - - } else if (la.kind == 5) { - Get(); - r = signum * decimal.Parse(t.val, NumberStyles.Float); - } else if (la.kind == 4) { - Get(); - string hx = t.val.Remove(0,2); - try { r = signum * Convert.ToDecimal(Convert.ToInt64(hx, 16)); } - catch { r = 0; } - - } else if (la.kind == 3) { - Get(); - string bx = t.val.Remove(t.val.Length - 1); - try { r = signum * Convert.ToDecimal(Convert.ToInt64(bx, 2)); } - catch { r = 0; } - - } else if (la.kind == 7) { - Get(); - Expression(out r); - Expect(8); - r = signum * r; - } else SynErr(25); - } - - void Function(out FunctionValue r) { - string functionName = string.Empty; FunctionArgument[] args = new FunctionArgument[0]; r = new FunctionValue(); - Expect(1); - functionName = t.val; - Expect(7); - ArgList(out args); - Expect(8); - r = this.interpreter.ExecuteFunction(functionName, args); - } - - void ArrayCall(out decimal r) { - string ident = string.Empty; r = 0; decimal pos = 0; - Expect(1); - ident = t.val; - Expect(16); - Expression(out pos); - try - { - int i = Convert.ToInt32(pos); - decimal[] values; - if (this.interpreter.TryGetNumericArray(ident, out values)) - { - if (i >= 0 && i < values.Length) { r = values[i]; } - else { SemErr("array index out of range"); r = 0; } - } - else - { - SemErr("variable '" + ident + "' is not a numeric array"); - r = 0; - } - } - catch { SemErr("invalid array index"); r = 0; } - - Expect(18); - } - - void ArrayL(out decimal[] d) { - List list = new List(); decimal r = 0; d = new decimal[0]; - Expect(16); - Expression(out r); - list.Add(r); d = list.ToArray(); - while (la.kind == 17) { - Get(); - Expression(out r); - list.Add(r); d = list.ToArray(); - } - Expect(18); - } - - void AnyExpression(out string value) { - value = string.Empty; StringBuilder builder = new StringBuilder(); - Get(); - builder.Append(t.val); - while (StartOf(2)) { - Get(); - builder.Append(t.val); - } - value = builder.ToString(); - } - - void ArgList(out FunctionArgument[] args) { - List list = new List(); FunctionArgument a = new FunctionArgument { Name = string.Empty, Value = new FunctionValue() }; args = new FunctionArgument[0]; - if (StartOf(3)) { - Arg(out a); - list.Add(a); args = list.ToArray(); - while (la.kind == 17) { - Get(); - Arg(out a); - list.Add(a); args = list.ToArray(); - } - } - } - - void Arg(out FunctionArgument arg) { - arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue() }; decimal r = 0; string s = string.Empty; - if (la.kind == 6) { - Get(); - s = t.val.Substring(1, t.val.Length - 2); arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue(ValueType.String, s) }; - } else if (StartOf(1)) { - Expression(out r); - arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue(ValueType.Numeric, r) }; - } else SynErr(26); - } - - - - public void Parse() { - la = new Token(); - la.val = ""; - Get(); - INTERPRETER(); - Expect(0); - - } - - static readonly bool[,] set = { - {_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, - {_x,_T,_x,_T, _T,_T,_x,_T, _x,_x,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, - {_x,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_x}, - {_x,_T,_x,_T, _T,_T,_T,_T, _x,_x,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x} - - }; -} // end Parser - - -public class Errors { - public int count = 0; // number of errors detected - public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream - public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text - - public virtual void SynErr (int line, int col, int n) { - string s; - switch (n) { - case 0: s = "EOF expected"; break; - case 1: s = "identifier expected"; break; - case 2: s = "sign expected"; break; - case 3: s = "binary expected"; break; - case 4: s = "hex expected"; break; - case 5: s = "number expected"; break; - case 6: s = "string expected"; break; - case 7: s = "LPAREN expected"; break; - case 8: s = "RPAREN expected"; break; - case 9: s = "COMPARER expected"; break; - case 10: s = "\"+\" expected"; break; - case 11: s = "\"-\" expected"; break; - case 12: s = "\"*\" expected"; break; - case 13: s = "\"/\" expected"; break; - case 14: s = "\"%\" expected"; break; - case 15: s = "\"^\" expected"; break; - case 16: s = "\"[\" expected"; break; - case 17: s = "\",\" expected"; break; - case 18: s = "\"]\" expected"; break; - case 19: s = "\"::\" expected"; break; - case 20: s = "\":=\" expected"; break; - case 21: s = "\"->\" expected"; break; - case 22: s = "??? expected"; break; - case 23: s = "invalid INTERPRETER"; break; - case 24: s = "invalid Assignment"; break; - case 25: s = "invalid Value"; break; - case 26: s = "invalid Arg"; break; - - default: s = "error " + n; break; - } - errorStream.WriteLine(errMsgFormat, line, col, s); - count++; - } - - public virtual void SemErr (int line, int col, string s) { - errorStream.WriteLine(errMsgFormat, line, col, s); - count++; - } - - public virtual void SemErr (string s) { - errorStream.WriteLine(s); - count++; - } - - public virtual void Warning (int line, int col, string s) { - errorStream.WriteLine(errMsgFormat, line, col, s); - } - - public virtual void Warning(string s) { - errorStream.WriteLine(s); - } -} // Errors - - -public class FatalError: Exception { - public FatalError(string m): base(m) {} -} -} \ No newline at end of file diff --git a/src/core/cocor/Scanner.cs.old b/src/core/cocor/Scanner.cs.old deleted file mode 100644 index 023a785..0000000 --- a/src/core/cocor/Scanner.cs.old +++ /dev/null @@ -1,489 +0,0 @@ - -using System; -using System.IO; -using System.Collections; - -namespace csmic.Interpreter { - -public class Token { - public int kind; // token kind - public int pos; // token position in bytes in the source text (starting at 0) - public int charPos; // token position in characters in the source text (starting at 0) - public int col; // token column (starting at 1) - public int line; // token line (starting at 1) - public string val; // token value - public Token next; // ML 2005-03-11 Tokens are kept in linked list -} - -//----------------------------------------------------------------------------------- -// Buffer -//----------------------------------------------------------------------------------- -public class Buffer { - // This Buffer supports the following cases: - // 1) seekable stream (file) - // a) whole stream in buffer - // b) part of stream in buffer - // 2) non seekable stream (network, console) - - public const int EOF = char.MaxValue + 1; - const int MIN_BUFFER_LENGTH = 1024; // 1KB - const int MAX_BUFFER_LENGTH = MIN_BUFFER_LENGTH * 64; // 64KB - byte[] buf; // input buffer - int bufStart; // position of first byte in buffer relative to input stream - int bufLen; // length of buffer - int fileLen; // length of input stream (may change if the stream is no file) - int bufPos; // current position in buffer - Stream stream; // input stream (seekable) - bool isUserStream; // was the stream opened by the user? - - public Buffer (Stream s, bool isUserStream) { - stream = s; this.isUserStream = isUserStream; - - if (stream.CanSeek) { - fileLen = (int) stream.Length; - bufLen = Math.Min(fileLen, MAX_BUFFER_LENGTH); - bufStart = Int32.MaxValue; // nothing in the buffer so far - } else { - fileLen = bufLen = bufStart = 0; - } - - buf = new byte[(bufLen>0) ? bufLen : MIN_BUFFER_LENGTH]; - if (fileLen > 0) Pos = 0; // setup buffer to position 0 (start) - else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid - if (bufLen == fileLen && stream.CanSeek) Close(); - } - - protected Buffer(Buffer b) { // called in UTF8Buffer constructor - buf = b.buf; - bufStart = b.bufStart; - bufLen = b.bufLen; - fileLen = b.fileLen; - bufPos = b.bufPos; - stream = b.stream; - // keep destructor from closing the stream - b.stream = null; - isUserStream = b.isUserStream; - } - - ~Buffer() { Close(); } - - protected void Close() { - if (!isUserStream && stream != null) { - stream.Close(); - stream = null; - } - } - - public virtual int Read () { - if (bufPos < bufLen) { - return buf[bufPos++]; - } else if (Pos < fileLen) { - Pos = Pos; // shift buffer start to Pos - return buf[bufPos++]; - } else if (stream != null && !stream.CanSeek && ReadNextStreamChunk() > 0) { - return buf[bufPos++]; - } else { - return EOF; - } - } - - public int Peek () { - int curPos = Pos; - int ch = Read(); - Pos = curPos; - return ch; - } - - // beg .. begin, zero-based, inclusive, in byte - // end .. end, zero-based, exclusive, in byte - public string GetString (int beg, int end) { - int len = 0; - char[] buf = new char[end - beg]; - int oldPos = Pos; - Pos = beg; - while (Pos < end) buf[len++] = (char) Read(); - Pos = oldPos; - return new String(buf, 0, len); - } - - public int Pos { - get { return bufPos + bufStart; } - set { - if (value >= fileLen && stream != null && !stream.CanSeek) { - // Wanted position is after buffer and the stream - // is not seek-able e.g. network or console, - // thus we have to read the stream manually till - // the wanted position is in sight. - while (value >= fileLen && ReadNextStreamChunk() > 0); - } - - if (value < 0 || value > fileLen) { - throw new FatalError("buffer out of bounds access, position: " + value); - } - - if (value >= bufStart && value < bufStart + bufLen) { // already in buffer - bufPos = value - bufStart; - } else if (stream != null) { // must be swapped in - stream.Seek(value, SeekOrigin.Begin); - bufLen = stream.Read(buf, 0, buf.Length); - bufStart = value; bufPos = 0; - } else { - // set the position to the end of the file, Pos will return fileLen. - bufPos = fileLen - bufStart; - } - } - } - - // Read the next chunk of bytes from the stream, increases the buffer - // if needed and updates the fields fileLen and bufLen. - // Returns the number of bytes read. - private int ReadNextStreamChunk() { - int free = buf.Length - bufLen; - if (free == 0) { - // in the case of a growing input stream - // we can neither seek in the stream, nor can we - // foresee the maximum length, thus we must adapt - // the buffer size on demand. - byte[] newBuf = new byte[bufLen * 2]; - Array.Copy(buf, newBuf, bufLen); - buf = newBuf; - free = bufLen; - } - int read = stream.Read(buf, bufLen, free); - if (read > 0) { - fileLen = bufLen = (bufLen + read); - return read; - } - // end of stream reached - return 0; - } -} - -//----------------------------------------------------------------------------------- -// UTF8Buffer -//----------------------------------------------------------------------------------- -public class UTF8Buffer: Buffer { - public UTF8Buffer(Buffer b): base(b) {} - - public override int Read() { - int ch; - do { - ch = base.Read(); - // until we find a utf8 start (0xxxxxxx or 11xxxxxx) - } while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EOF)); - if (ch < 128 || ch == EOF) { - // nothing to do, first 127 chars are the same in ascii and utf8 - // 0xxxxxxx or end of file character - } else if ((ch & 0xF0) == 0xF0) { - // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - int c1 = ch & 0x07; ch = base.Read(); - int c2 = ch & 0x3F; ch = base.Read(); - int c3 = ch & 0x3F; ch = base.Read(); - int c4 = ch & 0x3F; - ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4; - } else if ((ch & 0xE0) == 0xE0) { - // 1110xxxx 10xxxxxx 10xxxxxx - int c1 = ch & 0x0F; ch = base.Read(); - int c2 = ch & 0x3F; ch = base.Read(); - int c3 = ch & 0x3F; - ch = (((c1 << 6) | c2) << 6) | c3; - } else if ((ch & 0xC0) == 0xC0) { - // 110xxxxx 10xxxxxx - int c1 = ch & 0x1F; ch = base.Read(); - int c2 = ch & 0x3F; - ch = (c1 << 6) | c2; - } - return ch; - } -} - -//----------------------------------------------------------------------------------- -// Scanner -//----------------------------------------------------------------------------------- -public class Scanner { - const char EOL = '\n'; - const int eofSym = 0; /* pdt */ - const int maxT = 22; - const int noSym = 22; - - - public Buffer buffer; // scanner buffer - - Token t; // current token - int ch; // current input character - int pos; // byte position of current character - int charPos; // position by unicode characters starting with 0 - int col; // column number of current character - int line; // line number of current character - int oldEols; // EOLs that appeared in a comment; - static readonly Hashtable start; // maps first token character to start state - - Token tokens; // list of tokens already peeked (first token is a dummy) - Token pt; // current peek token - - char[] tval = new char[128]; // text of current token - int tlen; // length of current token - - static Scanner() { - start = new Hashtable(128); - for (int i = 65; i <= 90; ++i) start[i] = 1; - for (int i = 97; i <= 122; ++i) start[i] = 1; - start[43] = 2; - for (int i = 50; i <= 57; ++i) start[i] = 6; - start[48] = 17; - start[49] = 18; - start[34] = 11; - start[40] = 13; - start[41] = 14; - start[61] = 15; - start[60] = 19; - start[62] = 20; - start[42] = 21; - start[47] = 22; - start[37] = 23; - start[94] = 24; - start[91] = 25; - start[44] = 26; - start[93] = 27; - start[58] = 31; - start[45] = 32; - start[Buffer.EOF] = -1; - - } - - public Scanner (string fileName) { - try { - Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); - buffer = new Buffer(stream, false); - Init(); - } catch (IOException) { - throw new FatalError("Cannot open file " + fileName); - } - } - - public Scanner (Stream s) { - buffer = new Buffer(s, true); - Init(); - } - - void Init() { - pos = -1; line = 1; col = 0; charPos = -1; - oldEols = 0; - NextCh(); - if (ch == 0xEF) { // check optional byte order mark for UTF-8 - NextCh(); int ch1 = ch; - NextCh(); int ch2 = ch; - if (ch1 != 0xBB || ch2 != 0xBF) { - throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2)); - } - buffer = new UTF8Buffer(buffer); col = 0; charPos = -1; - NextCh(); - } - pt = tokens = new Token(); // first token is a dummy - } - - void NextCh() { - if (oldEols > 0) { ch = EOL; oldEols--; } - else { - pos = buffer.Pos; - // buffer reads unicode chars, if UTF8 has been detected - ch = buffer.Read(); col++; charPos++; - // replace isolated '\r' by '\n' in order to make - // eol handling uniform across Windows, Unix and Mac - if (ch == '\r' && buffer.Peek() != '\n') ch = EOL; - if (ch == EOL) { line++; col = 0; } - } - - } - - void AddCh() { - if (tlen >= tval.Length) { - char[] newBuf = new char[2 * tval.Length]; - Array.Copy(tval, 0, newBuf, 0, tval.Length); - tval = newBuf; - } - if (ch != Buffer.EOF) { - tval[tlen++] = (char) ch; - NextCh(); - } - } - - - - - void CheckLiteral() { - switch (t.val) { - case "+": t.kind = 10; break; - case "-": t.kind = 11; break; - default: break; - } - } - - Token NextToken() { - while (ch == ' ' || - ch == 9 || ch == 13 - ) NextCh(); - - int recKind = noSym; - int recEnd = pos; - t = new Token(); - t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; - int state; - if (start.ContainsKey(ch)) { state = (int) start[ch]; } - else { state = 0; } - tlen = 0; AddCh(); - - switch (state) { - case -1: { t.kind = eofSym; break; } // NextCh already done - case 0: { - if (recKind != noSym) { - tlen = recEnd - t.pos; - SetScannerBehindT(); - } - t.kind = recKind; break; - } // NextCh already done - case 1: - recEnd = pos; recKind = 1; - if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} - else {t.kind = 1; break;} - case 2: - {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} - case 3: - {t.kind = 3; break;} - case 4: - if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} - else {goto case 0;} - case 5: - recEnd = pos; recKind = 4; - if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} - else {t.kind = 4; break;} - case 6: - recEnd = pos; recKind = 5; - if (ch >= '0' && ch <= '9') {AddCh(); goto case 6;} - else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} - else if (ch == '.') {AddCh(); goto case 10;} - else {t.kind = 5; break;} - case 7: - if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} - else if (ch == '+' || ch == '-') {AddCh(); goto case 8;} - else {goto case 0;} - case 8: - if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} - else {goto case 0;} - case 9: - recEnd = pos; recKind = 5; - if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} - else {t.kind = 5; break;} - case 10: - recEnd = pos; recKind = 5; - if (ch >= '0' && ch <= '9') {AddCh(); goto case 10;} - else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} - else {t.kind = 5; break;} - case 11: - if (ch <= '!' || ch >= '#' && ch <= 65535) {AddCh(); goto case 11;} - else if (ch == '"') {AddCh(); goto case 12;} - else {goto case 0;} - case 12: - {t.kind = 6; break;} - case 13: - {t.kind = 7; break;} - case 14: - {t.kind = 8; break;} - case 15: - if (ch == '=') {AddCh(); goto case 16;} - else {goto case 0;} - case 16: - {t.kind = 9; break;} - case 17: - recEnd = pos; recKind = 5; - if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} - else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} - else if (ch >= '0' && ch <= '1') {AddCh(); goto case 18;} - else if (ch == 'x') {AddCh(); goto case 4;} - else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} - else if (ch == '.') {AddCh(); goto case 10;} - else {t.kind = 5; break;} - case 18: - recEnd = pos; recKind = 5; - if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} - else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} - else if (ch >= '0' && ch <= '1') {AddCh(); goto case 18;} - else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} - else if (ch == '.') {AddCh(); goto case 10;} - else {t.kind = 5; break;} - case 19: - recEnd = pos; recKind = 9; - if (ch == '=') {AddCh(); goto case 16;} - else {t.kind = 9; break;} - case 20: - recEnd = pos; recKind = 9; - if (ch == '=') {AddCh(); goto case 16;} - else {t.kind = 9; break;} - case 21: - {t.kind = 12; break;} - case 22: - {t.kind = 13; break;} - case 23: - {t.kind = 14; break;} - case 24: - {t.kind = 15; break;} - case 25: - {t.kind = 16; break;} - case 26: - {t.kind = 17; break;} - case 27: - {t.kind = 18; break;} - case 28: - {t.kind = 19; break;} - case 29: - {t.kind = 20; break;} - case 30: - {t.kind = 21; break;} - case 31: - if (ch == ':') {AddCh(); goto case 28;} - else if (ch == '=') {AddCh(); goto case 29;} - else {goto case 0;} - case 32: - recEnd = pos; recKind = 2; - if (ch == '>') {AddCh(); goto case 30;} - else {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} - - } - t.val = new String(tval, 0, tlen); - return t; - } - - private void SetScannerBehindT() { - buffer.Pos = t.pos; - NextCh(); - line = t.line; col = t.col; charPos = t.charPos; - for (int i = 0; i < tlen; i++) NextCh(); - } - - // get the next token (possibly a token already seen during peeking) - public Token Scan () { - if (tokens.next == null) { - return NextToken(); - } else { - pt = tokens = tokens.next; - return tokens; - } - } - - // peek for the next token, ignore pragmas - public Token Peek () { - do { - if (pt.next == null) { - pt.next = NextToken(); - } - pt = pt.next; - } while (pt.kind > maxT); // skip pragmas - - return pt; - } - - // make sure that peeking starts at the current scan position - public void ResetPeek () { pt = tokens; } - -} // end Scanner -} \ No newline at end of file From 49902cda2a3f3ed9a286134a5c15e3d8b0c29b30 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Tue, 19 Aug 2025 23:45:55 -0500 Subject: [PATCH 31/54] Initial function project commit --- src/core/FunctionArgument.cs | 6 ++++++ src/core/NuGetPublish.targets | 6 ++++++ src/core/core.csproj | 23 ++++++++++++++--------- src/cs-mic.sln | 6 ++++++ src/stdlib/Constants.cs | 21 +++++++++++++++++++++ src/stdlib/functions/AbsoluteValue.cs | 27 +++++++++++++++++++++++++++ src/stdlib/stdlib.csproj | 17 +++++++++++++++++ 7 files changed, 97 insertions(+), 9 deletions(-) create mode 100644 src/core/NuGetPublish.targets create mode 100644 src/stdlib/Constants.cs create mode 100644 src/stdlib/functions/AbsoluteValue.cs create mode 100644 src/stdlib/stdlib.csproj diff --git a/src/core/FunctionArgument.cs b/src/core/FunctionArgument.cs index c4c33cd..44fed30 100644 --- a/src/core/FunctionArgument.cs +++ b/src/core/FunctionArgument.cs @@ -10,5 +10,11 @@ namespace csmic { public required string Name { get; set; } public required FunctionValue Value { get; set; } + + public FunctionArgument(string name, FunctionValue fv) + { + this.Name = name; + this.Value = fv; + } } } diff --git a/src/core/NuGetPublish.targets b/src/core/NuGetPublish.targets new file mode 100644 index 0000000..4feeb24 --- /dev/null +++ b/src/core/NuGetPublish.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/core/core.csproj b/src/core/core.csproj index 7fdff38..9ddca4e 100644 --- a/src/core/core.csproj +++ b/src/core/core.csproj @@ -1,14 +1,19 @@  - - net9.0 - cs_mic.core - enable - enable - + + net9.0 + cs_mic.core + enable + enable + False + 2.0.0-beta-01 + cs-mic + - - - + + + + + diff --git a/src/cs-mic.sln b/src/cs-mic.sln index eab7569..e021e8e 100644 --- a/src/cs-mic.sln +++ b/src/cs-mic.sln @@ -12,6 +12,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tests", "tests\tests.csproj", "{F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "stdlib", "stdlib\stdlib.csproj", "{F7AD600D-4247-49CE-9A26-B20C6F2FF6AE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -27,6 +29,10 @@ Global {F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}.Debug|Any CPU.Build.0 = Debug|Any CPU {F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}.Release|Any CPU.ActiveCfg = Release|Any CPU {F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}.Release|Any CPU.Build.0 = Release|Any CPU + {F7AD600D-4247-49CE-9A26-B20C6F2FF6AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F7AD600D-4247-49CE-9A26-B20C6F2FF6AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7AD600D-4247-49CE-9A26-B20C6F2FF6AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F7AD600D-4247-49CE-9A26-B20C6F2FF6AE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/stdlib/Constants.cs b/src/stdlib/Constants.cs new file mode 100644 index 0000000..1d332f0 --- /dev/null +++ b/src/stdlib/Constants.cs @@ -0,0 +1,21 @@ +namespace csmic.stdlib +{ + public class Constants + { + public void Initialize(InputInterpreter inputInterpreter) + { + if(inputInterpreter == null) + { + throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); + } + + inputInterpreter.Interpret("pi :: 3.1415926535897931"); + inputInterpreter.Interpret("e :: 2.7182818284590451"); + inputInterpreter.Interpret("tau :: 6.2831853071795862"); + inputInterpreter.Interpret("phi :: 1.6180339887498948"); + inputInterpreter.Interpret("goldenratio :: 1.6180339887498948"); + inputInterpreter.Interpret("eurler :: 0.5772156649015329"); + inputInterpreter.Interpret("omega :: 0.5671432904097839"); + } + } +} diff --git a/src/stdlib/functions/AbsoluteValue.cs b/src/stdlib/functions/AbsoluteValue.cs new file mode 100644 index 0000000..a350abb --- /dev/null +++ b/src/stdlib/functions/AbsoluteValue.cs @@ -0,0 +1,27 @@ +using csmic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace stdlib.functions +{ + public class AbsoluteValue : ICodedFunction + { + public IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument() { }; + } + } + + public FunctionValue ReturnValue => throw new NotImplementedException(); + + public FunctionValue Execute(params FunctionArgument[] args) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/stdlib/stdlib.csproj b/src/stdlib/stdlib.csproj new file mode 100644 index 0000000..302b8c2 --- /dev/null +++ b/src/stdlib/stdlib.csproj @@ -0,0 +1,17 @@ + + + + net9.0 + enable + enable + + + + + + + + + + + From 64a12a353ccca74eb4493aedec8d8667166636ac Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Tue, 19 Aug 2025 23:50:19 -0500 Subject: [PATCH 32/54] Implement AbsoluteValue function in stdlib --- src/stdlib/functions/AbsoluteValue.cs | 37 ++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/stdlib/functions/AbsoluteValue.cs b/src/stdlib/functions/AbsoluteValue.cs index a350abb..4578600 100644 --- a/src/stdlib/functions/AbsoluteValue.cs +++ b/src/stdlib/functions/AbsoluteValue.cs @@ -13,15 +13,46 @@ namespace stdlib.functions { get { - yield return new FunctionArgument() { }; + yield return new FunctionArgument( + name: "value", + fv: new FunctionValue(ValueType.Numeric, 0m) + ); } } - public FunctionValue ReturnValue => throw new NotImplementedException(); + public FunctionValue ReturnValue => new FunctionValue(ValueType.Numeric, 0m); public FunctionValue Execute(params FunctionArgument[] args) { - throw new NotImplementedException(); + if (args == null || args.Length < 1 || args[0] == null || args[0].Value == null) + { + return new FunctionValue(ValueType.None, null); + } + + try + { + var input = args[0].Value; + // Try to interpret both numeric and numeric-like string inputs + decimal number; + if (input.Type == ValueType.Numeric) + { + number = Convert.ToDecimal(input.Value); + } + else if (input.Type == ValueType.String && input.Value is string s) + { + number = Convert.ToDecimal(s); + } + else + { + return new FunctionValue(ValueType.None, null); + } + + return new FunctionValue(ValueType.Numeric, Math.Abs(number)); + } + catch + { + return new FunctionValue(ValueType.None, null); + } } } } From fb2c62399c21ea16635fec1a52ef4794121a9fb6 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Wed, 20 Aug 2025 01:07:45 -0500 Subject: [PATCH 33/54] function value issue --- src/core/FunctionArgument.cs | 4 ++-- src/stdlib/functions/AbsoluteValue.cs | 11 ++--------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/core/FunctionArgument.cs b/src/core/FunctionArgument.cs index 44fed30..103223f 100644 --- a/src/core/FunctionArgument.cs +++ b/src/core/FunctionArgument.cs @@ -8,8 +8,8 @@ namespace csmic { public class FunctionArgument { - public required string Name { get; set; } - public required FunctionValue Value { get; set; } + public string Name { get; set; } + public FunctionValue Value { get; set; } public FunctionArgument(string name, FunctionValue fv) { diff --git a/src/stdlib/functions/AbsoluteValue.cs b/src/stdlib/functions/AbsoluteValue.cs index 4578600..7279f9b 100644 --- a/src/stdlib/functions/AbsoluteValue.cs +++ b/src/stdlib/functions/AbsoluteValue.cs @@ -1,9 +1,5 @@ using csmic; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using ValueType = csmic.ValueType; namespace stdlib.functions { @@ -13,10 +9,7 @@ namespace stdlib.functions { get { - yield return new FunctionArgument( - name: "value", - fv: new FunctionValue(ValueType.Numeric, 0m) - ); + yield return new FunctionArgument("value", new FunctionValue(ValueType.Numeric, 0m)); } } From e1eb12476b122e430b72da7cdb6e79dd82d94c27 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Wed, 20 Aug 2025 01:45:11 -0500 Subject: [PATCH 34/54] fixing declarations --- src/core/InputInterpreter.cs | 8 ++++---- src/core/cocor/Interpreter.atg | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/core/InputInterpreter.cs b/src/core/InputInterpreter.cs index bd409a4..d631ccf 100644 --- a/src/core/InputInterpreter.cs +++ b/src/core/InputInterpreter.cs @@ -26,10 +26,10 @@ namespace csmic public InputInterpreter() { - numericVariables = new(StringComparer.Ordinal); - numericArrayVariables = new(StringComparer.Ordinal); - expressionVariables = new(StringComparer.Ordinal); - functions = new(StringComparer.Ordinal); + numericVariables = new Dictionary(StringComparer.Ordinal); + numericArrayVariables = new Dictionary(StringComparer.Ordinal); + expressionVariables = new Dictionary(StringComparer.Ordinal); + functions = new Dictionary(StringComparer.Ordinal); } // Internal constructor to create a child interpreter that shares stores diff --git a/src/core/cocor/Interpreter.atg b/src/core/cocor/Interpreter.atg index 5d19d0d..d8c437b 100644 --- a/src/core/cocor/Interpreter.atg +++ b/src/core/cocor/Interpreter.atg @@ -307,7 +307,7 @@ Function . ArgList - (. List list = new List(); FunctionArgument a = new FunctionArgument { Name = string.Empty, Value = new FunctionValue() }; args = new FunctionArgument[0]; .) + (. List list = new List(); FunctionArgument a = new FunctionArgument(string.Empty, new FunctionValue()); args = new FunctionArgument[0]; .) = [ Arg (. list.Add(a); args = list.ToArray(); .) @@ -316,12 +316,12 @@ ArgList . Arg - (. arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue() }; decimal r = 0; string s = string.Empty; .) + (. arg = new FunctionArgument(string.Empty, new FunctionValue()); decimal r = 0; string s = string.Empty; .) = ( - string (. s = t.val.Substring(1, t.val.Length - 2); arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue(ValueType.String, s) }; .) + string (. s = t.val.Substring(1, t.val.Length - 2); arg = new FunctionArgument(string.Empty, new FunctionValue(ValueType.String, s)); .) | - Expression (. arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue(ValueType.Numeric, r) }; .) + Expression (. arg = new FunctionArgument(string.Empty, new FunctionValue(ValueType.Numeric, r)); .) ) . From b1e9e58783904c491ed9d62aebcbee09d0bf3cd1 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Wed, 20 Aug 2025 02:43:06 -0500 Subject: [PATCH 35/54] Untracking autogenerated --- .gitignore | 2 + src/core/cocor/Parser.cs | 523 -------------------------------------- src/core/cocor/Scanner.cs | 489 ----------------------------------- 3 files changed, 2 insertions(+), 1012 deletions(-) delete mode 100644 src/core/cocor/Parser.cs delete mode 100644 src/core/cocor/Scanner.cs diff --git a/.gitignore b/.gitignore index 7041ee6..b9e2e93 100644 --- a/.gitignore +++ b/.gitignore @@ -407,3 +407,5 @@ FodyWeavers.xsd *.msp /src/core/cocor/Parser.cs.old /src/core/cocor/Scanner.cs.old +/src/core/cocor/Parser.cs +/src/core/cocor/Scanner.cs diff --git a/src/core/cocor/Parser.cs b/src/core/cocor/Parser.cs deleted file mode 100644 index 43f1ee0..0000000 --- a/src/core/cocor/Parser.cs +++ /dev/null @@ -1,523 +0,0 @@ -using System; -using System.Globalization; -using System.Text; -using System.Collections.Generic; -using csmic; - - - -using System; - -namespace csmic.Interpreter { - - - -public class Parser { - public const int _EOF = 0; - public const int _identifier = 1; - public const int _sign = 2; - public const int _binary = 3; - public const int _hex = 4; - public const int _number = 5; - public const int _string = 6; - public const int _LPAREN = 7; - public const int _RPAREN = 8; - public const int _COMPARER = 9; - public const int maxT = 22; - - const bool _T = true; - const bool _x = false; - const int minErrDist = 2; - - public Scanner scanner; - public Errors errors; - - public Token t; // last recognized token - public Token la; // lookahead token - int errDist = minErrDist; - -private FunctionValue functionValue = new FunctionValue(); - -public FunctionValue Result -{ - get { return this.functionValue; } - set { this.functionValue = value; } -} - -private InputInterpreter interpreter = null; - -public InputInterpreter Interpreter -{ - get { return this.interpreter; } - set { this.interpreter = value; } -} - -bool IsFunctionCall() -{ - scanner.ResetPeek(); - Token next = scanner.Peek(); - if (next.kind == _LPAREN && la.kind == _identifier) return true; - return false; -} - -bool IsCompare() -{ - scanner.ResetPeek(); - Token next = scanner.Peek(); - if (next.kind == _COMPARER) return true; - return false; -} - -bool IsAssignment() -{ - scanner.ResetPeek(); - Token next = scanner.Peek(); - if (next.val == "::" || next.val == ":=" || next.val == "->") return true; - return false; -} - -bool IsArrayCall() -{ - scanner.ResetPeek(); - Token next = scanner.Peek(); - if (next.val == "[") return true; - return false; -} - -/* - * Character sets and tokens - */ - - - - public Parser(Scanner scanner) { - this.scanner = scanner; - errors = new Errors(); - } - - void SynErr (int n) { - if (errDist >= minErrDist) errors.SynErr(la.line, la.col, n); - errDist = 0; - } - - public void SemErr (string msg) { - if (errDist >= minErrDist) errors.SemErr(t.line, t.col, msg); - errDist = 0; - } - - void Get () { - for (;;) { - t = la; - la = scanner.Scan(); - if (la.kind <= maxT) { ++errDist; break; } - - la = t; - } - } - - void Expect (int n) { - if (la.kind==n) Get(); else { SynErr(n); } - } - - bool StartOf (int s) { - return set[s, la.kind]; - } - - void ExpectWeak (int n, int follow) { - if (la.kind == n) Get(); - else { - SynErr(n); - while (!StartOf(follow)) Get(); - } - } - - - bool WeakSeparator(int n, int syFol, int repFol) { - int kind = la.kind; - if (kind == n) {Get(); return true;} - else if (StartOf(repFol)) {return false;} - else { - SynErr(n); - while (!(set[syFol, kind] || set[repFol, kind] || set[0, kind])) { - Get(); - kind = la.kind; - } - return StartOf(syFol); - } - } - - - void INTERPRETER() { - FunctionValue fv = new FunctionValue(); - bool success = true; - decimal r = 0; - if (this.interpreter == null) { return; } - - if (IsCompare()) { - Comparison(out success); - this.functionValue = (success == true) ? FunctionValue.TRUE : FunctionValue.FALSE; - this.interpreter.ProduceOutput(this.functionValue); - - } else if (IsAssignment()) { - Assignment(out r); - this.functionValue = new FunctionValue(ValueType.Numeric, r); - this.interpreter.ProduceOutput(this.functionValue); - - } else if (StartOf(1)) { - Expression(out r); - this.functionValue = new FunctionValue(ValueType.Numeric, r); - this.interpreter.ProduceOutput(this.functionValue); - - } else SynErr(23); - } - - void Comparison(out bool result) { - decimal firstValue = 0; decimal secondValue = 0; string compareType = string.Empty; result = false; - Expression(out firstValue); - Expect(9); - compareType = t.val; - Expression(out secondValue); - switch(compareType) - { - case "==": result = (firstValue == secondValue); break; - case ">": result = (firstValue > secondValue); break; - case "<": result = (firstValue < secondValue); break; - case ">=": result = (firstValue >= secondValue); break; - case "<=": result = (firstValue <= secondValue); break; - default: result = false; break; - } - - } - - void Assignment(out decimal r) { - string identifier = string.Empty; string expression = string.Empty; decimal[] d = new decimal[0]; r = 0; - Expect(1); - identifier = t.val; - if (la.kind == 19) { - Get(); - Expression(out r); - this.interpreter.AssignNumeric(identifier, r); - } else if (la.kind == 20) { - Get(); - AnyExpression(out expression); - this.interpreter.AssignExpression(identifier, expression); r = 0; - } else if (la.kind == 21) { - Get(); - ArrayL(out d); - this.interpreter.AssignNumericArray(identifier, d); r = 0; - } else SynErr(24); - } - - void Expression(out decimal r) { - decimal r1 = 0; r = 0; - Term(out r); - while (la.kind == 10 || la.kind == 11) { - if (la.kind == 10) { - Get(); - Term(out r1); - r += r1; - } else { - Get(); - Term(out r1); - r -= r1; - } - } - } - - void Term(out decimal r) { - decimal r1 = 0; r = 0; - Factor(out r); - while (la.kind == 12 || la.kind == 13 || la.kind == 14) { - if (la.kind == 12) { - Get(); - Factor(out r1); - r *= r1; - } else if (la.kind == 13) { - Get(); - Factor(out r1); - r /= r1; - } else { - Get(); - Term(out r1); - r %= r1; - } - } - } - - void Factor(out decimal r) { - decimal r1 = 0; - Value(out r); - while (la.kind == 15) { - Get(); - Expression(out r1); - r = Convert.ToDecimal(Math.Pow(Convert.ToDouble(r), Convert.ToDouble(r1))); - } - } - - void Value(out decimal r) { - r = 0; decimal r1 = 0; int signum = 1; - FunctionValue fvr = new FunctionValue(); - string ident = string.Empty; - - if (la.kind == 10 || la.kind == 11) { - if (la.kind == 10) { - Get(); - } else { - Get(); - signum = -1; - } - } - if (IsFunctionCall()) { - Function(out fvr); - if (fvr.Type == ValueType.Numeric && fvr.Value != null) - { - try { r = signum * Convert.ToDecimal(fvr.Value); } - catch { SemErr("function returned non-numeric"); r = 0; } - } - else - { - SemErr("function returned a string; number required"); - r = 0; - } - - } else if (IsArrayCall()) { - ArrayCall(out r); - r = signum * r; - } else if (la.kind == 1) { - Get(); - ident = t.val; - decimal temp = 0; - string expr = string.Empty; - bool ok = false; - // Prefer numeric binding - try - { - // runtime method expected - ok = this.interpreter.TryGetNumeric(ident, out temp); - } - catch { ok = false; } - if (ok) - { - r = signum * temp; - } - else - { - // Check expression binding - try - { - if (this.interpreter.TryGetExpression(ident, out expr)) - { - FunctionValue eval = this.interpreter.EvaluateExpression(expr); - if (eval.Type == ValueType.Numeric && eval.Value != null) - { - r = signum * Convert.ToDecimal(eval.Value); - } - else - { - SemErr("expression variable did not evaluate to a number"); - r = 0; - } - } - else - { - SemErr("variable '" + ident + "' is not numeric"); - r = 0; - } - } - catch { SemErr("error evaluating expression variable"); r = 0; } - } - - } else if (la.kind == 5) { - Get(); - r = signum * decimal.Parse(t.val, NumberStyles.Float); - } else if (la.kind == 4) { - Get(); - string hx = t.val.Remove(0,2); - try { r = signum * Convert.ToDecimal(Convert.ToInt64(hx, 16)); } - catch { r = 0; } - - } else if (la.kind == 3) { - Get(); - string bx = t.val.Remove(t.val.Length - 1); - try { r = signum * Convert.ToDecimal(Convert.ToInt64(bx, 2)); } - catch { r = 0; } - - } else if (la.kind == 7) { - Get(); - Expression(out r); - Expect(8); - r = signum * r; - } else SynErr(25); - } - - void Function(out FunctionValue r) { - string functionName = string.Empty; FunctionArgument[] args = new FunctionArgument[0]; r = new FunctionValue(); - Expect(1); - functionName = t.val; - Expect(7); - ArgList(out args); - Expect(8); - r = this.interpreter.ExecuteFunction(functionName, args); - } - - void ArrayCall(out decimal r) { - string ident = string.Empty; r = 0; decimal pos = 0; - Expect(1); - ident = t.val; - Expect(16); - Expression(out pos); - try - { - int i = Convert.ToInt32(pos); - decimal[] values; - if (this.interpreter.TryGetNumericArray(ident, out values)) - { - if (i >= 0 && i < values.Length) { r = values[i]; } - else { SemErr("array index out of range"); r = 0; } - } - else - { - SemErr("variable '" + ident + "' is not a numeric array"); - r = 0; - } - } - catch { SemErr("invalid array index"); r = 0; } - - Expect(18); - } - - void ArrayL(out decimal[] d) { - List list = new List(); decimal r = 0; d = new decimal[0]; - Expect(16); - Expression(out r); - list.Add(r); d = list.ToArray(); - while (la.kind == 17) { - Get(); - Expression(out r); - list.Add(r); d = list.ToArray(); - } - Expect(18); - } - - void AnyExpression(out string value) { - value = string.Empty; StringBuilder builder = new StringBuilder(); - Get(); - builder.Append(t.val); - while (StartOf(2)) { - Get(); - builder.Append(t.val); - } - value = builder.ToString(); - } - - void ArgList(out FunctionArgument[] args) { - List list = new List(); FunctionArgument a = new FunctionArgument { Name = string.Empty, Value = new FunctionValue() }; args = new FunctionArgument[0]; - if (StartOf(3)) { - Arg(out a); - list.Add(a); args = list.ToArray(); - while (la.kind == 17) { - Get(); - Arg(out a); - list.Add(a); args = list.ToArray(); - } - } - } - - void Arg(out FunctionArgument arg) { - arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue() }; decimal r = 0; string s = string.Empty; - if (la.kind == 6) { - Get(); - s = t.val.Substring(1, t.val.Length - 2); arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue(ValueType.String, s) }; - } else if (StartOf(1)) { - Expression(out r); - arg = new FunctionArgument { Name = string.Empty, Value = new FunctionValue(ValueType.Numeric, r) }; - } else SynErr(26); - } - - - - public void Parse() { - la = new Token(); - la.val = ""; - Get(); - INTERPRETER(); - Expect(0); - - } - - static readonly bool[,] set = { - {_T,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, - {_x,_T,_x,_T, _T,_T,_x,_T, _x,_x,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x}, - {_x,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_T, _T,_T,_T,_x}, - {_x,_T,_x,_T, _T,_T,_T,_T, _x,_x,_T,_T, _x,_x,_x,_x, _x,_x,_x,_x, _x,_x,_x,_x} - - }; -} // end Parser - - -public class Errors { - public int count = 0; // number of errors detected - public System.IO.TextWriter errorStream = Console.Out; // error messages go to this stream - public string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text - - public virtual void SynErr (int line, int col, int n) { - string s; - switch (n) { - case 0: s = "EOF expected"; break; - case 1: s = "identifier expected"; break; - case 2: s = "sign expected"; break; - case 3: s = "binary expected"; break; - case 4: s = "hex expected"; break; - case 5: s = "number expected"; break; - case 6: s = "string expected"; break; - case 7: s = "LPAREN expected"; break; - case 8: s = "RPAREN expected"; break; - case 9: s = "COMPARER expected"; break; - case 10: s = "\"+\" expected"; break; - case 11: s = "\"-\" expected"; break; - case 12: s = "\"*\" expected"; break; - case 13: s = "\"/\" expected"; break; - case 14: s = "\"%\" expected"; break; - case 15: s = "\"^\" expected"; break; - case 16: s = "\"[\" expected"; break; - case 17: s = "\",\" expected"; break; - case 18: s = "\"]\" expected"; break; - case 19: s = "\"::\" expected"; break; - case 20: s = "\":=\" expected"; break; - case 21: s = "\"->\" expected"; break; - case 22: s = "??? expected"; break; - case 23: s = "invalid INTERPRETER"; break; - case 24: s = "invalid Assignment"; break; - case 25: s = "invalid Value"; break; - case 26: s = "invalid Arg"; break; - - default: s = "error " + n; break; - } - errorStream.WriteLine(errMsgFormat, line, col, s); - count++; - } - - public virtual void SemErr (int line, int col, string s) { - errorStream.WriteLine(errMsgFormat, line, col, s); - count++; - } - - public virtual void SemErr (string s) { - errorStream.WriteLine(s); - count++; - } - - public virtual void Warning (int line, int col, string s) { - errorStream.WriteLine(errMsgFormat, line, col, s); - } - - public virtual void Warning(string s) { - errorStream.WriteLine(s); - } -} // Errors - - -public class FatalError: Exception { - public FatalError(string m): base(m) {} -} -} \ No newline at end of file diff --git a/src/core/cocor/Scanner.cs b/src/core/cocor/Scanner.cs deleted file mode 100644 index 023a785..0000000 --- a/src/core/cocor/Scanner.cs +++ /dev/null @@ -1,489 +0,0 @@ - -using System; -using System.IO; -using System.Collections; - -namespace csmic.Interpreter { - -public class Token { - public int kind; // token kind - public int pos; // token position in bytes in the source text (starting at 0) - public int charPos; // token position in characters in the source text (starting at 0) - public int col; // token column (starting at 1) - public int line; // token line (starting at 1) - public string val; // token value - public Token next; // ML 2005-03-11 Tokens are kept in linked list -} - -//----------------------------------------------------------------------------------- -// Buffer -//----------------------------------------------------------------------------------- -public class Buffer { - // This Buffer supports the following cases: - // 1) seekable stream (file) - // a) whole stream in buffer - // b) part of stream in buffer - // 2) non seekable stream (network, console) - - public const int EOF = char.MaxValue + 1; - const int MIN_BUFFER_LENGTH = 1024; // 1KB - const int MAX_BUFFER_LENGTH = MIN_BUFFER_LENGTH * 64; // 64KB - byte[] buf; // input buffer - int bufStart; // position of first byte in buffer relative to input stream - int bufLen; // length of buffer - int fileLen; // length of input stream (may change if the stream is no file) - int bufPos; // current position in buffer - Stream stream; // input stream (seekable) - bool isUserStream; // was the stream opened by the user? - - public Buffer (Stream s, bool isUserStream) { - stream = s; this.isUserStream = isUserStream; - - if (stream.CanSeek) { - fileLen = (int) stream.Length; - bufLen = Math.Min(fileLen, MAX_BUFFER_LENGTH); - bufStart = Int32.MaxValue; // nothing in the buffer so far - } else { - fileLen = bufLen = bufStart = 0; - } - - buf = new byte[(bufLen>0) ? bufLen : MIN_BUFFER_LENGTH]; - if (fileLen > 0) Pos = 0; // setup buffer to position 0 (start) - else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid - if (bufLen == fileLen && stream.CanSeek) Close(); - } - - protected Buffer(Buffer b) { // called in UTF8Buffer constructor - buf = b.buf; - bufStart = b.bufStart; - bufLen = b.bufLen; - fileLen = b.fileLen; - bufPos = b.bufPos; - stream = b.stream; - // keep destructor from closing the stream - b.stream = null; - isUserStream = b.isUserStream; - } - - ~Buffer() { Close(); } - - protected void Close() { - if (!isUserStream && stream != null) { - stream.Close(); - stream = null; - } - } - - public virtual int Read () { - if (bufPos < bufLen) { - return buf[bufPos++]; - } else if (Pos < fileLen) { - Pos = Pos; // shift buffer start to Pos - return buf[bufPos++]; - } else if (stream != null && !stream.CanSeek && ReadNextStreamChunk() > 0) { - return buf[bufPos++]; - } else { - return EOF; - } - } - - public int Peek () { - int curPos = Pos; - int ch = Read(); - Pos = curPos; - return ch; - } - - // beg .. begin, zero-based, inclusive, in byte - // end .. end, zero-based, exclusive, in byte - public string GetString (int beg, int end) { - int len = 0; - char[] buf = new char[end - beg]; - int oldPos = Pos; - Pos = beg; - while (Pos < end) buf[len++] = (char) Read(); - Pos = oldPos; - return new String(buf, 0, len); - } - - public int Pos { - get { return bufPos + bufStart; } - set { - if (value >= fileLen && stream != null && !stream.CanSeek) { - // Wanted position is after buffer and the stream - // is not seek-able e.g. network or console, - // thus we have to read the stream manually till - // the wanted position is in sight. - while (value >= fileLen && ReadNextStreamChunk() > 0); - } - - if (value < 0 || value > fileLen) { - throw new FatalError("buffer out of bounds access, position: " + value); - } - - if (value >= bufStart && value < bufStart + bufLen) { // already in buffer - bufPos = value - bufStart; - } else if (stream != null) { // must be swapped in - stream.Seek(value, SeekOrigin.Begin); - bufLen = stream.Read(buf, 0, buf.Length); - bufStart = value; bufPos = 0; - } else { - // set the position to the end of the file, Pos will return fileLen. - bufPos = fileLen - bufStart; - } - } - } - - // Read the next chunk of bytes from the stream, increases the buffer - // if needed and updates the fields fileLen and bufLen. - // Returns the number of bytes read. - private int ReadNextStreamChunk() { - int free = buf.Length - bufLen; - if (free == 0) { - // in the case of a growing input stream - // we can neither seek in the stream, nor can we - // foresee the maximum length, thus we must adapt - // the buffer size on demand. - byte[] newBuf = new byte[bufLen * 2]; - Array.Copy(buf, newBuf, bufLen); - buf = newBuf; - free = bufLen; - } - int read = stream.Read(buf, bufLen, free); - if (read > 0) { - fileLen = bufLen = (bufLen + read); - return read; - } - // end of stream reached - return 0; - } -} - -//----------------------------------------------------------------------------------- -// UTF8Buffer -//----------------------------------------------------------------------------------- -public class UTF8Buffer: Buffer { - public UTF8Buffer(Buffer b): base(b) {} - - public override int Read() { - int ch; - do { - ch = base.Read(); - // until we find a utf8 start (0xxxxxxx or 11xxxxxx) - } while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EOF)); - if (ch < 128 || ch == EOF) { - // nothing to do, first 127 chars are the same in ascii and utf8 - // 0xxxxxxx or end of file character - } else if ((ch & 0xF0) == 0xF0) { - // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - int c1 = ch & 0x07; ch = base.Read(); - int c2 = ch & 0x3F; ch = base.Read(); - int c3 = ch & 0x3F; ch = base.Read(); - int c4 = ch & 0x3F; - ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4; - } else if ((ch & 0xE0) == 0xE0) { - // 1110xxxx 10xxxxxx 10xxxxxx - int c1 = ch & 0x0F; ch = base.Read(); - int c2 = ch & 0x3F; ch = base.Read(); - int c3 = ch & 0x3F; - ch = (((c1 << 6) | c2) << 6) | c3; - } else if ((ch & 0xC0) == 0xC0) { - // 110xxxxx 10xxxxxx - int c1 = ch & 0x1F; ch = base.Read(); - int c2 = ch & 0x3F; - ch = (c1 << 6) | c2; - } - return ch; - } -} - -//----------------------------------------------------------------------------------- -// Scanner -//----------------------------------------------------------------------------------- -public class Scanner { - const char EOL = '\n'; - const int eofSym = 0; /* pdt */ - const int maxT = 22; - const int noSym = 22; - - - public Buffer buffer; // scanner buffer - - Token t; // current token - int ch; // current input character - int pos; // byte position of current character - int charPos; // position by unicode characters starting with 0 - int col; // column number of current character - int line; // line number of current character - int oldEols; // EOLs that appeared in a comment; - static readonly Hashtable start; // maps first token character to start state - - Token tokens; // list of tokens already peeked (first token is a dummy) - Token pt; // current peek token - - char[] tval = new char[128]; // text of current token - int tlen; // length of current token - - static Scanner() { - start = new Hashtable(128); - for (int i = 65; i <= 90; ++i) start[i] = 1; - for (int i = 97; i <= 122; ++i) start[i] = 1; - start[43] = 2; - for (int i = 50; i <= 57; ++i) start[i] = 6; - start[48] = 17; - start[49] = 18; - start[34] = 11; - start[40] = 13; - start[41] = 14; - start[61] = 15; - start[60] = 19; - start[62] = 20; - start[42] = 21; - start[47] = 22; - start[37] = 23; - start[94] = 24; - start[91] = 25; - start[44] = 26; - start[93] = 27; - start[58] = 31; - start[45] = 32; - start[Buffer.EOF] = -1; - - } - - public Scanner (string fileName) { - try { - Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); - buffer = new Buffer(stream, false); - Init(); - } catch (IOException) { - throw new FatalError("Cannot open file " + fileName); - } - } - - public Scanner (Stream s) { - buffer = new Buffer(s, true); - Init(); - } - - void Init() { - pos = -1; line = 1; col = 0; charPos = -1; - oldEols = 0; - NextCh(); - if (ch == 0xEF) { // check optional byte order mark for UTF-8 - NextCh(); int ch1 = ch; - NextCh(); int ch2 = ch; - if (ch1 != 0xBB || ch2 != 0xBF) { - throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2)); - } - buffer = new UTF8Buffer(buffer); col = 0; charPos = -1; - NextCh(); - } - pt = tokens = new Token(); // first token is a dummy - } - - void NextCh() { - if (oldEols > 0) { ch = EOL; oldEols--; } - else { - pos = buffer.Pos; - // buffer reads unicode chars, if UTF8 has been detected - ch = buffer.Read(); col++; charPos++; - // replace isolated '\r' by '\n' in order to make - // eol handling uniform across Windows, Unix and Mac - if (ch == '\r' && buffer.Peek() != '\n') ch = EOL; - if (ch == EOL) { line++; col = 0; } - } - - } - - void AddCh() { - if (tlen >= tval.Length) { - char[] newBuf = new char[2 * tval.Length]; - Array.Copy(tval, 0, newBuf, 0, tval.Length); - tval = newBuf; - } - if (ch != Buffer.EOF) { - tval[tlen++] = (char) ch; - NextCh(); - } - } - - - - - void CheckLiteral() { - switch (t.val) { - case "+": t.kind = 10; break; - case "-": t.kind = 11; break; - default: break; - } - } - - Token NextToken() { - while (ch == ' ' || - ch == 9 || ch == 13 - ) NextCh(); - - int recKind = noSym; - int recEnd = pos; - t = new Token(); - t.pos = pos; t.col = col; t.line = line; t.charPos = charPos; - int state; - if (start.ContainsKey(ch)) { state = (int) start[ch]; } - else { state = 0; } - tlen = 0; AddCh(); - - switch (state) { - case -1: { t.kind = eofSym; break; } // NextCh already done - case 0: { - if (recKind != noSym) { - tlen = recEnd - t.pos; - SetScannerBehindT(); - } - t.kind = recKind; break; - } // NextCh already done - case 1: - recEnd = pos; recKind = 1; - if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {AddCh(); goto case 1;} - else {t.kind = 1; break;} - case 2: - {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} - case 3: - {t.kind = 3; break;} - case 4: - if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} - else {goto case 0;} - case 5: - recEnd = pos; recKind = 4; - if (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F' || ch >= 'a' && ch <= 'f') {AddCh(); goto case 5;} - else {t.kind = 4; break;} - case 6: - recEnd = pos; recKind = 5; - if (ch >= '0' && ch <= '9') {AddCh(); goto case 6;} - else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} - else if (ch == '.') {AddCh(); goto case 10;} - else {t.kind = 5; break;} - case 7: - if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} - else if (ch == '+' || ch == '-') {AddCh(); goto case 8;} - else {goto case 0;} - case 8: - if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} - else {goto case 0;} - case 9: - recEnd = pos; recKind = 5; - if (ch >= '0' && ch <= '9') {AddCh(); goto case 9;} - else {t.kind = 5; break;} - case 10: - recEnd = pos; recKind = 5; - if (ch >= '0' && ch <= '9') {AddCh(); goto case 10;} - else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} - else {t.kind = 5; break;} - case 11: - if (ch <= '!' || ch >= '#' && ch <= 65535) {AddCh(); goto case 11;} - else if (ch == '"') {AddCh(); goto case 12;} - else {goto case 0;} - case 12: - {t.kind = 6; break;} - case 13: - {t.kind = 7; break;} - case 14: - {t.kind = 8; break;} - case 15: - if (ch == '=') {AddCh(); goto case 16;} - else {goto case 0;} - case 16: - {t.kind = 9; break;} - case 17: - recEnd = pos; recKind = 5; - if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} - else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} - else if (ch >= '0' && ch <= '1') {AddCh(); goto case 18;} - else if (ch == 'x') {AddCh(); goto case 4;} - else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} - else if (ch == '.') {AddCh(); goto case 10;} - else {t.kind = 5; break;} - case 18: - recEnd = pos; recKind = 5; - if (ch >= '2' && ch <= '9') {AddCh(); goto case 6;} - else if (ch == 'B' || ch == 'b') {AddCh(); goto case 3;} - else if (ch >= '0' && ch <= '1') {AddCh(); goto case 18;} - else if (ch == 'E' || ch == 'e') {AddCh(); goto case 7;} - else if (ch == '.') {AddCh(); goto case 10;} - else {t.kind = 5; break;} - case 19: - recEnd = pos; recKind = 9; - if (ch == '=') {AddCh(); goto case 16;} - else {t.kind = 9; break;} - case 20: - recEnd = pos; recKind = 9; - if (ch == '=') {AddCh(); goto case 16;} - else {t.kind = 9; break;} - case 21: - {t.kind = 12; break;} - case 22: - {t.kind = 13; break;} - case 23: - {t.kind = 14; break;} - case 24: - {t.kind = 15; break;} - case 25: - {t.kind = 16; break;} - case 26: - {t.kind = 17; break;} - case 27: - {t.kind = 18; break;} - case 28: - {t.kind = 19; break;} - case 29: - {t.kind = 20; break;} - case 30: - {t.kind = 21; break;} - case 31: - if (ch == ':') {AddCh(); goto case 28;} - else if (ch == '=') {AddCh(); goto case 29;} - else {goto case 0;} - case 32: - recEnd = pos; recKind = 2; - if (ch == '>') {AddCh(); goto case 30;} - else {t.kind = 2; t.val = new String(tval, 0, tlen); CheckLiteral(); return t;} - - } - t.val = new String(tval, 0, tlen); - return t; - } - - private void SetScannerBehindT() { - buffer.Pos = t.pos; - NextCh(); - line = t.line; col = t.col; charPos = t.charPos; - for (int i = 0; i < tlen; i++) NextCh(); - } - - // get the next token (possibly a token already seen during peeking) - public Token Scan () { - if (tokens.next == null) { - return NextToken(); - } else { - pt = tokens = tokens.next; - return tokens; - } - } - - // peek for the next token, ignore pragmas - public Token Peek () { - do { - if (pt.next == null) { - pt.next = NextToken(); - } - pt = pt.next; - } while (pt.kind > maxT); // skip pragmas - - return pt; - } - - // make sure that peeking starts at the current scan position - public void ResetPeek () { pt = tokens; } - -} // end Scanner -} \ No newline at end of file From e458cdd9102c4aa2034bee97037851bd635153a6 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Wed, 20 Aug 2025 03:48:58 -0500 Subject: [PATCH 36/54] periodic checkpoint --- src/stdlib/functions/AbsoluteValue.cs | 13 +++++------ src/stdlib/functions/FunctionBase.cs | 31 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 src/stdlib/functions/FunctionBase.cs diff --git a/src/stdlib/functions/AbsoluteValue.cs b/src/stdlib/functions/AbsoluteValue.cs index 7279f9b..5245182 100644 --- a/src/stdlib/functions/AbsoluteValue.cs +++ b/src/stdlib/functions/AbsoluteValue.cs @@ -3,7 +3,7 @@ using ValueType = csmic.ValueType; namespace stdlib.functions { - public class AbsoluteValue : ICodedFunction + public class AbsoluteValue : FunctionBase, ICodedFunction { public IEnumerable ExpectedArguments { @@ -13,14 +13,15 @@ namespace stdlib.functions } } - public FunctionValue ReturnValue => new FunctionValue(ValueType.Numeric, 0m); + public FunctionValue ReturnValue + { + new FunctionValue(ValueType.Numeric, 0m); + } + => public FunctionValue Execute(params FunctionArgument[] args) { - if (args == null || args.Length < 1 || args[0] == null || args[0].Value == null) - { - return new FunctionValue(ValueType.None, null); - } + base.ArgumentCheck(args); try { diff --git a/src/stdlib/functions/FunctionBase.cs b/src/stdlib/functions/FunctionBase.cs new file mode 100644 index 0000000..ba8edf2 --- /dev/null +++ b/src/stdlib/functions/FunctionBase.cs @@ -0,0 +1,31 @@ +using csmic; +using ValueType = csmic.ValueType; + +namespace stdlib.functions +{ + public abstract class FunctionBase + { + public virtual IEnumerable ExpectedArguments { get; } + + internal bool ArgumentCheck(params FunctionArgument[] args) + { + if (args == null || args.Length != this.ExpectedArguments.Count()) + { + return false; + } + + var expectedArgumentsArray = this.ExpectedArguments.ToArray(); + for (int i = 0; i < args.Length; i++) + { + var expectedArgument = expectedArgumentsArray[i]; + var argument = args[i]; + if(argument.Value == null || argument.Value.Type != expectedArgument.Value.Type) + { + return false; + } + } + + return true; + } + } +} From fcbdaa1f9d28820f767207b7db080a35f6da970f Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Wed, 20 Aug 2025 04:55:04 -0500 Subject: [PATCH 37/54] Added two base functions --- src/core/FunctionValue.cs | 7 +++-- src/stdlib/functions/AbsoluteValue.cs | 37 ++++------------------- src/stdlib/functions/FunctionBase.cs | 43 +++++++++++++++++++++++++-- src/stdlib/functions/Sign.cs | 30 +++++++++++++++++++ 4 files changed, 82 insertions(+), 35 deletions(-) create mode 100644 src/stdlib/functions/Sign.cs diff --git a/src/core/FunctionValue.cs b/src/core/FunctionValue.cs index 418dd29..9e84a9b 100644 --- a/src/core/FunctionValue.cs +++ b/src/core/FunctionValue.cs @@ -12,8 +12,11 @@ namespace csmic public ValueType Type { get; set; } public object? Value { get; set; } - public static readonly FunctionValue TRUE = new FunctionValue(ValueType.Numeric, 1); - public static readonly FunctionValue FALSE = new FunctionValue(ValueType.Numeric, 0); + public static readonly FunctionValue TRUE = new FunctionValue(ValueType.Numeric, 1m); + public static readonly FunctionValue FALSE = new FunctionValue(ValueType.Numeric, 0m); + public static readonly FunctionValue NONE = new FunctionValue(ValueType.None, null); + public static readonly FunctionValue NUMBER = new FunctionValue(ValueType.Numeric, 0m); + public static readonly FunctionValue STRING = new FunctionValue(ValueType.String, string.Empty); public FunctionValue() { diff --git a/src/stdlib/functions/AbsoluteValue.cs b/src/stdlib/functions/AbsoluteValue.cs index 5245182..af1b82b 100644 --- a/src/stdlib/functions/AbsoluteValue.cs +++ b/src/stdlib/functions/AbsoluteValue.cs @@ -5,48 +5,23 @@ namespace stdlib.functions { public class AbsoluteValue : FunctionBase, ICodedFunction { - public IEnumerable ExpectedArguments + public override IEnumerable ExpectedArguments { get { - yield return new FunctionArgument("value", new FunctionValue(ValueType.Numeric, 0m)); + yield return new FunctionArgument("value", FunctionValue.NUMBER); } } - public FunctionValue ReturnValue - { - new FunctionValue(ValueType.Numeric, 0m); - } - => - public FunctionValue Execute(params FunctionArgument[] args) { - base.ArgumentCheck(args); - - try + return base.Execute(args, (_args) => { - var input = args[0].Value; - // Try to interpret both numeric and numeric-like string inputs - decimal number; - if (input.Type == ValueType.Numeric) - { - number = Convert.ToDecimal(input.Value); - } - else if (input.Type == ValueType.String && input.Value is string s) - { - number = Convert.ToDecimal(s); - } - else - { - return new FunctionValue(ValueType.None, null); - } + var input = _args[0].Value; + decimal number = Convert.ToDecimal(input.Value); return new FunctionValue(ValueType.Numeric, Math.Abs(number)); - } - catch - { - return new FunctionValue(ValueType.None, null); - } + }); } } } diff --git a/src/stdlib/functions/FunctionBase.cs b/src/stdlib/functions/FunctionBase.cs index ba8edf2..ee8ec14 100644 --- a/src/stdlib/functions/FunctionBase.cs +++ b/src/stdlib/functions/FunctionBase.cs @@ -7,25 +7,64 @@ namespace stdlib.functions { public virtual IEnumerable ExpectedArguments { get; } - internal bool ArgumentCheck(params FunctionArgument[] args) + public virtual FunctionValue ReturnValue { + get + + { + return FunctionValue.NUMBER; + } + } + + public bool ArgumentCheck(params FunctionArgument[] args) + { + // Top level sanity checks. if (args == null || args.Length != this.ExpectedArguments.Count()) { return false; } + // Check each argument against what is expected. var expectedArgumentsArray = this.ExpectedArguments.ToArray(); for (int i = 0; i < args.Length; i++) { var expectedArgument = expectedArgumentsArray[i]; var argument = args[i]; - if(argument.Value == null || argument.Value.Type != expectedArgument.Value.Type) + if (argument.Value == null || argument.Value.Value == null || argument.Value.Type != expectedArgument.Value.Type) + { + return false; + } + + if (argument.Value.Type == ValueType.Numeric && argument.Value.Value is not decimal) + { + return false; + } + + if (argument.Value.Type == ValueType.String && argument.Value.Value is not string) { return false; } } + // All checks passed. return true; } + + public FunctionValue Execute(FunctionArgument[] args, Func action) + { + if (!ArgumentCheck(args)) + { + return FunctionValue.NONE; + } + + try + { + return action(args); + } + catch + { + return FunctionValue.NONE; + } + } } } diff --git a/src/stdlib/functions/Sign.cs b/src/stdlib/functions/Sign.cs new file mode 100644 index 0000000..1f3bc5c --- /dev/null +++ b/src/stdlib/functions/Sign.cs @@ -0,0 +1,30 @@ +using csmic; +using ValueType = csmic.ValueType; + +namespace stdlib.functions +{ + public class Sign : FunctionBase, ICodedFunction + { + public const decimal POSITIVE = 1; + public const decimal NEGATIVE = -1; + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + var input = _args[0].Value; + decimal number = Convert.ToDecimal(input.Value); + + return new FunctionValue(ValueType.Numeric, number >= 0 ? POSITIVE : NEGATIVE); + }); + } + } +} From 1e9d9233f87cb1b1b08c6eabdbc5f8f9e9235036 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Wed, 20 Aug 2025 05:05:34 -0500 Subject: [PATCH 38/54] Added tests for stdlib --- src/tests/StdlibFunctionsTests.cs | 105 ++++++++++++++++++++++++++++++ src/tests/tests.csproj | 1 + 2 files changed, 106 insertions(+) create mode 100644 src/tests/StdlibFunctionsTests.cs diff --git a/src/tests/StdlibFunctionsTests.cs b/src/tests/StdlibFunctionsTests.cs new file mode 100644 index 0000000..cf01630 --- /dev/null +++ b/src/tests/StdlibFunctionsTests.cs @@ -0,0 +1,105 @@ +using csmic; +using NUnit.Framework; +using stdlib.functions; + +namespace tests; + +public class StdlibFunctionsTests +{ + private static FunctionArgument NumArg(decimal d) => new FunctionArgument("value", new FunctionValue(ValueType.Numeric, d)); + + [Test] + public void AbsoluteValue_Positive_ReturnsSame() + { + var fn = new AbsoluteValue(); + var result = fn.Execute(NumArg(5m)); + Assert.That(result.Type, Is.EqualTo(ValueType.Numeric)); + Assert.That(result.Value, Is.EqualTo(5m)); + } + + [Test] + public void AbsoluteValue_Negative_ReturnsPositive() + { + var fn = new AbsoluteValue(); + var result = fn.Execute(NumArg(-12.5m)); + Assert.That(result.Type, Is.EqualTo(ValueType.Numeric)); + Assert.That(result.Value, Is.EqualTo(12.5m)); + } + + [Test] + public void AbsoluteValue_Zero_ReturnsZero() + { + var fn = new AbsoluteValue(); + var result = fn.Execute(NumArg(0m)); + Assert.That(result.Type, Is.EqualTo(ValueType.Numeric)); + Assert.That(result.Value, Is.EqualTo(0m)); + } + + [Test] + public void AbsoluteValue_InvalidArgType_ReturnsNone() + { + var fn = new AbsoluteValue(); + var badArg = new FunctionArgument("value", FunctionValue.STRING); + var result = fn.Execute(badArg); + Assert.That(result.Type, Is.EqualTo(ValueType.None)); + Assert.That(result.Value, Is.Null); + } + + [Test] + public void AbsoluteValue_WrongArgCount_ReturnsNone() + { + var fn = new AbsoluteValue(); + var result0 = fn.Execute(); + var result2 = fn.Execute(NumArg(1m), NumArg(2m)); + Assert.That(result0.Type, Is.EqualTo(ValueType.None)); + Assert.That(result2.Type, Is.EqualTo(ValueType.None)); + } + + [Test] + public void Sign_Negative_ReturnsNegativeOne() + { + var fn = new Sign(); + var result = fn.Execute(NumArg(-1m)); + Assert.That(result.Type, Is.EqualTo(ValueType.Numeric)); + Assert.That(result.Value, Is.EqualTo(Sign.NEGATIVE)); + } + + [Test] + public void Sign_Zero_ReturnsPositiveOne() + { + var fn = new Sign(); + var result = fn.Execute(NumArg(0m)); + Assert.That(result.Type, Is.EqualTo(ValueType.Numeric)); + Assert.That(result.Value, Is.EqualTo(Sign.POSITIVE)); + } + + [Test] + public void Sign_Positive_ReturnsPositiveOne() + { + var fn = new Sign(); + var result = fn.Execute(NumArg(99.99m)); + Assert.That(result.Type, Is.EqualTo(ValueType.Numeric)); + Assert.That(result.Value, Is.EqualTo(Sign.POSITIVE)); + } + + [Test] + public void Sign_InvalidArgType_ReturnsNone() + { + var fn = new Sign(); + var badArg = new FunctionArgument("value", FunctionValue.STRING); + var result = fn.Execute(badArg); + Assert.That(result.Type, Is.EqualTo(ValueType.None)); + Assert.That(result.Value, Is.Null); + } + + [Test] + public void Sign_WrongArgCount_ReturnsNone() + { + var fn = new Sign(); + var result0 = fn.Execute(); + var result2 = fn.Execute(NumArg(1m), NumArg(2m)); + Assert.That(result0.Type, Is.EqualTo(ValueType.None)); + Assert.That(result2.Type, Is.EqualTo(ValueType.None)); + } +} + diff --git a/src/tests/tests.csproj b/src/tests/tests.csproj index 6c89a8b..390ce9d 100644 --- a/src/tests/tests.csproj +++ b/src/tests/tests.csproj @@ -18,6 +18,7 @@ + From 82ceb7e5cde838cc81fd738da22a28de4dbb5bdb Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Wed, 20 Aug 2025 05:21:57 -0500 Subject: [PATCH 39/54] Refactored ValueType to FunctionValueType It was causing issues. --- src/core/FunctionValue.cs | 16 ++++++------ .../{ValueType.cs => FunctionValueType.cs} | 2 +- src/core/InputInterpreter.cs | 10 +++---- src/core/cocor/Interpreter.atg | 12 ++++----- src/stdlib/functions/AbsoluteValue.cs | 4 +-- src/stdlib/functions/FunctionBase.cs | 6 ++--- src/stdlib/functions/Sign.cs | 4 +-- src/tests/StdlibFunctionsTests.cs | 26 +++++++++---------- 8 files changed, 40 insertions(+), 40 deletions(-) rename src/core/{ValueType.cs => FunctionValueType.cs} (85%) diff --git a/src/core/FunctionValue.cs b/src/core/FunctionValue.cs index 9e84a9b..f5b396e 100644 --- a/src/core/FunctionValue.cs +++ b/src/core/FunctionValue.cs @@ -9,22 +9,22 @@ namespace csmic { public class FunctionValue { - public ValueType Type { get; set; } + public FunctionValueType Type { get; set; } public object? Value { get; set; } - public static readonly FunctionValue TRUE = new FunctionValue(ValueType.Numeric, 1m); - public static readonly FunctionValue FALSE = new FunctionValue(ValueType.Numeric, 0m); - public static readonly FunctionValue NONE = new FunctionValue(ValueType.None, null); - public static readonly FunctionValue NUMBER = new FunctionValue(ValueType.Numeric, 0m); - public static readonly FunctionValue STRING = new FunctionValue(ValueType.String, string.Empty); + public static readonly FunctionValue TRUE = new FunctionValue(FunctionValueType.Numeric, 1m); + public static readonly FunctionValue FALSE = new FunctionValue(FunctionValueType.Numeric, 0m); + public static readonly FunctionValue NONE = new FunctionValue(FunctionValueType.None, null); + public static readonly FunctionValue NUMBER = new FunctionValue(FunctionValueType.Numeric, 0m); + public static readonly FunctionValue STRING = new FunctionValue(FunctionValueType.String, string.Empty); public FunctionValue() { - this.Type = ValueType.None; + this.Type = FunctionValueType.None; this.Value = null; } - public FunctionValue(ValueType type, object? value) + public FunctionValue(FunctionValueType type, object? value) { this.Type = type; this.Value = value; diff --git a/src/core/ValueType.cs b/src/core/FunctionValueType.cs similarity index 85% rename from src/core/ValueType.cs rename to src/core/FunctionValueType.cs index f944849..5d3c9c0 100644 --- a/src/core/ValueType.cs +++ b/src/core/FunctionValueType.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace csmic { - public enum ValueType + public enum FunctionValueType { None, Numeric, diff --git a/src/core/InputInterpreter.cs b/src/core/InputInterpreter.cs index d631ccf..a38ca53 100644 --- a/src/core/InputInterpreter.cs +++ b/src/core/InputInterpreter.cs @@ -64,17 +64,17 @@ namespace csmic { switch (functionValue.Type) { - case ValueType.Numeric: + case FunctionValueType.Numeric: decimal numericValue = Convert.ToDecimal(functionValue.Value); ProduceOutput(numericValue, string.Empty); break; - case ValueType.String: + case FunctionValueType.String: if (functionValue.Value is string s) ProduceOutput(0, s); else ProduceOutput(0, string.Empty); break; - case ValueType.None: + case FunctionValueType.None: default: ProduceOutput(0, string.Empty); break; @@ -188,10 +188,10 @@ namespace csmic } catch { - return new FunctionValue(ValueType.None, null); + return new FunctionValue(FunctionValueType.None, null); } } - return new FunctionValue(ValueType.None, null); + return new FunctionValue(FunctionValueType.None, null); } #endregion diff --git a/src/core/cocor/Interpreter.atg b/src/core/cocor/Interpreter.atg index d8c437b..67ba9c3 100644 --- a/src/core/cocor/Interpreter.atg +++ b/src/core/cocor/Interpreter.atg @@ -109,12 +109,12 @@ INTERPRETER (. | IF(IsAssignment()) Assignment - (. this.functionValue = new FunctionValue(ValueType.Numeric, r); + (. this.functionValue = new FunctionValue(FunctionValueType.Numeric, r); this.interpreter.ProduceOutput(this.functionValue); .) | Expression - (. this.functionValue = new FunctionValue(ValueType.Numeric, r); + (. this.functionValue = new FunctionValue(FunctionValueType.Numeric, r); this.interpreter.ProduceOutput(this.functionValue); .) . @@ -158,7 +158,7 @@ Value (. IF(IsFunctionCall()) Function (. - if (fvr.Type == ValueType.Numeric && fvr.Value != null) + if (fvr.Type == FunctionValueType.Numeric && fvr.Value != null) { try { r = signum * Convert.ToDecimal(fvr.Value); } catch { SemErr("function returned non-numeric"); r = 0; } @@ -198,7 +198,7 @@ Value (. if (this.interpreter.TryGetExpression(ident, out expr)) { FunctionValue eval = this.interpreter.EvaluateExpression(expr); - if (eval.Type == ValueType.Numeric && eval.Value != null) + if (eval.Type == FunctionValueType.Numeric && eval.Value != null) { r = signum * Convert.ToDecimal(eval.Value); } @@ -319,9 +319,9 @@ Arg (. arg = new FunctionArgument(string.Empty, new FunctionValue()); decimal r = 0; string s = string.Empty; .) = ( - string (. s = t.val.Substring(1, t.val.Length - 2); arg = new FunctionArgument(string.Empty, new FunctionValue(ValueType.String, s)); .) + string (. s = t.val.Substring(1, t.val.Length - 2); arg = new FunctionArgument(string.Empty, new FunctionValue(FunctionValueType.String, s)); .) | - Expression (. arg = new FunctionArgument(string.Empty, new FunctionValue(ValueType.Numeric, r)); .) + Expression (. arg = new FunctionArgument(string.Empty, new FunctionValue(FunctionValueType.Numeric, r)); .) ) . diff --git a/src/stdlib/functions/AbsoluteValue.cs b/src/stdlib/functions/AbsoluteValue.cs index af1b82b..14762fe 100644 --- a/src/stdlib/functions/AbsoluteValue.cs +++ b/src/stdlib/functions/AbsoluteValue.cs @@ -1,5 +1,5 @@ using csmic; -using ValueType = csmic.ValueType; +using FunctionValueType = csmic.FunctionValueType; namespace stdlib.functions { @@ -20,7 +20,7 @@ namespace stdlib.functions var input = _args[0].Value; decimal number = Convert.ToDecimal(input.Value); - return new FunctionValue(ValueType.Numeric, Math.Abs(number)); + return new FunctionValue(FunctionValueType.Numeric, Math.Abs(number)); }); } } diff --git a/src/stdlib/functions/FunctionBase.cs b/src/stdlib/functions/FunctionBase.cs index ee8ec14..338d2d7 100644 --- a/src/stdlib/functions/FunctionBase.cs +++ b/src/stdlib/functions/FunctionBase.cs @@ -1,5 +1,5 @@ using csmic; -using ValueType = csmic.ValueType; +using FunctionValueType = csmic.FunctionValueType; namespace stdlib.functions { @@ -35,12 +35,12 @@ namespace stdlib.functions return false; } - if (argument.Value.Type == ValueType.Numeric && argument.Value.Value is not decimal) + if (argument.Value.Type == FunctionValueType.Numeric && argument.Value.Value is not decimal) { return false; } - if (argument.Value.Type == ValueType.String && argument.Value.Value is not string) + if (argument.Value.Type == FunctionValueType.String && argument.Value.Value is not string) { return false; } diff --git a/src/stdlib/functions/Sign.cs b/src/stdlib/functions/Sign.cs index 1f3bc5c..f6578d5 100644 --- a/src/stdlib/functions/Sign.cs +++ b/src/stdlib/functions/Sign.cs @@ -1,5 +1,5 @@ using csmic; -using ValueType = csmic.ValueType; +using FunctionValueType = csmic.FunctionValueType; namespace stdlib.functions { @@ -23,7 +23,7 @@ namespace stdlib.functions var input = _args[0].Value; decimal number = Convert.ToDecimal(input.Value); - return new FunctionValue(ValueType.Numeric, number >= 0 ? POSITIVE : NEGATIVE); + return new FunctionValue(FunctionValueType.Numeric, number >= 0 ? POSITIVE : NEGATIVE); }); } } diff --git a/src/tests/StdlibFunctionsTests.cs b/src/tests/StdlibFunctionsTests.cs index cf01630..a8030c8 100644 --- a/src/tests/StdlibFunctionsTests.cs +++ b/src/tests/StdlibFunctionsTests.cs @@ -6,14 +6,14 @@ namespace tests; public class StdlibFunctionsTests { - private static FunctionArgument NumArg(decimal d) => new FunctionArgument("value", new FunctionValue(ValueType.Numeric, d)); + private static FunctionArgument NumArg(decimal d) => new FunctionArgument("value", new FunctionValue(FunctionValueType.Numeric, d)); [Test] public void AbsoluteValue_Positive_ReturnsSame() { var fn = new AbsoluteValue(); var result = fn.Execute(NumArg(5m)); - Assert.That(result.Type, Is.EqualTo(ValueType.Numeric)); + Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); Assert.That(result.Value, Is.EqualTo(5m)); } @@ -22,7 +22,7 @@ public class StdlibFunctionsTests { var fn = new AbsoluteValue(); var result = fn.Execute(NumArg(-12.5m)); - Assert.That(result.Type, Is.EqualTo(ValueType.Numeric)); + Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); Assert.That(result.Value, Is.EqualTo(12.5m)); } @@ -31,7 +31,7 @@ public class StdlibFunctionsTests { var fn = new AbsoluteValue(); var result = fn.Execute(NumArg(0m)); - Assert.That(result.Type, Is.EqualTo(ValueType.Numeric)); + Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); Assert.That(result.Value, Is.EqualTo(0m)); } @@ -41,7 +41,7 @@ public class StdlibFunctionsTests var fn = new AbsoluteValue(); var badArg = new FunctionArgument("value", FunctionValue.STRING); var result = fn.Execute(badArg); - Assert.That(result.Type, Is.EqualTo(ValueType.None)); + Assert.That(result.Type, Is.EqualTo(FunctionValueType.None)); Assert.That(result.Value, Is.Null); } @@ -51,8 +51,8 @@ public class StdlibFunctionsTests var fn = new AbsoluteValue(); var result0 = fn.Execute(); var result2 = fn.Execute(NumArg(1m), NumArg(2m)); - Assert.That(result0.Type, Is.EqualTo(ValueType.None)); - Assert.That(result2.Type, Is.EqualTo(ValueType.None)); + Assert.That(result0.Type, Is.EqualTo(FunctionValueType.None)); + Assert.That(result2.Type, Is.EqualTo(FunctionValueType.None)); } [Test] @@ -60,7 +60,7 @@ public class StdlibFunctionsTests { var fn = new Sign(); var result = fn.Execute(NumArg(-1m)); - Assert.That(result.Type, Is.EqualTo(ValueType.Numeric)); + Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); Assert.That(result.Value, Is.EqualTo(Sign.NEGATIVE)); } @@ -69,7 +69,7 @@ public class StdlibFunctionsTests { var fn = new Sign(); var result = fn.Execute(NumArg(0m)); - Assert.That(result.Type, Is.EqualTo(ValueType.Numeric)); + Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); Assert.That(result.Value, Is.EqualTo(Sign.POSITIVE)); } @@ -78,7 +78,7 @@ public class StdlibFunctionsTests { var fn = new Sign(); var result = fn.Execute(NumArg(99.99m)); - Assert.That(result.Type, Is.EqualTo(ValueType.Numeric)); + Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); Assert.That(result.Value, Is.EqualTo(Sign.POSITIVE)); } @@ -88,7 +88,7 @@ public class StdlibFunctionsTests var fn = new Sign(); var badArg = new FunctionArgument("value", FunctionValue.STRING); var result = fn.Execute(badArg); - Assert.That(result.Type, Is.EqualTo(ValueType.None)); + Assert.That(result.Type, Is.EqualTo(FunctionValueType.None)); Assert.That(result.Value, Is.Null); } @@ -98,8 +98,8 @@ public class StdlibFunctionsTests var fn = new Sign(); var result0 = fn.Execute(); var result2 = fn.Execute(NumArg(1m), NumArg(2m)); - Assert.That(result0.Type, Is.EqualTo(ValueType.None)); - Assert.That(result2.Type, Is.EqualTo(ValueType.None)); + Assert.That(result0.Type, Is.EqualTo(FunctionValueType.None)); + Assert.That(result2.Type, Is.EqualTo(FunctionValueType.None)); } } From e51068a27ee2ffd46b8584f59c52e32f472102a2 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Wed, 20 Aug 2025 05:28:05 -0500 Subject: [PATCH 40/54] Adding Min and Max --- src/stdlib/functions/Max.cs | 35 +++++++++++++++++++++++++++++++++++ src/stdlib/functions/Min.cs | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 src/stdlib/functions/Max.cs create mode 100644 src/stdlib/functions/Min.cs diff --git a/src/stdlib/functions/Max.cs b/src/stdlib/functions/Max.cs new file mode 100644 index 0000000..df3ba64 --- /dev/null +++ b/src/stdlib/functions/Max.cs @@ -0,0 +1,35 @@ +using csmic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace stdlib.functions +{ + public class Max : FunctionBase, ICodedFunction + { + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("first", FunctionValue.NUMBER); + yield return new FunctionArgument("second", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + var inputFirst = _args[0].Value; + var inputSecond = _args[1].Value; + decimal first = Convert.ToDecimal(inputFirst.Value); + decimal second = Convert.ToDecimal(inputSecond.Value); + + + return new FunctionValue(FunctionValueType.Numeric, Math.Min(first, second)); + }); + } + } +} diff --git a/src/stdlib/functions/Min.cs b/src/stdlib/functions/Min.cs new file mode 100644 index 0000000..18ca33e --- /dev/null +++ b/src/stdlib/functions/Min.cs @@ -0,0 +1,35 @@ +using csmic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace stdlib.functions +{ + public class Min : FunctionBase, ICodedFunction + { + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("first", FunctionValue.NUMBER); + yield return new FunctionArgument("second", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + var inputFirst = _args[0].Value; + var inputSecond = _args[1].Value; + decimal first = Convert.ToDecimal(inputFirst.Value); + decimal second = Convert.ToDecimal(inputSecond.Value); + + + return new FunctionValue(FunctionValueType.Numeric, Math.Min(first, second)); + }); + } + } +} From afb7a65a665e648a330ac44e800fe23f0003e22a Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Wed, 20 Aug 2025 05:45:22 -0500 Subject: [PATCH 41/54] Function registry fix. --- src/core/ICodedFunction.cs | 1 + src/core/InputInterpreter.cs | 4 +- src/stdlib/Constants.cs | 4 +- src/stdlib/Functions.cs | 26 +++++++ src/stdlib/functions/AbsoluteValue.cs | 8 ++ src/stdlib/functions/Max.cs | 8 ++ src/stdlib/functions/Min.cs | 8 ++ src/stdlib/functions/Sign.cs | 8 ++ src/tests/StdlibFunctionsTests.cs | 103 +++----------------------- 9 files changed, 74 insertions(+), 96 deletions(-) create mode 100644 src/stdlib/Functions.cs diff --git a/src/core/ICodedFunction.cs b/src/core/ICodedFunction.cs index 4baf142..b5df526 100644 --- a/src/core/ICodedFunction.cs +++ b/src/core/ICodedFunction.cs @@ -10,6 +10,7 @@ namespace csmic { #region Properties + string Name { get; } IEnumerable ExpectedArguments { get; } FunctionValue ReturnValue { get; } diff --git a/src/core/InputInterpreter.cs b/src/core/InputInterpreter.cs index a38ca53..a306ac1 100644 --- a/src/core/InputInterpreter.cs +++ b/src/core/InputInterpreter.cs @@ -173,9 +173,9 @@ namespace csmic #region Functions - internal void RegisterFunction(string name, ICodedFunction function) + public void RegisterFunction(ICodedFunction function) { - functions[name] = function; + functions[function.Name] = function; } internal FunctionValue ExecuteFunction(string name, params FunctionArgument[] args) diff --git a/src/stdlib/Constants.cs b/src/stdlib/Constants.cs index 1d332f0..c599ae1 100644 --- a/src/stdlib/Constants.cs +++ b/src/stdlib/Constants.cs @@ -1,8 +1,8 @@ namespace csmic.stdlib { - public class Constants + public static class Constants { - public void Initialize(InputInterpreter inputInterpreter) + public static void Initialize(InputInterpreter inputInterpreter) { if(inputInterpreter == null) { diff --git a/src/stdlib/Functions.cs b/src/stdlib/Functions.cs new file mode 100644 index 0000000..75b64c5 --- /dev/null +++ b/src/stdlib/Functions.cs @@ -0,0 +1,26 @@ +using csmic; +using stdlib.functions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace stdlib +{ + public static class Functions + { + public static void Initialize(InputInterpreter inputInterpreter) + { + if (inputInterpreter == null) + { + throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); + } + + inputInterpreter.RegisterFunction(new AbsoluteValue()); + inputInterpreter.RegisterFunction(new Sign()); + inputInterpreter.RegisterFunction(new Min()); + inputInterpreter.RegisterFunction(new Max()); + } + } +} diff --git a/src/stdlib/functions/AbsoluteValue.cs b/src/stdlib/functions/AbsoluteValue.cs index 14762fe..61e2d08 100644 --- a/src/stdlib/functions/AbsoluteValue.cs +++ b/src/stdlib/functions/AbsoluteValue.cs @@ -5,6 +5,14 @@ namespace stdlib.functions { public class AbsoluteValue : FunctionBase, ICodedFunction { + public string Name + { + get + { + return "abs"; + } + } + public override IEnumerable ExpectedArguments { get diff --git a/src/stdlib/functions/Max.cs b/src/stdlib/functions/Max.cs index df3ba64..9c60d85 100644 --- a/src/stdlib/functions/Max.cs +++ b/src/stdlib/functions/Max.cs @@ -9,6 +9,14 @@ namespace stdlib.functions { public class Max : FunctionBase, ICodedFunction { + public string Name + { + get + { + return "max"; + } + } + public override IEnumerable ExpectedArguments { get diff --git a/src/stdlib/functions/Min.cs b/src/stdlib/functions/Min.cs index 18ca33e..94d2faf 100644 --- a/src/stdlib/functions/Min.cs +++ b/src/stdlib/functions/Min.cs @@ -9,6 +9,14 @@ namespace stdlib.functions { public class Min : FunctionBase, ICodedFunction { + public string Name + { + get + { + return "min"; + } + } + public override IEnumerable ExpectedArguments { get diff --git a/src/stdlib/functions/Sign.cs b/src/stdlib/functions/Sign.cs index f6578d5..c1910d9 100644 --- a/src/stdlib/functions/Sign.cs +++ b/src/stdlib/functions/Sign.cs @@ -8,6 +8,14 @@ namespace stdlib.functions public const decimal POSITIVE = 1; public const decimal NEGATIVE = -1; + public string Name + { + get + { + return "sign"; + } + } + public override IEnumerable ExpectedArguments { get diff --git a/src/tests/StdlibFunctionsTests.cs b/src/tests/StdlibFunctionsTests.cs index a8030c8..1121ba2 100644 --- a/src/tests/StdlibFunctionsTests.cs +++ b/src/tests/StdlibFunctionsTests.cs @@ -1,105 +1,24 @@ using csmic; +using csmic.stdlib; using NUnit.Framework; +using stdlib; using stdlib.functions; +using System.Globalization; +using System.Reflection.Metadata; namespace tests; public class StdlibFunctionsTests { - private static FunctionArgument NumArg(decimal d) => new FunctionArgument("value", new FunctionValue(FunctionValueType.Numeric, d)); + private InputInterpreter _interp = null!; - [Test] - public void AbsoluteValue_Positive_ReturnsSame() + [SetUp] + public void Setup() { - var fn = new AbsoluteValue(); - var result = fn.Execute(NumArg(5m)); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); - Assert.That(result.Value, Is.EqualTo(5m)); - } - - [Test] - public void AbsoluteValue_Negative_ReturnsPositive() - { - var fn = new AbsoluteValue(); - var result = fn.Execute(NumArg(-12.5m)); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); - Assert.That(result.Value, Is.EqualTo(12.5m)); - } - - [Test] - public void AbsoluteValue_Zero_ReturnsZero() - { - var fn = new AbsoluteValue(); - var result = fn.Execute(NumArg(0m)); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); - Assert.That(result.Value, Is.EqualTo(0m)); - } - - [Test] - public void AbsoluteValue_InvalidArgType_ReturnsNone() - { - var fn = new AbsoluteValue(); - var badArg = new FunctionArgument("value", FunctionValue.STRING); - var result = fn.Execute(badArg); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.None)); - Assert.That(result.Value, Is.Null); - } - - [Test] - public void AbsoluteValue_WrongArgCount_ReturnsNone() - { - var fn = new AbsoluteValue(); - var result0 = fn.Execute(); - var result2 = fn.Execute(NumArg(1m), NumArg(2m)); - Assert.That(result0.Type, Is.EqualTo(FunctionValueType.None)); - Assert.That(result2.Type, Is.EqualTo(FunctionValueType.None)); - } - - [Test] - public void Sign_Negative_ReturnsNegativeOne() - { - var fn = new Sign(); - var result = fn.Execute(NumArg(-1m)); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); - Assert.That(result.Value, Is.EqualTo(Sign.NEGATIVE)); - } - - [Test] - public void Sign_Zero_ReturnsPositiveOne() - { - var fn = new Sign(); - var result = fn.Execute(NumArg(0m)); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); - Assert.That(result.Value, Is.EqualTo(Sign.POSITIVE)); - } - - [Test] - public void Sign_Positive_ReturnsPositiveOne() - { - var fn = new Sign(); - var result = fn.Execute(NumArg(99.99m)); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); - Assert.That(result.Value, Is.EqualTo(Sign.POSITIVE)); - } - - [Test] - public void Sign_InvalidArgType_ReturnsNone() - { - var fn = new Sign(); - var badArg = new FunctionArgument("value", FunctionValue.STRING); - var result = fn.Execute(badArg); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.None)); - Assert.That(result.Value, Is.Null); - } - - [Test] - public void Sign_WrongArgCount_ReturnsNone() - { - var fn = new Sign(); - var result0 = fn.Execute(); - var result2 = fn.Execute(NumArg(1m), NumArg(2m)); - Assert.That(result0.Type, Is.EqualTo(FunctionValueType.None)); - Assert.That(result2.Type, Is.EqualTo(FunctionValueType.None)); + CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; + _interp = new InputInterpreter(); + Constants.Initialize(_interp); + Functions.Initialize(_interp); ; } } From ced7fbd7c336424612d821901546a5c8183ae778 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Wed, 20 Aug 2025 05:53:37 -0500 Subject: [PATCH 42/54] tests(stdlib): add tests for abs, sign, min, max, constants --- src/tests/StdlibFunctionsTests.cs | 72 ++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/src/tests/StdlibFunctionsTests.cs b/src/tests/StdlibFunctionsTests.cs index 1121ba2..2bb097e 100644 --- a/src/tests/StdlibFunctionsTests.cs +++ b/src/tests/StdlibFunctionsTests.cs @@ -20,5 +20,75 @@ public class StdlibFunctionsTests Constants.Initialize(_interp); Functions.Initialize(_interp); ; } -} + private static void AssertSuccess(decimal result, decimal expected, InputInterpreter interp) + { + Assert.That(result, Is.EqualTo(expected)); + Assert.That(interp.NumericValue, Is.EqualTo(expected)); + Assert.That(interp.StringValue, Is.EqualTo(string.Empty)); + } + + [TestCase("abs(-1)", 1)] + [TestCase("abs(0)", 0)] + [TestCase("abs(2)", 2)] + [TestCase("abs(-3.5)", 3.5m)] + [TestCase("2 + abs(-1)", 3)] + public void AbsoluteValue_Works(string expr, decimal expected) + { + var result = _interp.Interpret(expr); + AssertSuccess(result, expected, _interp); + } + + [TestCase("sign(5)", 1)] + [TestCase("sign(0)", 1)] + [TestCase("sign(-2)", -1)] + [TestCase("2*sign(-3)", -2)] + public void Sign_Works(string expr, decimal expected) + { + var result = _interp.Interpret(expr); + AssertSuccess(result, expected, _interp); + } + + [TestCase("min(1,2)", 1)] + [TestCase("min(2,1)", 1)] + [TestCase("min(-3,4)", -3)] + [TestCase("1 + min(3,4)", 4)] + [TestCase("min(2.5, 2.6)", 2.5m)] + public void Min_Works(string expr, decimal expected) + { + var result = _interp.Interpret(expr); + AssertSuccess(result, expected, _interp); + } + + [TestCase("max(1,2)", 2)] + [TestCase("max(2,1)", 2)] + [TestCase("max(-3,4)", 4)] + [TestCase("1 + max(3,4)", 5)] + [TestCase("max(2.5, 2.6)", 2.6m)] + public void Max_Works(string expr, decimal expected) + { + var result = _interp.Interpret(expr); + AssertSuccess(result, expected, _interp); + } + + [TestCase("pi", 3.1415926535897931m)] + [TestCase("e", 2.7182818284590451m)] + [TestCase("tau", 6.2831853071795862m)] + [TestCase("phi", 1.6180339887498948m)] + [TestCase("goldenratio", 1.6180339887498948m)] + [TestCase("eurler", 0.5772156649015329m)] + [TestCase("omega", 0.5671432904097839m)] + public void Constants_AreAvailable(string expr, decimal expected) + { + var result = _interp.Interpret(expr); + AssertSuccess(result, expected, _interp); + } + + [Test] + public void Constants_CanBeUsedInArithmetic() + { + AssertSuccess(_interp.Interpret("2*pi"), 6.2831853071795862m, _interp); + AssertSuccess(_interp.Interpret("pi + e"), 5.8598744820488382m, _interp); + AssertSuccess(_interp.Interpret("tau / pi"), 2m, _interp); + } +} From 7c54bcd1e686d285f5e72924db04a2b6a1e8ce2d Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Wed, 20 Aug 2025 05:53:55 -0500 Subject: [PATCH 43/54] fix(stdlib): correct max() to use Math.Max --- src/stdlib/functions/Max.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stdlib/functions/Max.cs b/src/stdlib/functions/Max.cs index 9c60d85..be1ddaf 100644 --- a/src/stdlib/functions/Max.cs +++ b/src/stdlib/functions/Max.cs @@ -36,7 +36,7 @@ namespace stdlib.functions decimal second = Convert.ToDecimal(inputSecond.Value); - return new FunctionValue(FunctionValueType.Numeric, Math.Min(first, second)); + return new FunctionValue(FunctionValueType.Numeric, Math.Max(first, second)); }); } } From a19a092b93abe61205ea27bf46e815d2b98242b9 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Wed, 20 Aug 2025 06:04:04 -0500 Subject: [PATCH 44/54] Fixed test case declaration --- src/tests/StdlibFunctionsTests.cs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/tests/StdlibFunctionsTests.cs b/src/tests/StdlibFunctionsTests.cs index 2bb097e..9f806ec 100644 --- a/src/tests/StdlibFunctionsTests.cs +++ b/src/tests/StdlibFunctionsTests.cs @@ -31,7 +31,7 @@ public class StdlibFunctionsTests [TestCase("abs(-1)", 1)] [TestCase("abs(0)", 0)] [TestCase("abs(2)", 2)] - [TestCase("abs(-3.5)", 3.5m)] + [TestCase("abs(-3.5)", 3.5)] [TestCase("2 + abs(-1)", 3)] public void AbsoluteValue_Works(string expr, decimal expected) { @@ -53,7 +53,7 @@ public class StdlibFunctionsTests [TestCase("min(2,1)", 1)] [TestCase("min(-3,4)", -3)] [TestCase("1 + min(3,4)", 4)] - [TestCase("min(2.5, 2.6)", 2.5m)] + [TestCase("min(2.5, 2.6)", 2.5)] public void Min_Works(string expr, decimal expected) { var result = _interp.Interpret(expr); @@ -64,20 +64,20 @@ public class StdlibFunctionsTests [TestCase("max(2,1)", 2)] [TestCase("max(-3,4)", 4)] [TestCase("1 + max(3,4)", 5)] - [TestCase("max(2.5, 2.6)", 2.6m)] + [TestCase("max(2.5, 2.6)", 2.6)] public void Max_Works(string expr, decimal expected) { var result = _interp.Interpret(expr); AssertSuccess(result, expected, _interp); } - [TestCase("pi", 3.1415926535897931m)] - [TestCase("e", 2.7182818284590451m)] - [TestCase("tau", 6.2831853071795862m)] - [TestCase("phi", 1.6180339887498948m)] - [TestCase("goldenratio", 1.6180339887498948m)] - [TestCase("eurler", 0.5772156649015329m)] - [TestCase("omega", 0.5671432904097839m)] + [TestCase("pi", 3.1415926535897931)] + [TestCase("e", 2.7182818284590451)] + [TestCase("tau", 6.2831853071795862)] + [TestCase("phi", 1.6180339887498948)] + [TestCase("goldenratio", 1.6180339887498948)] + [TestCase("eurler", 0.5772156649015329)] + [TestCase("omega", 0.5671432904097839)] public void Constants_AreAvailable(string expr, decimal expected) { var result = _interp.Interpret(expr); From e84cce9fef99cca85f1af8d4493293b734672cc9 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Wed, 20 Aug 2025 06:06:42 -0500 Subject: [PATCH 45/54] tests(stdlib): avoid decimal attribute arguments; use string TestCase values and parse to decimal for high-precision cases --- src/tests/StdlibFunctionsTests.cs | 44 +++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/src/tests/StdlibFunctionsTests.cs b/src/tests/StdlibFunctionsTests.cs index 9f806ec..b006d70 100644 --- a/src/tests/StdlibFunctionsTests.cs +++ b/src/tests/StdlibFunctionsTests.cs @@ -31,7 +31,6 @@ public class StdlibFunctionsTests [TestCase("abs(-1)", 1)] [TestCase("abs(0)", 0)] [TestCase("abs(2)", 2)] - [TestCase("abs(-3.5)", 3.5)] [TestCase("2 + abs(-1)", 3)] public void AbsoluteValue_Works(string expr, decimal expected) { @@ -39,6 +38,14 @@ public class StdlibFunctionsTests AssertSuccess(result, expected, _interp); } + [TestCase("abs(-3.5)", "3.5")] + public void AbsoluteValue_Works_Decimal(string expr, string expectedStr) + { + var result = _interp.Interpret(expr); + var expected = decimal.Parse(expectedStr, CultureInfo.InvariantCulture); + AssertSuccess(result, expected, _interp); + } + [TestCase("sign(5)", 1)] [TestCase("sign(0)", 1)] [TestCase("sign(-2)", -1)] @@ -53,34 +60,49 @@ public class StdlibFunctionsTests [TestCase("min(2,1)", 1)] [TestCase("min(-3,4)", -3)] [TestCase("1 + min(3,4)", 4)] - [TestCase("min(2.5, 2.6)", 2.5)] public void Min_Works(string expr, decimal expected) { var result = _interp.Interpret(expr); AssertSuccess(result, expected, _interp); } + [TestCase("min(2.5, 2.6)", "2.5")] + public void Min_Works_Decimals(string expr, string expectedStr) + { + var result = _interp.Interpret(expr); + var expected = decimal.Parse(expectedStr, CultureInfo.InvariantCulture); + AssertSuccess(result, expected, _interp); + } + [TestCase("max(1,2)", 2)] [TestCase("max(2,1)", 2)] [TestCase("max(-3,4)", 4)] [TestCase("1 + max(3,4)", 5)] - [TestCase("max(2.5, 2.6)", 2.6)] public void Max_Works(string expr, decimal expected) { var result = _interp.Interpret(expr); AssertSuccess(result, expected, _interp); } - [TestCase("pi", 3.1415926535897931)] - [TestCase("e", 2.7182818284590451)] - [TestCase("tau", 6.2831853071795862)] - [TestCase("phi", 1.6180339887498948)] - [TestCase("goldenratio", 1.6180339887498948)] - [TestCase("eurler", 0.5772156649015329)] - [TestCase("omega", 0.5671432904097839)] - public void Constants_AreAvailable(string expr, decimal expected) + [TestCase("max(2.5, 2.6)", "2.6")] + public void Max_Works_Decimals(string expr, string expectedStr) { var result = _interp.Interpret(expr); + var expected = decimal.Parse(expectedStr, CultureInfo.InvariantCulture); + AssertSuccess(result, expected, _interp); + } + + [TestCase("pi", "3.1415926535897931")] + [TestCase("e", "2.7182818284590451")] + [TestCase("tau", "6.2831853071795862")] + [TestCase("phi", "1.6180339887498948")] + [TestCase("goldenratio", "1.6180339887498948")] + [TestCase("eurler", "0.5772156649015329")] + [TestCase("omega", "0.5671432904097839")] + public void Constants_AreAvailable(string expr, string expectedStr) + { + var result = _interp.Interpret(expr); + var expected = decimal.Parse(expectedStr, CultureInfo.InvariantCulture); AssertSuccess(result, expected, _interp); } From 0a67e6e2cc4b745a1ba945bb90a9f08ccc517107 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Wed, 20 Aug 2025 20:10:34 -0500 Subject: [PATCH 46/54] Adopt .NET naming and structure: CsMic.* namespaces, PascalCase projects and solution; update Coco namespace; update package id and NuGet publish target; adjust project refs and tests. --- src/{core/core.csproj => Core/CsMic.Core.csproj} | 7 ++++--- src/{core => Core}/FunctionArgument.cs | 2 +- src/{core => Core}/FunctionValue.cs | 4 ++-- src/{core => Core}/FunctionValueType.cs | 2 +- src/{core => Core}/ICodedFunction.cs | 2 +- src/{core => Core}/InputInterpreter.cs | 10 +++++----- src/{core => Core}/NuGetPublish.targets | 4 ++-- src/{core => Core}/Variable.cs | 2 +- src/{core => Core}/VariableType.cs | 2 +- src/{core => Core}/cocor/Interpreter.atg | 2 +- src/{core => Core}/cocor/Parser.frame | 0 src/{core => Core}/cocor/Scanner.frame | 0 src/{cs-mic.sln => CsMic.sln} | 7 +++---- src/{stdlib => StandardLibrary}/Constants.cs | 4 +++- .../CsMic.StandardLibrary.csproj} | 4 +++- src/{stdlib => StandardLibrary}/Functions.cs | 6 +++--- .../functions/AbsoluteValue.cs | 6 +++--- .../functions/FunctionBase.cs | 6 +++--- src/{stdlib => StandardLibrary}/functions/Max.cs | 4 ++-- src/{stdlib => StandardLibrary}/functions/Min.cs | 4 ++-- src/{stdlib => StandardLibrary}/functions/Sign.cs | 6 +++--- src/{tests/tests.csproj => Tests/CsMic.Tests.csproj} | 6 ++++-- src/{tests => Tests}/InputInterpreterTests.cs | 4 ++-- src/{tests => Tests}/StdlibFunctionsTests.cs | 9 ++++----- 24 files changed, 54 insertions(+), 49 deletions(-) rename src/{core/core.csproj => Core/CsMic.Core.csproj} (74%) rename src/{core => Core}/FunctionArgument.cs (96%) rename src/{core => Core}/FunctionValue.cs (97%) rename src/{core => Core}/FunctionValueType.cs (93%) rename src/{core => Core}/ICodedFunction.cs (96%) rename src/{core => Core}/InputInterpreter.cs (95%) rename src/{core => Core}/NuGetPublish.targets (85%) rename src/{core => Core}/Variable.cs (95%) rename src/{core => Core}/VariableType.cs (91%) rename src/{core => Core}/cocor/Interpreter.atg (99%) rename src/{core => Core}/cocor/Parser.frame (100%) rename src/{core => Core}/cocor/Scanner.frame (100%) rename src/{cs-mic.sln => CsMic.sln} (81%) rename src/{stdlib => StandardLibrary}/Constants.cs (94%) rename src/{stdlib/stdlib.csproj => StandardLibrary/CsMic.StandardLibrary.csproj} (64%) rename src/{stdlib => StandardLibrary}/Functions.cs (88%) rename src/{stdlib => StandardLibrary}/functions/AbsoluteValue.cs (87%) rename src/{stdlib => StandardLibrary}/functions/FunctionBase.cs (94%) rename src/{stdlib => StandardLibrary}/functions/Max.cs (95%) rename src/{stdlib => StandardLibrary}/functions/Min.cs (95%) rename src/{stdlib => StandardLibrary}/functions/Sign.cs (89%) rename src/{tests/tests.csproj => Tests/CsMic.Tests.csproj} (76%) rename src/{tests => Tests}/InputInterpreterTests.cs (99%) rename src/{tests => Tests}/StdlibFunctionsTests.cs (97%) diff --git a/src/core/core.csproj b/src/Core/CsMic.Core.csproj similarity index 74% rename from src/core/core.csproj rename to src/Core/CsMic.Core.csproj index 9ddca4e..f6c72b7 100644 --- a/src/core/core.csproj +++ b/src/Core/CsMic.Core.csproj @@ -2,16 +2,17 @@ net9.0 - cs_mic.core + CsMic enable enable False + CsMic.Core 2.0.0-beta-01 - cs-mic + CsMic - + diff --git a/src/core/FunctionArgument.cs b/src/Core/FunctionArgument.cs similarity index 96% rename from src/core/FunctionArgument.cs rename to src/Core/FunctionArgument.cs index 103223f..86e9d93 100644 --- a/src/core/FunctionArgument.cs +++ b/src/Core/FunctionArgument.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace csmic +namespace CsMic { public class FunctionArgument { diff --git a/src/core/FunctionValue.cs b/src/Core/FunctionValue.cs similarity index 97% rename from src/core/FunctionValue.cs rename to src/Core/FunctionValue.cs index f5b396e..8f7398f 100644 --- a/src/core/FunctionValue.cs +++ b/src/Core/FunctionValue.cs @@ -1,11 +1,11 @@ -using csmic; +using CsMic; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace csmic +namespace CsMic { public class FunctionValue { diff --git a/src/core/FunctionValueType.cs b/src/Core/FunctionValueType.cs similarity index 93% rename from src/core/FunctionValueType.cs rename to src/Core/FunctionValueType.cs index 5d3c9c0..9a8f140 100644 --- a/src/core/FunctionValueType.cs +++ b/src/Core/FunctionValueType.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace csmic +namespace CsMic { public enum FunctionValueType { diff --git a/src/core/ICodedFunction.cs b/src/Core/ICodedFunction.cs similarity index 96% rename from src/core/ICodedFunction.cs rename to src/Core/ICodedFunction.cs index b5df526..d7642bd 100644 --- a/src/core/ICodedFunction.cs +++ b/src/Core/ICodedFunction.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace csmic +namespace CsMic { public interface ICodedFunction { diff --git a/src/core/InputInterpreter.cs b/src/Core/InputInterpreter.cs similarity index 95% rename from src/core/InputInterpreter.cs rename to src/Core/InputInterpreter.cs index a306ac1..d3a8533 100644 --- a/src/core/InputInterpreter.cs +++ b/src/Core/InputInterpreter.cs @@ -2,7 +2,7 @@ using System.Text; using System.IO; -namespace csmic +namespace CsMic { public class InputInterpreter { @@ -122,8 +122,8 @@ namespace csmic // Create a child interpreter sharing stores, so ProduceOutput doesn't affect parent state var child = new InputInterpreter(this); using var ms = new MemoryStream(Encoding.UTF8.GetBytes(expressionText)); - var scanner = new csmic.Interpreter.Scanner(ms); - var parser = new csmic.Interpreter.Parser(scanner) + var scanner = new CsMic.Interpreter.Scanner(ms); + var parser = new CsMic.Interpreter.Parser(scanner) { Interpreter = child }; @@ -138,8 +138,8 @@ namespace csmic try { using var ms = new MemoryStream(Encoding.UTF8.GetBytes(input ?? string.Empty)); - var scanner = new csmic.Interpreter.Scanner(ms); - var parser = new csmic.Interpreter.Parser(scanner) + var scanner = new CsMic.Interpreter.Scanner(ms); + var parser = new CsMic.Interpreter.Parser(scanner) { Interpreter = this }; diff --git a/src/core/NuGetPublish.targets b/src/Core/NuGetPublish.targets similarity index 85% rename from src/core/NuGetPublish.targets rename to src/Core/NuGetPublish.targets index 4feeb24..1b90dd3 100644 --- a/src/core/NuGetPublish.targets +++ b/src/Core/NuGetPublish.targets @@ -1,6 +1,6 @@  - + - \ No newline at end of file + diff --git a/src/core/Variable.cs b/src/Core/Variable.cs similarity index 95% rename from src/core/Variable.cs rename to src/Core/Variable.cs index 166d4fb..4a57322 100644 --- a/src/core/Variable.cs +++ b/src/Core/Variable.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace cs_mic.core +namespace CsMic { public class Variable { diff --git a/src/core/VariableType.cs b/src/Core/VariableType.cs similarity index 91% rename from src/core/VariableType.cs rename to src/Core/VariableType.cs index 4061f70..06f16be 100644 --- a/src/core/VariableType.cs +++ b/src/Core/VariableType.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace cs_mic.core +namespace CsMic { public enum VariableType { diff --git a/src/core/cocor/Interpreter.atg b/src/Core/cocor/Interpreter.atg similarity index 99% rename from src/core/cocor/Interpreter.atg rename to src/Core/cocor/Interpreter.atg index 67ba9c3..b44a7d6 100644 --- a/src/core/cocor/Interpreter.atg +++ b/src/Core/cocor/Interpreter.atg @@ -2,7 +2,7 @@ using System.Globalization; using System.Text; using System.Collections.Generic; -using csmic; +using CsMic; COMPILER INTERPRETER diff --git a/src/core/cocor/Parser.frame b/src/Core/cocor/Parser.frame similarity index 100% rename from src/core/cocor/Parser.frame rename to src/Core/cocor/Parser.frame diff --git a/src/core/cocor/Scanner.frame b/src/Core/cocor/Scanner.frame similarity index 100% rename from src/core/cocor/Scanner.frame rename to src/Core/cocor/Scanner.frame diff --git a/src/cs-mic.sln b/src/CsMic.sln similarity index 81% rename from src/cs-mic.sln rename to src/CsMic.sln index e021e8e..ce873a4 100644 --- a/src/cs-mic.sln +++ b/src/CsMic.sln @@ -1,18 +1,17 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.12.35707.178 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "core", "core\core.csproj", "{5387FF55-3044-4EB4-BB90-AD2E922131C1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsMic.Core", "Core\CsMic.Core.csproj", "{5387FF55-3044-4EB4-BB90-AD2E922131C1}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6394EDF0-24F7-4B75-B4CE-E5F884EE88AC}" ProjectSection(SolutionItems) = preProject setup.ps1 = setup.ps1 EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tests", "tests\tests.csproj", "{F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsMic.Tests", "Tests\CsMic.Tests.csproj", "{F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "stdlib", "stdlib\stdlib.csproj", "{F7AD600D-4247-49CE-9A26-B20C6F2FF6AE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsMic.StandardLibrary", "StandardLibrary\CsMic.StandardLibrary.csproj", "{F7AD600D-4247-49CE-9A26-B20C6F2FF6AE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/stdlib/Constants.cs b/src/StandardLibrary/Constants.cs similarity index 94% rename from src/stdlib/Constants.cs rename to src/StandardLibrary/Constants.cs index c599ae1..a458182 100644 --- a/src/stdlib/Constants.cs +++ b/src/StandardLibrary/Constants.cs @@ -1,4 +1,6 @@ -namespace csmic.stdlib +using CsMic; + +namespace CsMic.StandardLibrary { public static class Constants { diff --git a/src/stdlib/stdlib.csproj b/src/StandardLibrary/CsMic.StandardLibrary.csproj similarity index 64% rename from src/stdlib/stdlib.csproj rename to src/StandardLibrary/CsMic.StandardLibrary.csproj index 302b8c2..3931d94 100644 --- a/src/stdlib/stdlib.csproj +++ b/src/StandardLibrary/CsMic.StandardLibrary.csproj @@ -2,12 +2,14 @@ net9.0 + CsMic.StandardLibrary + CsMic.StandardLibrary enable enable - + diff --git a/src/stdlib/Functions.cs b/src/StandardLibrary/Functions.cs similarity index 88% rename from src/stdlib/Functions.cs rename to src/StandardLibrary/Functions.cs index 75b64c5..00a077b 100644 --- a/src/stdlib/Functions.cs +++ b/src/StandardLibrary/Functions.cs @@ -1,12 +1,12 @@ -using csmic; -using stdlib.functions; +using CsMic; +using CsMic.StandardLibrary.Functions; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace stdlib +namespace CsMic.StandardLibrary { public static class Functions { diff --git a/src/stdlib/functions/AbsoluteValue.cs b/src/StandardLibrary/functions/AbsoluteValue.cs similarity index 87% rename from src/stdlib/functions/AbsoluteValue.cs rename to src/StandardLibrary/functions/AbsoluteValue.cs index 61e2d08..141c6e2 100644 --- a/src/stdlib/functions/AbsoluteValue.cs +++ b/src/StandardLibrary/functions/AbsoluteValue.cs @@ -1,7 +1,7 @@ -using csmic; -using FunctionValueType = csmic.FunctionValueType; +using CsMic; +using FunctionValueType = CsMic.FunctionValueType; -namespace stdlib.functions +namespace CsMic.StandardLibrary.Functions { public class AbsoluteValue : FunctionBase, ICodedFunction { diff --git a/src/stdlib/functions/FunctionBase.cs b/src/StandardLibrary/functions/FunctionBase.cs similarity index 94% rename from src/stdlib/functions/FunctionBase.cs rename to src/StandardLibrary/functions/FunctionBase.cs index 338d2d7..94ce5ec 100644 --- a/src/stdlib/functions/FunctionBase.cs +++ b/src/StandardLibrary/functions/FunctionBase.cs @@ -1,7 +1,7 @@ -using csmic; -using FunctionValueType = csmic.FunctionValueType; +using CsMic; +using FunctionValueType = CsMic.FunctionValueType; -namespace stdlib.functions +namespace CsMic.StandardLibrary.Functions { public abstract class FunctionBase { diff --git a/src/stdlib/functions/Max.cs b/src/StandardLibrary/functions/Max.cs similarity index 95% rename from src/stdlib/functions/Max.cs rename to src/StandardLibrary/functions/Max.cs index be1ddaf..2d44115 100644 --- a/src/stdlib/functions/Max.cs +++ b/src/StandardLibrary/functions/Max.cs @@ -1,11 +1,11 @@ -using csmic; +using CsMic; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace stdlib.functions +namespace CsMic.StandardLibrary.Functions { public class Max : FunctionBase, ICodedFunction { diff --git a/src/stdlib/functions/Min.cs b/src/StandardLibrary/functions/Min.cs similarity index 95% rename from src/stdlib/functions/Min.cs rename to src/StandardLibrary/functions/Min.cs index 94d2faf..e4d4e7e 100644 --- a/src/stdlib/functions/Min.cs +++ b/src/StandardLibrary/functions/Min.cs @@ -1,11 +1,11 @@ -using csmic; +using CsMic; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace stdlib.functions +namespace CsMic.StandardLibrary.Functions { public class Min : FunctionBase, ICodedFunction { diff --git a/src/stdlib/functions/Sign.cs b/src/StandardLibrary/functions/Sign.cs similarity index 89% rename from src/stdlib/functions/Sign.cs rename to src/StandardLibrary/functions/Sign.cs index c1910d9..4b02a9d 100644 --- a/src/stdlib/functions/Sign.cs +++ b/src/StandardLibrary/functions/Sign.cs @@ -1,7 +1,7 @@ -using csmic; -using FunctionValueType = csmic.FunctionValueType; +using CsMic; +using FunctionValueType = CsMic.FunctionValueType; -namespace stdlib.functions +namespace CsMic.StandardLibrary.Functions { public class Sign : FunctionBase, ICodedFunction { diff --git a/src/tests/tests.csproj b/src/Tests/CsMic.Tests.csproj similarity index 76% rename from src/tests/tests.csproj rename to src/Tests/CsMic.Tests.csproj index 390ce9d..79d7625 100644 --- a/src/tests/tests.csproj +++ b/src/Tests/CsMic.Tests.csproj @@ -6,6 +6,8 @@ enable enable false + CsMic.Tests + CsMic.Tests @@ -17,8 +19,8 @@ - - + + diff --git a/src/tests/InputInterpreterTests.cs b/src/Tests/InputInterpreterTests.cs similarity index 99% rename from src/tests/InputInterpreterTests.cs rename to src/Tests/InputInterpreterTests.cs index 2622526..18ec19b 100644 --- a/src/tests/InputInterpreterTests.cs +++ b/src/Tests/InputInterpreterTests.cs @@ -1,7 +1,7 @@ using System.Globalization; -using csmic; +using CsMic; -namespace tests; +namespace CsMic.Tests; public class InputInterpreterTests { diff --git a/src/tests/StdlibFunctionsTests.cs b/src/Tests/StdlibFunctionsTests.cs similarity index 97% rename from src/tests/StdlibFunctionsTests.cs rename to src/Tests/StdlibFunctionsTests.cs index b006d70..40685cf 100644 --- a/src/tests/StdlibFunctionsTests.cs +++ b/src/Tests/StdlibFunctionsTests.cs @@ -1,12 +1,11 @@ -using csmic; -using csmic.stdlib; +using CsMic; +using CsMic.StandardLibrary; using NUnit.Framework; -using stdlib; -using stdlib.functions; +using CsMic.StandardLibrary.Functions; using System.Globalization; using System.Reflection.Metadata; -namespace tests; +namespace CsMic.Tests; public class StdlibFunctionsTests { From 9b74c03a9d30043d0f8aa683985bd62a3d25c948 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Wed, 20 Aug 2025 20:32:13 -0500 Subject: [PATCH 47/54] Cleaning up naming --- src/Core/CsMic.Core.csproj | 8 +++--- src/Core/FunctionArgument.cs | 2 +- src/Core/FunctionValue.cs | 4 +-- src/Core/FunctionValueType.cs | 2 +- src/Core/ICodedFunction.cs | 2 +- src/Core/InputInterpreter.cs | 10 +++---- src/Core/NuGetPublish.targets | 2 +- src/Core/Variable.cs | 2 +- src/Core/VariableType.cs | 2 +- src/Core/cocor/Interpreter.atg | 2 +- src/CsMic.sln | 28 ++++++++----------- src/StandardLibrary/Constants.cs | 4 +-- .../CsMic.StandardLibrary.csproj | 10 ++++--- src/StandardLibrary/Functions.cs | 6 ++-- .../functions/AbsoluteValue.cs | 5 ++-- src/StandardLibrary/functions/FunctionBase.cs | 5 ++-- src/StandardLibrary/functions/Max.cs | 4 +-- src/StandardLibrary/functions/Min.cs | 4 +-- src/StandardLibrary/functions/Sign.cs | 6 ++-- ...{CsMic.Tests.csproj => CCMic.Tests.csproj} | 8 +++--- src/Tests/InputInterpreterTests.cs | 4 +-- src/Tests/StdlibFunctionsTests.cs | 8 +++--- 22 files changed, 61 insertions(+), 67 deletions(-) rename src/Tests/{CsMic.Tests.csproj => CCMic.Tests.csproj} (78%) diff --git a/src/Core/CsMic.Core.csproj b/src/Core/CsMic.Core.csproj index f6c72b7..7daac77 100644 --- a/src/Core/CsMic.Core.csproj +++ b/src/Core/CsMic.Core.csproj @@ -2,17 +2,17 @@ net9.0 - CsMic + CSMic enable enable False - CsMic.Core + CSMic.Core 2.0.0-beta-01 - CsMic + CSMic - + diff --git a/src/Core/FunctionArgument.cs b/src/Core/FunctionArgument.cs index 86e9d93..80b5d6f 100644 --- a/src/Core/FunctionArgument.cs +++ b/src/Core/FunctionArgument.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace CsMic +namespace CSMic { public class FunctionArgument { diff --git a/src/Core/FunctionValue.cs b/src/Core/FunctionValue.cs index 8f7398f..9d74307 100644 --- a/src/Core/FunctionValue.cs +++ b/src/Core/FunctionValue.cs @@ -1,11 +1,11 @@ -using CsMic; +using CSMic; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace CsMic +namespace CSMic { public class FunctionValue { diff --git a/src/Core/FunctionValueType.cs b/src/Core/FunctionValueType.cs index 9a8f140..5649c92 100644 --- a/src/Core/FunctionValueType.cs +++ b/src/Core/FunctionValueType.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace CsMic +namespace CSMic { public enum FunctionValueType { diff --git a/src/Core/ICodedFunction.cs b/src/Core/ICodedFunction.cs index d7642bd..d81e7d8 100644 --- a/src/Core/ICodedFunction.cs +++ b/src/Core/ICodedFunction.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace CsMic +namespace CSMic { public interface ICodedFunction { diff --git a/src/Core/InputInterpreter.cs b/src/Core/InputInterpreter.cs index d3a8533..8156c15 100644 --- a/src/Core/InputInterpreter.cs +++ b/src/Core/InputInterpreter.cs @@ -2,7 +2,7 @@ using System.Text; using System.IO; -namespace CsMic +namespace CSMic { public class InputInterpreter { @@ -122,8 +122,8 @@ namespace CsMic // Create a child interpreter sharing stores, so ProduceOutput doesn't affect parent state var child = new InputInterpreter(this); using var ms = new MemoryStream(Encoding.UTF8.GetBytes(expressionText)); - var scanner = new CsMic.Interpreter.Scanner(ms); - var parser = new CsMic.Interpreter.Parser(scanner) + var scanner = new CSMic.Interpreter.Scanner(ms); + var parser = new CSMic.Interpreter.Parser(scanner) { Interpreter = child }; @@ -138,8 +138,8 @@ namespace CsMic try { using var ms = new MemoryStream(Encoding.UTF8.GetBytes(input ?? string.Empty)); - var scanner = new CsMic.Interpreter.Scanner(ms); - var parser = new CsMic.Interpreter.Parser(scanner) + var scanner = new CSMic.Interpreter.Scanner(ms); + var parser = new CSMic.Interpreter.Parser(scanner) { Interpreter = this }; diff --git a/src/Core/NuGetPublish.targets b/src/Core/NuGetPublish.targets index 1b90dd3..dfe580a 100644 --- a/src/Core/NuGetPublish.targets +++ b/src/Core/NuGetPublish.targets @@ -1,6 +1,6 @@  - + diff --git a/src/Core/Variable.cs b/src/Core/Variable.cs index 4a57322..434daa1 100644 --- a/src/Core/Variable.cs +++ b/src/Core/Variable.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace CsMic +namespace CSMic { public class Variable { diff --git a/src/Core/VariableType.cs b/src/Core/VariableType.cs index 06f16be..ada5056 100644 --- a/src/Core/VariableType.cs +++ b/src/Core/VariableType.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace CsMic +namespace CSMic { public enum VariableType { diff --git a/src/Core/cocor/Interpreter.atg b/src/Core/cocor/Interpreter.atg index b44a7d6..2a641ba 100644 --- a/src/Core/cocor/Interpreter.atg +++ b/src/Core/cocor/Interpreter.atg @@ -2,7 +2,7 @@ using System.Globalization; using System.Text; using System.Collections.Generic; -using CsMic; +using CSMic; COMPILER INTERPRETER diff --git a/src/CsMic.sln b/src/CsMic.sln index ce873a4..8287e3d 100644 --- a/src/CsMic.sln +++ b/src/CsMic.sln @@ -1,37 +1,31 @@ + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.12.35707.178 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsMic.Core", "Core\CsMic.Core.csproj", "{5387FF55-3044-4EB4-BB90-AD2E922131C1}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6394EDF0-24F7-4B75-B4CE-E5F884EE88AC}" ProjectSection(SolutionItems) = preProject setup.ps1 = setup.ps1 EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsMic.Tests", "Tests\CsMic.Tests.csproj", "{F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSMic.Core", "Core\CSMic.Core.csproj", "{4DAA770D-1624-48D7-8D92-2B2067E21C27}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsMic.StandardLibrary", "StandardLibrary\CsMic.StandardLibrary.csproj", "{F7AD600D-4247-49CE-9A26-B20C6F2FF6AE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSMic.StandardLibrary", "StandardLibrary\CSMic.StandardLibrary.csproj", "{1533FED0-C765-4929-8797-CE6C2E594DAB}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU - Description = CS-MIC is a .NET library written in C# designed to give developers easy access to expression parsing. EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5387FF55-3044-4EB4-BB90-AD2E922131C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5387FF55-3044-4EB4-BB90-AD2E922131C1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5387FF55-3044-4EB4-BB90-AD2E922131C1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5387FF55-3044-4EB4-BB90-AD2E922131C1}.Release|Any CPU.Build.0 = Release|Any CPU - {F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F356A0E2-1338-43FE-B4C0-1AE7C9F0685F}.Release|Any CPU.Build.0 = Release|Any CPU - {F7AD600D-4247-49CE-9A26-B20C6F2FF6AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F7AD600D-4247-49CE-9A26-B20C6F2FF6AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F7AD600D-4247-49CE-9A26-B20C6F2FF6AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F7AD600D-4247-49CE-9A26-B20C6F2FF6AE}.Release|Any CPU.Build.0 = Release|Any CPU + {4DAA770D-1624-48D7-8D92-2B2067E21C27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4DAA770D-1624-48D7-8D92-2B2067E21C27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4DAA770D-1624-48D7-8D92-2B2067E21C27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4DAA770D-1624-48D7-8D92-2B2067E21C27}.Release|Any CPU.Build.0 = Release|Any CPU + {1533FED0-C765-4929-8797-CE6C2E594DAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1533FED0-C765-4929-8797-CE6C2E594DAB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1533FED0-C765-4929-8797-CE6C2E594DAB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1533FED0-C765-4929-8797-CE6C2E594DAB}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/StandardLibrary/Constants.cs b/src/StandardLibrary/Constants.cs index a458182..dacfc9f 100644 --- a/src/StandardLibrary/Constants.cs +++ b/src/StandardLibrary/Constants.cs @@ -1,6 +1,6 @@ -using CsMic; +using CSMic; -namespace CsMic.StandardLibrary +namespace CSMic.StandardLibrary { public static class Constants { diff --git a/src/StandardLibrary/CsMic.StandardLibrary.csproj b/src/StandardLibrary/CsMic.StandardLibrary.csproj index 3931d94..78bd2a7 100644 --- a/src/StandardLibrary/CsMic.StandardLibrary.csproj +++ b/src/StandardLibrary/CsMic.StandardLibrary.csproj @@ -2,18 +2,20 @@ net9.0 - CsMic.StandardLibrary - CsMic.StandardLibrary + CSMic.StandardLibrary + CSMic.StandardLibrary enable enable - + + + - + diff --git a/src/StandardLibrary/Functions.cs b/src/StandardLibrary/Functions.cs index 00a077b..10c88fe 100644 --- a/src/StandardLibrary/Functions.cs +++ b/src/StandardLibrary/Functions.cs @@ -1,12 +1,12 @@ -using CsMic; -using CsMic.StandardLibrary.Functions; +using CSMic; +using CSMic.StandardLibrary.Functions; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace CsMic.StandardLibrary +namespace CSMic.StandardLibrary { public static class Functions { diff --git a/src/StandardLibrary/functions/AbsoluteValue.cs b/src/StandardLibrary/functions/AbsoluteValue.cs index 141c6e2..d40bca8 100644 --- a/src/StandardLibrary/functions/AbsoluteValue.cs +++ b/src/StandardLibrary/functions/AbsoluteValue.cs @@ -1,7 +1,6 @@ -using CsMic; -using FunctionValueType = CsMic.FunctionValueType; +using CSMic; -namespace CsMic.StandardLibrary.Functions +namespace CSMic.StandardLibrary.Functions { public class AbsoluteValue : FunctionBase, ICodedFunction { diff --git a/src/StandardLibrary/functions/FunctionBase.cs b/src/StandardLibrary/functions/FunctionBase.cs index 94ce5ec..eff760f 100644 --- a/src/StandardLibrary/functions/FunctionBase.cs +++ b/src/StandardLibrary/functions/FunctionBase.cs @@ -1,7 +1,6 @@ -using CsMic; -using FunctionValueType = CsMic.FunctionValueType; +using CSMic; -namespace CsMic.StandardLibrary.Functions +namespace CSMic.StandardLibrary.Functions { public abstract class FunctionBase { diff --git a/src/StandardLibrary/functions/Max.cs b/src/StandardLibrary/functions/Max.cs index 2d44115..6a62f27 100644 --- a/src/StandardLibrary/functions/Max.cs +++ b/src/StandardLibrary/functions/Max.cs @@ -1,11 +1,11 @@ -using CsMic; +using CSMic; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace CsMic.StandardLibrary.Functions +namespace CSMic.StandardLibrary.Functions { public class Max : FunctionBase, ICodedFunction { diff --git a/src/StandardLibrary/functions/Min.cs b/src/StandardLibrary/functions/Min.cs index e4d4e7e..620262e 100644 --- a/src/StandardLibrary/functions/Min.cs +++ b/src/StandardLibrary/functions/Min.cs @@ -1,11 +1,11 @@ -using CsMic; +using CSMic; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace CsMic.StandardLibrary.Functions +namespace CSMic.StandardLibrary.Functions { public class Min : FunctionBase, ICodedFunction { diff --git a/src/StandardLibrary/functions/Sign.cs b/src/StandardLibrary/functions/Sign.cs index 4b02a9d..8d9c48a 100644 --- a/src/StandardLibrary/functions/Sign.cs +++ b/src/StandardLibrary/functions/Sign.cs @@ -1,7 +1,7 @@ -using CsMic; -using FunctionValueType = CsMic.FunctionValueType; +using CSMic; -namespace CsMic.StandardLibrary.Functions + +namespace CSMic.StandardLibrary.Functions { public class Sign : FunctionBase, ICodedFunction { diff --git a/src/Tests/CsMic.Tests.csproj b/src/Tests/CCMic.Tests.csproj similarity index 78% rename from src/Tests/CsMic.Tests.csproj rename to src/Tests/CCMic.Tests.csproj index 79d7625..8958b81 100644 --- a/src/Tests/CsMic.Tests.csproj +++ b/src/Tests/CCMic.Tests.csproj @@ -6,8 +6,8 @@ enable enable false - CsMic.Tests - CsMic.Tests + CSMic.Tests + CSMic.Tests @@ -19,8 +19,8 @@ - - + + diff --git a/src/Tests/InputInterpreterTests.cs b/src/Tests/InputInterpreterTests.cs index 18ec19b..bda2886 100644 --- a/src/Tests/InputInterpreterTests.cs +++ b/src/Tests/InputInterpreterTests.cs @@ -1,7 +1,7 @@ using System.Globalization; -using CsMic; +using CSMic; -namespace CsMic.Tests; +namespace CSMic.Tests; public class InputInterpreterTests { diff --git a/src/Tests/StdlibFunctionsTests.cs b/src/Tests/StdlibFunctionsTests.cs index 40685cf..add1b05 100644 --- a/src/Tests/StdlibFunctionsTests.cs +++ b/src/Tests/StdlibFunctionsTests.cs @@ -1,11 +1,11 @@ -using CsMic; -using CsMic.StandardLibrary; +using CSMic; +using CSMic.StandardLibrary; using NUnit.Framework; -using CsMic.StandardLibrary.Functions; +using CSMic.StandardLibrary.Functions; using System.Globalization; using System.Reflection.Metadata; -namespace CsMic.Tests; +namespace CSMic.Tests; public class StdlibFunctionsTests { From 808d4ca420dce18ae0eac2e8cb3079c45f0fec04 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Thu, 21 Aug 2025 03:24:13 -0500 Subject: [PATCH 48/54] Surface ICodedFunction exceptions: set interpreter message via ProduceOutput in ExecuteFunction --- src/Core/InputInterpreter.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Core/InputInterpreter.cs b/src/Core/InputInterpreter.cs index 8156c15..c9c31c1 100644 --- a/src/Core/InputInterpreter.cs +++ b/src/Core/InputInterpreter.cs @@ -186,8 +186,10 @@ namespace CSMic { return fn.Execute(args); } - catch + catch (Exception ex) { + // Surface function errors to the interpreter's message channel + ProduceOutput(0m, ex.Message); return new FunctionValue(FunctionValueType.None, null); } } From 4a21ff3d4625e9fe0ab4ff02a1006cbf66c6d0be Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Thu, 21 Aug 2025 03:44:04 -0500 Subject: [PATCH 49/54] Adding functions to Standard Library --- src/Core/FunctionValue.cs | 1 + src/StandardLibrary/Constants.cs | 23 ---- src/StandardLibrary/Functions.cs | 26 ----- .../Functions/Angle/Degrees.cs | 33 ++++++ .../Functions/Angle/Radians.cs | 33 ++++++ .../Functions/Angle/WrapAngle.cs | 43 +++++++ .../NumberTheory/BinomialCoefficient.cs | 68 +++++++++++ .../Functions/NumberTheory/Factorial.cs | 110 ++++++++++++++++++ .../NumberTheory/GreatedCommonDenomitator.cs | 65 +++++++++++ .../NumberTheory/LeastCommonMultiple.cs | 62 ++++++++++ .../Functions/NumberTheory/Permutations.cs | 67 +++++++++++ .../Functions/Random/Bernoulli.cs | 45 +++++++ .../Functions/Random/FairFlip.cs | 37 ++++++ .../Functions/Random/RandomBase.cs | 33 ++++++ .../Functions/Random/RandomNormal.cs | 32 +++++ .../Functions/Random/RandomNormalSpread.cs | 43 +++++++ .../Functions/Random/RandomUniform.cs | 32 +++++ .../Functions/Random/RandomUniformSpread.cs | 43 +++++++ .../Functions/Rounding/Ceiling.cs | 33 ++++++ .../Functions/Rounding/Clamp.cs | 39 +++++++ .../Functions/Rounding/Floor.cs | 33 ++++++ .../Functions/Rounding/Fractional.cs | 33 ++++++ .../Functions/Rounding/Round.cs | 37 ++++++ .../Functions/Rounding/Truncate.cs | 33 ++++++ .../Functions/Trigonometry/Acos.cs | 33 ++++++ .../Functions/Trigonometry/Asin.cs | 33 ++++++ .../Functions/Trigonometry/Atan.cs | 33 ++++++ .../Functions/Trigonometry/Atan2.cs | 36 ++++++ .../Functions/Trigonometry/Cos.cs | 33 ++++++ .../Trigonometry/Hyperbolic/Acosh.cs | 33 ++++++ .../Trigonometry/Hyperbolic/Asinh.cs | 33 ++++++ .../Trigonometry/Hyperbolic/Atanh.cs | 33 ++++++ .../Functions/Trigonometry/Hyperbolic/Cosh.cs | 33 ++++++ .../Functions/Trigonometry/Hyperbolic/Sinh.cs | 33 ++++++ .../Functions/Trigonometry/Hyperbolic/Tanh.cs | 33 ++++++ .../Functions/Trigonometry/Sin.cs | 33 ++++++ .../Functions/Trigonometry/Tan.cs | 33 ++++++ src/StandardLibrary/Initializer.cs | 76 ++++++++++++ src/StandardLibrary/functions/Sign.cs | 4 +- 39 files changed, 1465 insertions(+), 51 deletions(-) delete mode 100644 src/StandardLibrary/Constants.cs delete mode 100644 src/StandardLibrary/Functions.cs create mode 100644 src/StandardLibrary/Functions/Angle/Degrees.cs create mode 100644 src/StandardLibrary/Functions/Angle/Radians.cs create mode 100644 src/StandardLibrary/Functions/Angle/WrapAngle.cs create mode 100644 src/StandardLibrary/Functions/NumberTheory/BinomialCoefficient.cs create mode 100644 src/StandardLibrary/Functions/NumberTheory/Factorial.cs create mode 100644 src/StandardLibrary/Functions/NumberTheory/GreatedCommonDenomitator.cs create mode 100644 src/StandardLibrary/Functions/NumberTheory/LeastCommonMultiple.cs create mode 100644 src/StandardLibrary/Functions/NumberTheory/Permutations.cs create mode 100644 src/StandardLibrary/Functions/Random/Bernoulli.cs create mode 100644 src/StandardLibrary/Functions/Random/FairFlip.cs create mode 100644 src/StandardLibrary/Functions/Random/RandomBase.cs create mode 100644 src/StandardLibrary/Functions/Random/RandomNormal.cs create mode 100644 src/StandardLibrary/Functions/Random/RandomNormalSpread.cs create mode 100644 src/StandardLibrary/Functions/Random/RandomUniform.cs create mode 100644 src/StandardLibrary/Functions/Random/RandomUniformSpread.cs create mode 100644 src/StandardLibrary/Functions/Rounding/Ceiling.cs create mode 100644 src/StandardLibrary/Functions/Rounding/Clamp.cs create mode 100644 src/StandardLibrary/Functions/Rounding/Floor.cs create mode 100644 src/StandardLibrary/Functions/Rounding/Fractional.cs create mode 100644 src/StandardLibrary/Functions/Rounding/Round.cs create mode 100644 src/StandardLibrary/Functions/Rounding/Truncate.cs create mode 100644 src/StandardLibrary/Functions/Trigonometry/Acos.cs create mode 100644 src/StandardLibrary/Functions/Trigonometry/Asin.cs create mode 100644 src/StandardLibrary/Functions/Trigonometry/Atan.cs create mode 100644 src/StandardLibrary/Functions/Trigonometry/Atan2.cs create mode 100644 src/StandardLibrary/Functions/Trigonometry/Cos.cs create mode 100644 src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Acosh.cs create mode 100644 src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Asinh.cs create mode 100644 src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Atanh.cs create mode 100644 src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Cosh.cs create mode 100644 src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Sinh.cs create mode 100644 src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Tanh.cs create mode 100644 src/StandardLibrary/Functions/Trigonometry/Sin.cs create mode 100644 src/StandardLibrary/Functions/Trigonometry/Tan.cs create mode 100644 src/StandardLibrary/Initializer.cs diff --git a/src/Core/FunctionValue.cs b/src/Core/FunctionValue.cs index 9d74307..e40a5dc 100644 --- a/src/Core/FunctionValue.cs +++ b/src/Core/FunctionValue.cs @@ -17,6 +17,7 @@ namespace CSMic public static readonly FunctionValue NONE = new FunctionValue(FunctionValueType.None, null); public static readonly FunctionValue NUMBER = new FunctionValue(FunctionValueType.Numeric, 0m); public static readonly FunctionValue STRING = new FunctionValue(FunctionValueType.String, string.Empty); + public static readonly FunctionValue ZERO = new FunctionValue(FunctionValueType.Numeric, 0m); public FunctionValue() { diff --git a/src/StandardLibrary/Constants.cs b/src/StandardLibrary/Constants.cs deleted file mode 100644 index dacfc9f..0000000 --- a/src/StandardLibrary/Constants.cs +++ /dev/null @@ -1,23 +0,0 @@ -using CSMic; - -namespace CSMic.StandardLibrary -{ - public static class Constants - { - public static void Initialize(InputInterpreter inputInterpreter) - { - if(inputInterpreter == null) - { - throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); - } - - inputInterpreter.Interpret("pi :: 3.1415926535897931"); - inputInterpreter.Interpret("e :: 2.7182818284590451"); - inputInterpreter.Interpret("tau :: 6.2831853071795862"); - inputInterpreter.Interpret("phi :: 1.6180339887498948"); - inputInterpreter.Interpret("goldenratio :: 1.6180339887498948"); - inputInterpreter.Interpret("eurler :: 0.5772156649015329"); - inputInterpreter.Interpret("omega :: 0.5671432904097839"); - } - } -} diff --git a/src/StandardLibrary/Functions.cs b/src/StandardLibrary/Functions.cs deleted file mode 100644 index 10c88fe..0000000 --- a/src/StandardLibrary/Functions.cs +++ /dev/null @@ -1,26 +0,0 @@ -using CSMic; -using CSMic.StandardLibrary.Functions; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace CSMic.StandardLibrary -{ - public static class Functions - { - public static void Initialize(InputInterpreter inputInterpreter) - { - if (inputInterpreter == null) - { - throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); - } - - inputInterpreter.RegisterFunction(new AbsoluteValue()); - inputInterpreter.RegisterFunction(new Sign()); - inputInterpreter.RegisterFunction(new Min()); - inputInterpreter.RegisterFunction(new Max()); - } - } -} diff --git a/src/StandardLibrary/Functions/Angle/Degrees.cs b/src/StandardLibrary/Functions/Angle/Degrees.cs new file mode 100644 index 0000000..ac2e53f --- /dev/null +++ b/src/StandardLibrary/Functions/Angle/Degrees.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Angle +{ + public class Degrees : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "degrees"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, double.DegreesToRadians((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Angle/Radians.cs b/src/StandardLibrary/Functions/Angle/Radians.cs new file mode 100644 index 0000000..07c69f6 --- /dev/null +++ b/src/StandardLibrary/Functions/Angle/Radians.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Angle +{ + public class Radians : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "radians"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, double.RadiansToDegrees((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Angle/WrapAngle.cs b/src/StandardLibrary/Functions/Angle/WrapAngle.cs new file mode 100644 index 0000000..987166e --- /dev/null +++ b/src/StandardLibrary/Functions/Angle/WrapAngle.cs @@ -0,0 +1,43 @@ +namespace CSMic.StandardLibrary.Functions.Angle +{ + public class WrapAngle : FunctionBase, ICodedFunction + { + public string Name + { + get + { + return "wrapangle"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + yield return new FunctionArgument("periodStart", FunctionValue.NUMBER); + yield return new FunctionArgument("periodEnd", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var inputValue = _args[0].Value; + decimal value = Convert.ToDecimal(inputValue.Value); + var inputPeriodStart = _args[1].Value; + decimal periodStart = Convert.ToDecimal(inputPeriodStart.Value); + var inputPeriodEnd = _args[2].Value; + decimal periodEnd = Convert.ToDecimal(inputPeriodEnd.Value); + + // Perform modulo. + decimal width = periodEnd - periodStart; + decimal modulus = value % width; + modulus = modulus < 0 ? modulus + width : modulus; + + return new FunctionValue(FunctionValueType.Numeric, modulus); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/NumberTheory/BinomialCoefficient.cs b/src/StandardLibrary/Functions/NumberTheory/BinomialCoefficient.cs new file mode 100644 index 0000000..d4f1f57 --- /dev/null +++ b/src/StandardLibrary/Functions/NumberTheory/BinomialCoefficient.cs @@ -0,0 +1,68 @@ +using CSMic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CSMic.StandardLibrary.Functions.NumberTheory +{ + public class BinomialCoefficient : FunctionBase, ICodedFunction + { + public string Name + { + get + { + return "ncr"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("first", FunctionValue.NUMBER); + yield return new FunctionArgument("second", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + var inputFirst = _args[0].Value; + var inputSecond = _args[1].Value; + decimal first = Convert.ToDecimal(inputFirst.Value); + decimal second = Convert.ToDecimal(inputSecond.Value); + + if (first < 0 || first > 20 || second < 0 || second > 20 || first - second < 0) + { + return FunctionValue.ZERO; + } + + if(Math.Floor(first) != first || Math.Floor(second) != second) + { + return FunctionValue.ZERO; + } + + int n = Convert.ToInt32(first); + int r = Convert.ToInt32(second); + decimal nFac = Factorial.INTEGER_FACTORIAL_LOOKUP[n]; + decimal rFac = Factorial.INTEGER_FACTORIAL_LOOKUP[r]; + decimal nmrFac = Factorial.INTEGER_FACTORIAL_LOOKUP[n - r]; + + try + { + decimal combinations = (nFac) / (rFac * nmrFac); + + return new FunctionValue(FunctionValueType.Numeric, combinations); + } + catch + { + // Last chance emergency fail if the decimal value is exceeded. + return FunctionValue.ZERO; + } + }); + } + } +} diff --git a/src/StandardLibrary/Functions/NumberTheory/Factorial.cs b/src/StandardLibrary/Functions/NumberTheory/Factorial.cs new file mode 100644 index 0000000..fb9c2cf --- /dev/null +++ b/src/StandardLibrary/Functions/NumberTheory/Factorial.cs @@ -0,0 +1,110 @@ +using CSMic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CSMic.StandardLibrary.Functions.NumberTheory +{ + public class Factorial : FunctionBase, ICodedFunction + { + private static readonly double[] LANCZOS_APPROXIMATION = + { + 0.99999999999980993, + 676.5203681218851, + -1259.1392167224028, + 771.32342877765313, + -176.61502916214059, + 12.507343278686905, + -0.13857109526572012, + 9.9843695780195716e-6, + 1.5056327351493116e-7 + }; + + public static readonly decimal[] INTEGER_FACTORIAL_LOOKUP = + { + /* 0 */ 1, + /* 1 */ 1, + /* 2 */ 2, + /* 3 */ 6, + /* 4 */ 24, + /* 5 */ 120, + /* 6 */ 720, + /* 7 */ 5040, + /* 8 */ 40320, + /* 9 */ 362880, + /* 10 */ 3628800, + /* 11 */ 39916800, + /* 12 */ 479001600, + /* 13 */ 62207020800, + /* 14 */ 87178291200, + /* 15 */ 1307674368000, + /* 16 */ 20922789888000, + /* 17 */ 355687428096000, + /* 18 */ 6402373705728000, + /* 19 */ 121645100408832000, + /* 20 */ 2432902008176640000 + }; + + public string Name + { + get + { + return "fac"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + var inputValue = _args[0].Value; + decimal value = Convert.ToDecimal(inputValue.Value); + + if (value < 0) + { + return FunctionValue.ZERO; + } + if (value > 20) + { + return FunctionValue.ZERO; + } + + if (Math.Floor(value) == value) + { + // Input is an integer. We'll just use the lookup table. + var index = Convert.ToInt32(value); + return new FunctionValue(FunctionValueType.Numeric, INTEGER_FACTORIAL_LOOKUP[index]); + } + + double gammaFactorial = Gamma(Convert.ToDouble(value) + 1); + + return new FunctionValue(FunctionValueType.Numeric, Convert.ToDecimal(gammaFactorial)); + }); + } + + private static double Gamma(double shiftedGama) + { + if (shiftedGama < 0.5) + return Math.PI / (Math.Sin(Math.PI * shiftedGama) * Gamma(1 - shiftedGama)); + + shiftedGama -= 1; + double accumulator = LANCZOS_APPROXIMATION[0]; + for (int i = 1; i < LANCZOS_APPROXIMATION.Length; i++) + accumulator += LANCZOS_APPROXIMATION[i] / (shiftedGama + i); + + double shiftedVariable = shiftedGama + 7.5; + return Math.Sqrt(2 * Math.PI) * Math.Pow(shiftedVariable, shiftedGama + 0.5) * Math.Exp(-shiftedVariable) * accumulator; + } + + } +} diff --git a/src/StandardLibrary/Functions/NumberTheory/GreatedCommonDenomitator.cs b/src/StandardLibrary/Functions/NumberTheory/GreatedCommonDenomitator.cs new file mode 100644 index 0000000..0d1cfe3 --- /dev/null +++ b/src/StandardLibrary/Functions/NumberTheory/GreatedCommonDenomitator.cs @@ -0,0 +1,65 @@ +using CSMic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CSMic.StandardLibrary.Functions.NumberTheory +{ + public class GreatestCommonDevisor : FunctionBase, ICodedFunction + { + public string Name + { + get + { + return "gcd"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("first", FunctionValue.NUMBER); + yield return new FunctionArgument("second", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + var inputFirst = _args[0].Value; + var inputSecond = _args[1].Value; + decimal first = Convert.ToDecimal(inputFirst.Value); + decimal second = Convert.ToDecimal(inputSecond.Value); + + if (first <= 0 || second <= 0) + { + return FunctionValue.ZERO; + } + + if (Math.Floor(first) != first || Math.Floor(second) != second) + { + return FunctionValue.ZERO; + } + + decimal gcd = EuclideanAlgorithm(first, second); + decimal lcd = (first * second) / gcd; + + return new FunctionValue(FunctionValueType.Numeric, lcd); + }); + } + + public decimal EuclideanAlgorithm(decimal first, decimal second) + { + if(second == 0) + { + return first; + } + + return EuclideanAlgorithm(second, first % second); + } + } +} diff --git a/src/StandardLibrary/Functions/NumberTheory/LeastCommonMultiple.cs b/src/StandardLibrary/Functions/NumberTheory/LeastCommonMultiple.cs new file mode 100644 index 0000000..54ae01f --- /dev/null +++ b/src/StandardLibrary/Functions/NumberTheory/LeastCommonMultiple.cs @@ -0,0 +1,62 @@ +using CSMic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CSMic.StandardLibrary.Functions.NumberTheory +{ + public class LeastCommonMultiple : FunctionBase, ICodedFunction + { + public string Name + { + get + { + return "gcd"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("first", FunctionValue.NUMBER); + yield return new FunctionArgument("second", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + var inputFirst = _args[0].Value; + var inputSecond = _args[1].Value; + decimal first = Convert.ToDecimal(inputFirst.Value); + decimal second = Convert.ToDecimal(inputSecond.Value); + + if (first <= 0 || second <= 0) + { + return FunctionValue.ZERO; + } + + if (Math.Floor(first) != first || Math.Floor(second) != second) + { + return FunctionValue.ZERO; + } + + return new FunctionValue(FunctionValueType.Numeric, EuclideanAlgorithm(first, second)); + }); + } + + public decimal EuclideanAlgorithm(decimal first, decimal second) + { + if(second == 0) + { + return first; + } + + return EuclideanAlgorithm(second, first % second); + } + } +} diff --git a/src/StandardLibrary/Functions/NumberTheory/Permutations.cs b/src/StandardLibrary/Functions/NumberTheory/Permutations.cs new file mode 100644 index 0000000..20a4144 --- /dev/null +++ b/src/StandardLibrary/Functions/NumberTheory/Permutations.cs @@ -0,0 +1,67 @@ +using CSMic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CSMic.StandardLibrary.Functions.NumberTheory +{ + public class Permutations : FunctionBase, ICodedFunction + { + public string Name + { + get + { + return "npr"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("first", FunctionValue.NUMBER); + yield return new FunctionArgument("second", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + var inputFirst = _args[0].Value; + var inputSecond = _args[1].Value; + decimal first = Convert.ToDecimal(inputFirst.Value); + decimal second = Convert.ToDecimal(inputSecond.Value); + + if (first < 0 || first > 20 || second < 0 || second > 20 || first - second < 0) + { + return FunctionValue.ZERO; + } + + if(Math.Floor(first) != first || Math.Floor(second) != second) + { + return FunctionValue.ZERO; + } + + int n = Convert.ToInt32(first); + int r = Convert.ToInt32(second); + decimal nFac = Factorial.INTEGER_FACTORIAL_LOOKUP[n]; + decimal nmrFac = Factorial.INTEGER_FACTORIAL_LOOKUP[n - r]; + + try + { + decimal combinations = (nFac) / (nmrFac); + + return new FunctionValue(FunctionValueType.Numeric, combinations); + } + catch + { + // Last chance emergency fail if the decimal value is exceeded. + return FunctionValue.ZERO; + } + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Random/Bernoulli.cs b/src/StandardLibrary/Functions/Random/Bernoulli.cs new file mode 100644 index 0000000..dd7261e --- /dev/null +++ b/src/StandardLibrary/Functions/Random/Bernoulli.cs @@ -0,0 +1,45 @@ +using CSMic; +using CSMic.StandardLibrary.Functions.Random; + +namespace CSMic.StandardLibrary.Functions.Random +{ + public class Bernoulli : RandomBase, ICodedFunction + { + public string Name + { + get + { + return "bern"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("p", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + var input = _args[0].Value; + decimal pValue = Convert.ToDecimal(input.Value); + + if(pValue < 0m || pValue > 1m) + { + throw new ArgumentOutOfRangeException(nameof(pValue), "The p value must be between 0 and 1."); + } + + if(NextDecimal() < pValue) + { + return FunctionValue.TRUE; + } + + return FunctionValue.FALSE; + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Random/FairFlip.cs b/src/StandardLibrary/Functions/Random/FairFlip.cs new file mode 100644 index 0000000..32e6382 --- /dev/null +++ b/src/StandardLibrary/Functions/Random/FairFlip.cs @@ -0,0 +1,37 @@ +using CSMic; +using CSMic.StandardLibrary.Functions.Random; + +namespace CSMic.StandardLibrary.Functions.Random +{ + public class FairFlip : RandomBase, ICodedFunction + { + public string Name + { + get + { + return "flip"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield break; + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + if(NextDecimal() < 0.5m) + { + return FunctionValue.TRUE; + } + + return FunctionValue.FALSE; + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Random/RandomBase.cs b/src/StandardLibrary/Functions/Random/RandomBase.cs new file mode 100644 index 0000000..8578e43 --- /dev/null +++ b/src/StandardLibrary/Functions/Random/RandomBase.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CSMic.StandardLibrary.Functions.Random +{ + public abstract class RandomBase : FunctionBase + { + protected static System.Random RandomNumberGenerator + { + get + { + return System.Random.Shared; + } + } + + protected static decimal NextDecimal() + { + return Convert.ToDecimal(RandomNumberGenerator.NextDouble()); + } + + protected static decimal NextDecimalNormal() + { + double u1 = 1.0 - RandomNumberGenerator.NextDouble(); + double u2 = 1.0 - RandomNumberGenerator.NextDouble(); + double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) * + Math.Sin(2.0 * Math.PI * u2); + return Convert.ToDecimal(randStdNormal); + } + } +} diff --git a/src/StandardLibrary/Functions/Random/RandomNormal.cs b/src/StandardLibrary/Functions/Random/RandomNormal.cs new file mode 100644 index 0000000..fa8f6a1 --- /dev/null +++ b/src/StandardLibrary/Functions/Random/RandomNormal.cs @@ -0,0 +1,32 @@ +using CSMic; +using CSMic.StandardLibrary.Functions.Random; + +namespace CSMic.StandardLibrary.Functions.Random +{ + public class RandomNormal : RandomBase, ICodedFunction + { + public string Name + { + get + { + return "randn"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield break; + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + return new FunctionValue(FunctionValueType.Numeric, NextDecimalNormal()); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Random/RandomNormalSpread.cs b/src/StandardLibrary/Functions/Random/RandomNormalSpread.cs new file mode 100644 index 0000000..85897ae --- /dev/null +++ b/src/StandardLibrary/Functions/Random/RandomNormalSpread.cs @@ -0,0 +1,43 @@ +using CSMic; +using CSMic.StandardLibrary.Functions.Random; + +namespace CSMic.StandardLibrary.Functions.Random +{ + public class RandomNormalSpread : RandomBase, ICodedFunction + { + public string Name + { + get + { + return "randns"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("lower", FunctionValue.NUMBER); + yield return new FunctionArgument("upper", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + var inputLower = _args[0].Value; + var inputUpper = _args[1].Value; + decimal lower = Convert.ToDecimal(inputLower.Value); + decimal upper = Convert.ToDecimal(inputUpper.Value); + + if(upper <= lower) + { + return FunctionValue.ZERO; + } + + return new FunctionValue(FunctionValueType.Numeric, NextDecimalNormal() * (upper - lower)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Random/RandomUniform.cs b/src/StandardLibrary/Functions/Random/RandomUniform.cs new file mode 100644 index 0000000..cb388bb --- /dev/null +++ b/src/StandardLibrary/Functions/Random/RandomUniform.cs @@ -0,0 +1,32 @@ +using CSMic; +using CSMic.StandardLibrary.Functions.Random; + +namespace CSMic.StandardLibrary.Functions.Random +{ + public class RandomUniform : RandomBase, ICodedFunction + { + public string Name + { + get + { + return "rand"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield break; + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + return new FunctionValue(FunctionValueType.Numeric, NextDecimal()); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Random/RandomUniformSpread.cs b/src/StandardLibrary/Functions/Random/RandomUniformSpread.cs new file mode 100644 index 0000000..97e7293 --- /dev/null +++ b/src/StandardLibrary/Functions/Random/RandomUniformSpread.cs @@ -0,0 +1,43 @@ +using CSMic; +using CSMic.StandardLibrary.Functions.Random; + +namespace CSMic.StandardLibrary.Functions.Random +{ + public class RandomUniformSpread : RandomBase, ICodedFunction + { + public string Name + { + get + { + return "rands"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("lower", FunctionValue.NUMBER); + yield return new FunctionArgument("upper", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return base.Execute(args, (_args) => + { + var inputLower = _args[0].Value; + var inputUpper = _args[1].Value; + decimal lower = Convert.ToDecimal(inputLower.Value); + decimal upper = Convert.ToDecimal(inputUpper.Value); + + if(upper <= lower) + { + return FunctionValue.ZERO; + } + + return new FunctionValue(FunctionValueType.Numeric, NextDecimal() * (upper - lower)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Rounding/Ceiling.cs b/src/StandardLibrary/Functions/Rounding/Ceiling.cs new file mode 100644 index 0000000..9881679 --- /dev/null +++ b/src/StandardLibrary/Functions/Rounding/Ceiling.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Rounding +{ + public class Ceiling : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "ceiling"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Ceiling(value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Rounding/Clamp.cs b/src/StandardLibrary/Functions/Rounding/Clamp.cs new file mode 100644 index 0000000..71ba157 --- /dev/null +++ b/src/StandardLibrary/Functions/Rounding/Clamp.cs @@ -0,0 +1,39 @@ +namespace CSMic.StandardLibrary.Functions.Rounding +{ + public class Clamp : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "clamp"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + yield return new FunctionArgument("low", FunctionValue.NUMBER); + yield return new FunctionArgument("high", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var inputValue = _args[0].Value; + decimal value = Convert.ToDecimal(inputValue.Value); + var inputLow = _args[1].Value; + decimal low = Convert.ToDecimal(inputLow.Value); + var inputHigh = _args[2].Value; + decimal high = Convert.ToDecimal(inputHigh.Value); + + return new FunctionValue(FunctionValueType.Numeric, value < low ? low : value > high ? high : value); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Rounding/Floor.cs b/src/StandardLibrary/Functions/Rounding/Floor.cs new file mode 100644 index 0000000..bc4a028 --- /dev/null +++ b/src/StandardLibrary/Functions/Rounding/Floor.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Rounding +{ + public class Floor : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "floor"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Floor(value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Rounding/Fractional.cs b/src/StandardLibrary/Functions/Rounding/Fractional.cs new file mode 100644 index 0000000..c1442ab --- /dev/null +++ b/src/StandardLibrary/Functions/Rounding/Fractional.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Rounding +{ + public class Fractional : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "frac"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, value - Math.Truncate(value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Rounding/Round.cs b/src/StandardLibrary/Functions/Rounding/Round.cs new file mode 100644 index 0000000..18305a9 --- /dev/null +++ b/src/StandardLibrary/Functions/Rounding/Round.cs @@ -0,0 +1,37 @@ +namespace CSMic.StandardLibrary.Functions.Rounding +{ + public class Round : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "round"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var inputValue = _args[0].Value; + decimal value = Convert.ToDecimal(inputValue.Value); + var inputPrecision = _args[1].Value; + decimal precision = Convert.ToDecimal(inputValue.Value); + precision = Math.Round(precision); + int precisionInt = Convert.ToInt32(precision); + + return new FunctionValue(FunctionValueType.Numeric, Math.Round(value, precisionInt)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Rounding/Truncate.cs b/src/StandardLibrary/Functions/Rounding/Truncate.cs new file mode 100644 index 0000000..ac1c483 --- /dev/null +++ b/src/StandardLibrary/Functions/Rounding/Truncate.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Rounding +{ + public class Trancate : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "truncate"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Truncate(value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Trigonometry/Acos.cs b/src/StandardLibrary/Functions/Trigonometry/Acos.cs new file mode 100644 index 0000000..37e2e6f --- /dev/null +++ b/src/StandardLibrary/Functions/Trigonometry/Acos.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Trigonometry +{ + public class Acos : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "acos"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Acos((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Trigonometry/Asin.cs b/src/StandardLibrary/Functions/Trigonometry/Asin.cs new file mode 100644 index 0000000..c5de34b --- /dev/null +++ b/src/StandardLibrary/Functions/Trigonometry/Asin.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Trigonometry +{ + public class Asin : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "asin"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Asin((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Trigonometry/Atan.cs b/src/StandardLibrary/Functions/Trigonometry/Atan.cs new file mode 100644 index 0000000..2c61574 --- /dev/null +++ b/src/StandardLibrary/Functions/Trigonometry/Atan.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Trigonometry +{ + public class Atan : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "atan"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Atan((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Trigonometry/Atan2.cs b/src/StandardLibrary/Functions/Trigonometry/Atan2.cs new file mode 100644 index 0000000..0e1e389 --- /dev/null +++ b/src/StandardLibrary/Functions/Trigonometry/Atan2.cs @@ -0,0 +1,36 @@ +namespace CSMic.StandardLibrary.Functions.Trigonometry +{ + public class Atan2 : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "atan2"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var inputFirst = _args[0].Value; + decimal valueFirst = Convert.ToDecimal(inputFirst.Value); + var inputSecond = _args[1].Value; + decimal valueSecond = Convert.ToDecimal(inputSecond.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Atan2((double)valueFirst, (double)valueSecond)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Trigonometry/Cos.cs b/src/StandardLibrary/Functions/Trigonometry/Cos.cs new file mode 100644 index 0000000..efec96a --- /dev/null +++ b/src/StandardLibrary/Functions/Trigonometry/Cos.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Trigonometry +{ + public class Cos : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "cos"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Cos((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Acosh.cs b/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Acosh.cs new file mode 100644 index 0000000..96712db --- /dev/null +++ b/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Acosh.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Trigonometry.Hyperbolic +{ + public class Acosh : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "acosh"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Acosh((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Asinh.cs b/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Asinh.cs new file mode 100644 index 0000000..e84c2d7 --- /dev/null +++ b/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Asinh.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Trigonometry.Hyperbolic +{ + public class Asinh : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "asinh"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Asinh((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Atanh.cs b/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Atanh.cs new file mode 100644 index 0000000..a768e51 --- /dev/null +++ b/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Atanh.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Trigonometry.Hyperbolic +{ + public class Atanh : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "atanh"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Atanh((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Cosh.cs b/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Cosh.cs new file mode 100644 index 0000000..8ed7376 --- /dev/null +++ b/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Cosh.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Trigonometry.Hyperbolic +{ + public class Cosh : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "cosh"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Cosh((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Sinh.cs b/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Sinh.cs new file mode 100644 index 0000000..cd30688 --- /dev/null +++ b/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Sinh.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Trigonometry.Hyperbolic +{ + public class Sinh : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "sinh"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Sinh((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Tanh.cs b/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Tanh.cs new file mode 100644 index 0000000..3ea2ae8 --- /dev/null +++ b/src/StandardLibrary/Functions/Trigonometry/Hyperbolic/Tanh.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Trigonometry.Hyperbolic +{ + public class Tanh : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "tanh"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Tanh((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Trigonometry/Sin.cs b/src/StandardLibrary/Functions/Trigonometry/Sin.cs new file mode 100644 index 0000000..df0a48f --- /dev/null +++ b/src/StandardLibrary/Functions/Trigonometry/Sin.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Trigonometry +{ + public class Sin : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "sin"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Sin((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Functions/Trigonometry/Tan.cs b/src/StandardLibrary/Functions/Trigonometry/Tan.cs new file mode 100644 index 0000000..68e0fe5 --- /dev/null +++ b/src/StandardLibrary/Functions/Trigonometry/Tan.cs @@ -0,0 +1,33 @@ +namespace CSMic.StandardLibrary.Functions.Trigonometry +{ + public class Tan : FunctionBase, ICodedFunction + { + + public string Name + { + get + { + return "tan"; + } + } + + public override IEnumerable ExpectedArguments + { + get + { + yield return new FunctionArgument("value", FunctionValue.NUMBER); + } + } + + public FunctionValue Execute(params FunctionArgument[] args) + { + return Execute(args, (_args) => + { + var input = _args[0].Value; + decimal value = Convert.ToDecimal(input.Value); + + return new FunctionValue(FunctionValueType.Numeric, Math.Tan((double)value)); + }); + } + } +} diff --git a/src/StandardLibrary/Initializer.cs b/src/StandardLibrary/Initializer.cs new file mode 100644 index 0000000..e3eb5de --- /dev/null +++ b/src/StandardLibrary/Initializer.cs @@ -0,0 +1,76 @@ +using CSMic.StandardLibrary.Functions; +using CSMic.StandardLibrary.Functions.Angle; + +namespace CSMic.StandardLibrary +{ + public static class Initializer + { + public static void InitializeAll(InputInterpreter interpreter) + { + InitializeAllFunctions(interpreter); + InitializeConstants(interpreter); + } + + public static void InitializeAllFunctions(InputInterpreter inputInterpreter) + { + if (inputInterpreter == null) + { + throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); + } + + InitializeBaseFunctions(inputInterpreter); + } + + public static void InitializeBaseFunctions(InputInterpreter inputInterpreter) + { + if (inputInterpreter == null) + { + throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); + } + + inputInterpreter.RegisterFunction(new AbsoluteValue()); + inputInterpreter.RegisterFunction(new Sign()); + inputInterpreter.RegisterFunction(new Min()); + inputInterpreter.RegisterFunction(new Max()); + } + + public static void InitializeAngleFunctions(InputInterpreter inputInterpreter) + { + if (inputInterpreter == null) + { + throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); + } + + inputInterpreter.RegisterFunction(new Degrees()); + inputInterpreter.RegisterFunction(new Radians()); + inputInterpreter.RegisterFunction(new WrapAngle()); + } + + public static void InitializeNumberTheoryFunctions(InputInterpreter inputInterpreter) + { + if (inputInterpreter == null) + { + throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); + } + + // Register functions... + } + + public static void InitializeConstants(InputInterpreter inputInterpreter) + { + if (inputInterpreter == null) + { + throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); + } + + inputInterpreter.Interpret("pi :: 3.1415926535897931"); + inputInterpreter.Interpret("e :: 2.7182818284590451"); + inputInterpreter.Interpret("tau :: 6.2831853071795862"); + inputInterpreter.Interpret("phi :: 1.6180339887498948"); + inputInterpreter.Interpret("goldenratio :: 1.6180339887498948"); + inputInterpreter.Interpret("eurler :: 0.5772156649015329"); + inputInterpreter.Interpret("omega :: 0.5671432904097839"); + } + } +} + diff --git a/src/StandardLibrary/functions/Sign.cs b/src/StandardLibrary/functions/Sign.cs index 8d9c48a..f75dace 100644 --- a/src/StandardLibrary/functions/Sign.cs +++ b/src/StandardLibrary/functions/Sign.cs @@ -5,8 +5,8 @@ namespace CSMic.StandardLibrary.Functions { public class Sign : FunctionBase, ICodedFunction { - public const decimal POSITIVE = 1; - public const decimal NEGATIVE = -1; + private const decimal POSITIVE = 1; + private const decimal NEGATIVE = -1; public string Name { From 47e6ea91d715e7db07f43551e40f3d2b05caac70 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Thu, 21 Aug 2025 03:48:48 -0500 Subject: [PATCH 50/54] StandardLibrary: implement and wire Initialize[Type]Functions in Initializer (Angle, Rounding, Trigonometry incl. Hyperbolic, NumberTheory, Random) and call them from InitializeAllFunctions --- src/StandardLibrary/Initializer.cs | 71 +++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/src/StandardLibrary/Initializer.cs b/src/StandardLibrary/Initializer.cs index e3eb5de..4377e30 100644 --- a/src/StandardLibrary/Initializer.cs +++ b/src/StandardLibrary/Initializer.cs @@ -1,5 +1,10 @@ using CSMic.StandardLibrary.Functions; using CSMic.StandardLibrary.Functions.Angle; +using CSMic.StandardLibrary.Functions.Rounding; +using CSMic.StandardLibrary.Functions.Trigonometry; +using CSMic.StandardLibrary.Functions.Trigonometry.Hyperbolic; +using CSMic.StandardLibrary.Functions.NumberTheory; +using CSMic.StandardLibrary.Functions.Random; namespace CSMic.StandardLibrary { @@ -19,6 +24,11 @@ namespace CSMic.StandardLibrary } InitializeBaseFunctions(inputInterpreter); + InitializeAngleFunctions(inputInterpreter); + InitializeRoundingFunctions(inputInterpreter); + InitializeTrigonometryFunctions(inputInterpreter); + InitializeNumberTheoryFunctions(inputInterpreter); + InitializeRandomFunctions(inputInterpreter); } public static void InitializeBaseFunctions(InputInterpreter inputInterpreter) @@ -53,7 +63,65 @@ namespace CSMic.StandardLibrary throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); } - // Register functions... + inputInterpreter.RegisterFunction(new Factorial()); + inputInterpreter.RegisterFunction(new BinomialCoefficient()); + inputInterpreter.RegisterFunction(new Permutations()); + inputInterpreter.RegisterFunction(new GreatestCommonDevisor()); + inputInterpreter.RegisterFunction(new LeastCommonMultiple()); + } + + public static void InitializeRoundingFunctions(InputInterpreter inputInterpreter) + { + if (inputInterpreter == null) + { + throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); + } + + inputInterpreter.RegisterFunction(new Floor()); + inputInterpreter.RegisterFunction(new Ceiling()); + inputInterpreter.RegisterFunction(new Fractional()); + inputInterpreter.RegisterFunction(new Trancate()); + inputInterpreter.RegisterFunction(new Round()); + inputInterpreter.RegisterFunction(new Clamp()); + } + + public static void InitializeTrigonometryFunctions(InputInterpreter inputInterpreter) + { + if (inputInterpreter == null) + { + throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); + } + + // Basic trig + inputInterpreter.RegisterFunction(new Sin()); + inputInterpreter.RegisterFunction(new Cos()); + inputInterpreter.RegisterFunction(new Tan()); + inputInterpreter.RegisterFunction(new Asin()); + inputInterpreter.RegisterFunction(new Acos()); + inputInterpreter.RegisterFunction(new Atan()); + inputInterpreter.RegisterFunction(new Atan2()); + + // Hyperbolic trig + inputInterpreter.RegisterFunction(new Sinh()); + inputInterpreter.RegisterFunction(new Cosh()); + inputInterpreter.RegisterFunction(new Tanh()); + inputInterpreter.RegisterFunction(new Asinh()); + inputInterpreter.RegisterFunction(new Acosh()); + inputInterpreter.RegisterFunction(new Atanh()); + } + + public static void InitializeRandomFunctions(InputInterpreter inputInterpreter) + { + if (inputInterpreter == null) + { + throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); + } + + inputInterpreter.RegisterFunction(new FairFlip()); + inputInterpreter.RegisterFunction(new RandomUniform()); + inputInterpreter.RegisterFunction(new RandomUniformSpread()); + inputInterpreter.RegisterFunction(new RandomNormal()); + inputInterpreter.RegisterFunction(new RandomNormalSpread()); } public static void InitializeConstants(InputInterpreter inputInterpreter) @@ -73,4 +141,3 @@ namespace CSMic.StandardLibrary } } } - From 736f05a0232a31b0cb32e3105daf0e37d30777c4 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Thu, 21 Aug 2025 03:52:26 -0500 Subject: [PATCH 51/54] Fix stdlib typos and logic bugs: Round precision arg; rename Trancate->Truncate; correct degrees/radians conversion; wrapangle shift into range; Random rands add lower; correct gcd/lcm names/logic; fix 13! constant; clarify atan2 args; update initializer registrations --- src/StandardLibrary/Functions/Angle/Degrees.cs | 3 ++- src/StandardLibrary/Functions/Angle/Radians.cs | 3 ++- src/StandardLibrary/Functions/Angle/WrapAngle.cs | 4 ++-- src/StandardLibrary/Functions/NumberTheory/Factorial.cs | 2 +- .../Functions/NumberTheory/GreatedCommonDenomitator.cs | 5 ++--- .../Functions/NumberTheory/LeastCommonMultiple.cs | 7 +++++-- .../Functions/Random/RandomUniformSpread.cs | 2 +- src/StandardLibrary/Functions/Rounding/Round.cs | 3 ++- src/StandardLibrary/Functions/Rounding/Truncate.cs | 2 +- src/StandardLibrary/Functions/Trigonometry/Atan2.cs | 4 ++-- src/StandardLibrary/Initializer.cs | 4 ++-- 11 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/StandardLibrary/Functions/Angle/Degrees.cs b/src/StandardLibrary/Functions/Angle/Degrees.cs index ac2e53f..222153b 100644 --- a/src/StandardLibrary/Functions/Angle/Degrees.cs +++ b/src/StandardLibrary/Functions/Angle/Degrees.cs @@ -26,7 +26,8 @@ var input = _args[0].Value; decimal value = Convert.ToDecimal(input.Value); - return new FunctionValue(FunctionValueType.Numeric, double.DegreesToRadians((double)value)); + // Convert radians to degrees + return new FunctionValue(FunctionValueType.Numeric, double.RadiansToDegrees((double)value)); }); } } diff --git a/src/StandardLibrary/Functions/Angle/Radians.cs b/src/StandardLibrary/Functions/Angle/Radians.cs index 07c69f6..ebcc3d6 100644 --- a/src/StandardLibrary/Functions/Angle/Radians.cs +++ b/src/StandardLibrary/Functions/Angle/Radians.cs @@ -26,7 +26,8 @@ var input = _args[0].Value; decimal value = Convert.ToDecimal(input.Value); - return new FunctionValue(FunctionValueType.Numeric, double.RadiansToDegrees((double)value)); + // Convert degrees to radians + return new FunctionValue(FunctionValueType.Numeric, double.DegreesToRadians((double)value)); }); } } diff --git a/src/StandardLibrary/Functions/Angle/WrapAngle.cs b/src/StandardLibrary/Functions/Angle/WrapAngle.cs index 987166e..d1511bb 100644 --- a/src/StandardLibrary/Functions/Angle/WrapAngle.cs +++ b/src/StandardLibrary/Functions/Angle/WrapAngle.cs @@ -31,12 +31,12 @@ var inputPeriodEnd = _args[2].Value; decimal periodEnd = Convert.ToDecimal(inputPeriodEnd.Value); - // Perform modulo. + // Perform modulo and shift into [periodStart, periodEnd) decimal width = periodEnd - periodStart; decimal modulus = value % width; modulus = modulus < 0 ? modulus + width : modulus; - return new FunctionValue(FunctionValueType.Numeric, modulus); + return new FunctionValue(FunctionValueType.Numeric, periodStart + modulus); }); } } diff --git a/src/StandardLibrary/Functions/NumberTheory/Factorial.cs b/src/StandardLibrary/Functions/NumberTheory/Factorial.cs index fb9c2cf..a8771a3 100644 --- a/src/StandardLibrary/Functions/NumberTheory/Factorial.cs +++ b/src/StandardLibrary/Functions/NumberTheory/Factorial.cs @@ -37,7 +37,7 @@ namespace CSMic.StandardLibrary.Functions.NumberTheory /* 10 */ 3628800, /* 11 */ 39916800, /* 12 */ 479001600, - /* 13 */ 62207020800, + /* 13 */ 6227020800, /* 14 */ 87178291200, /* 15 */ 1307674368000, /* 16 */ 20922789888000, diff --git a/src/StandardLibrary/Functions/NumberTheory/GreatedCommonDenomitator.cs b/src/StandardLibrary/Functions/NumberTheory/GreatedCommonDenomitator.cs index 0d1cfe3..5940865 100644 --- a/src/StandardLibrary/Functions/NumberTheory/GreatedCommonDenomitator.cs +++ b/src/StandardLibrary/Functions/NumberTheory/GreatedCommonDenomitator.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace CSMic.StandardLibrary.Functions.NumberTheory { - public class GreatestCommonDevisor : FunctionBase, ICodedFunction + public class GreatestCommonDivisor : FunctionBase, ICodedFunction { public string Name { @@ -46,9 +46,8 @@ namespace CSMic.StandardLibrary.Functions.NumberTheory } decimal gcd = EuclideanAlgorithm(first, second); - decimal lcd = (first * second) / gcd; - return new FunctionValue(FunctionValueType.Numeric, lcd); + return new FunctionValue(FunctionValueType.Numeric, gcd); }); } diff --git a/src/StandardLibrary/Functions/NumberTheory/LeastCommonMultiple.cs b/src/StandardLibrary/Functions/NumberTheory/LeastCommonMultiple.cs index 54ae01f..7a93993 100644 --- a/src/StandardLibrary/Functions/NumberTheory/LeastCommonMultiple.cs +++ b/src/StandardLibrary/Functions/NumberTheory/LeastCommonMultiple.cs @@ -13,7 +13,7 @@ namespace CSMic.StandardLibrary.Functions.NumberTheory { get { - return "gcd"; + return "lcm"; } } @@ -45,7 +45,10 @@ namespace CSMic.StandardLibrary.Functions.NumberTheory return FunctionValue.ZERO; } - return new FunctionValue(FunctionValueType.Numeric, EuclideanAlgorithm(first, second)); + decimal gcd = EuclideanAlgorithm(first, second); + decimal lcm = (first * second) / gcd; + + return new FunctionValue(FunctionValueType.Numeric, lcm); }); } diff --git a/src/StandardLibrary/Functions/Random/RandomUniformSpread.cs b/src/StandardLibrary/Functions/Random/RandomUniformSpread.cs index 97e7293..97bddd0 100644 --- a/src/StandardLibrary/Functions/Random/RandomUniformSpread.cs +++ b/src/StandardLibrary/Functions/Random/RandomUniformSpread.cs @@ -36,7 +36,7 @@ namespace CSMic.StandardLibrary.Functions.Random return FunctionValue.ZERO; } - return new FunctionValue(FunctionValueType.Numeric, NextDecimal() * (upper - lower)); + return new FunctionValue(FunctionValueType.Numeric, lower + NextDecimal() * (upper - lower)); }); } } diff --git a/src/StandardLibrary/Functions/Rounding/Round.cs b/src/StandardLibrary/Functions/Rounding/Round.cs index 18305a9..7c8575d 100644 --- a/src/StandardLibrary/Functions/Rounding/Round.cs +++ b/src/StandardLibrary/Functions/Rounding/Round.cs @@ -16,6 +16,7 @@ get { yield return new FunctionArgument("value", FunctionValue.NUMBER); + yield return new FunctionArgument("precision", FunctionValue.NUMBER); } } @@ -26,7 +27,7 @@ var inputValue = _args[0].Value; decimal value = Convert.ToDecimal(inputValue.Value); var inputPrecision = _args[1].Value; - decimal precision = Convert.ToDecimal(inputValue.Value); + decimal precision = Convert.ToDecimal(inputPrecision.Value); precision = Math.Round(precision); int precisionInt = Convert.ToInt32(precision); diff --git a/src/StandardLibrary/Functions/Rounding/Truncate.cs b/src/StandardLibrary/Functions/Rounding/Truncate.cs index ac1c483..9917a7f 100644 --- a/src/StandardLibrary/Functions/Rounding/Truncate.cs +++ b/src/StandardLibrary/Functions/Rounding/Truncate.cs @@ -1,6 +1,6 @@ namespace CSMic.StandardLibrary.Functions.Rounding { - public class Trancate : FunctionBase, ICodedFunction + public class Truncate : FunctionBase, ICodedFunction { public string Name diff --git a/src/StandardLibrary/Functions/Trigonometry/Atan2.cs b/src/StandardLibrary/Functions/Trigonometry/Atan2.cs index 0e1e389..22f91e2 100644 --- a/src/StandardLibrary/Functions/Trigonometry/Atan2.cs +++ b/src/StandardLibrary/Functions/Trigonometry/Atan2.cs @@ -15,8 +15,8 @@ { get { - yield return new FunctionArgument("value", FunctionValue.NUMBER); - yield return new FunctionArgument("value", FunctionValue.NUMBER); + yield return new FunctionArgument("y", FunctionValue.NUMBER); + yield return new FunctionArgument("x", FunctionValue.NUMBER); } } diff --git a/src/StandardLibrary/Initializer.cs b/src/StandardLibrary/Initializer.cs index 4377e30..386514e 100644 --- a/src/StandardLibrary/Initializer.cs +++ b/src/StandardLibrary/Initializer.cs @@ -66,7 +66,7 @@ namespace CSMic.StandardLibrary inputInterpreter.RegisterFunction(new Factorial()); inputInterpreter.RegisterFunction(new BinomialCoefficient()); inputInterpreter.RegisterFunction(new Permutations()); - inputInterpreter.RegisterFunction(new GreatestCommonDevisor()); + inputInterpreter.RegisterFunction(new GreatestCommonDivisor()); inputInterpreter.RegisterFunction(new LeastCommonMultiple()); } @@ -80,7 +80,7 @@ namespace CSMic.StandardLibrary inputInterpreter.RegisterFunction(new Floor()); inputInterpreter.RegisterFunction(new Ceiling()); inputInterpreter.RegisterFunction(new Fractional()); - inputInterpreter.RegisterFunction(new Trancate()); + inputInterpreter.RegisterFunction(new Truncate()); inputInterpreter.RegisterFunction(new Round()); inputInterpreter.RegisterFunction(new Clamp()); } From 1d86b2bc19662159790c978509e24064bd0fe580 Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Thu, 21 Aug 2025 03:53:39 -0500 Subject: [PATCH 52/54] Readding Tests Missed from nomenclature standardization. --- src/CsMic.sln | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/CsMic.sln b/src/CsMic.sln index 8287e3d..a181550 100644 --- a/src/CsMic.sln +++ b/src/CsMic.sln @@ -12,6 +12,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSMic.Core", "Core\CSMic.Co EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSMic.StandardLibrary", "StandardLibrary\CSMic.StandardLibrary.csproj", "{1533FED0-C765-4929-8797-CE6C2E594DAB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CCMic.Tests", "Tests\CCMic.Tests.csproj", "{CB09F818-33F7-427E-B6B9-DB8503EAAE4A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -26,6 +28,10 @@ Global {1533FED0-C765-4929-8797-CE6C2E594DAB}.Debug|Any CPU.Build.0 = Debug|Any CPU {1533FED0-C765-4929-8797-CE6C2E594DAB}.Release|Any CPU.ActiveCfg = Release|Any CPU {1533FED0-C765-4929-8797-CE6C2E594DAB}.Release|Any CPU.Build.0 = Release|Any CPU + {CB09F818-33F7-427E-B6B9-DB8503EAAE4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CB09F818-33F7-427E-B6B9-DB8503EAAE4A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB09F818-33F7-427E-B6B9-DB8503EAAE4A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CB09F818-33F7-427E-B6B9-DB8503EAAE4A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 106efbc86ee26d3f09e496ec8cf1394f97308713 Mon Sep 17 00:00:00 2001 From: wagesj45 Date: Thu, 21 Aug 2025 04:04:46 -0500 Subject: [PATCH 53/54] tests(stdlib): reorganize and expand StandardLibrary tests - Switch tests to use Initializer.InitializeAll for setup - Split stdlib tests by category: Angle, Rounding, Trig (incl. hyperbolic), NumberTheory, Random - Add comprehensive tests invoking functions via InputInterpreter.Interpret() - Register Bernoulli in Initializer so random tests cover --- src/StandardLibrary/Initializer.cs | 1 + src/Tests/AngleFunctionsTests.cs | 57 ++++++++++++++ src/Tests/NumberTheoryFunctionsTests.cs | 84 +++++++++++++++++++++ src/Tests/RandomFunctionsTests.cs | 99 +++++++++++++++++++++++++ src/Tests/RoundingFunctionsTests.cs | 69 +++++++++++++++++ src/Tests/StdlibFunctionsTests.cs | 5 +- src/Tests/TrigonometryFunctionsTests.cs | 98 ++++++++++++++++++++++++ 7 files changed, 410 insertions(+), 3 deletions(-) create mode 100644 src/Tests/AngleFunctionsTests.cs create mode 100644 src/Tests/NumberTheoryFunctionsTests.cs create mode 100644 src/Tests/RandomFunctionsTests.cs create mode 100644 src/Tests/RoundingFunctionsTests.cs create mode 100644 src/Tests/TrigonometryFunctionsTests.cs diff --git a/src/StandardLibrary/Initializer.cs b/src/StandardLibrary/Initializer.cs index 386514e..bdb246a 100644 --- a/src/StandardLibrary/Initializer.cs +++ b/src/StandardLibrary/Initializer.cs @@ -118,6 +118,7 @@ namespace CSMic.StandardLibrary } inputInterpreter.RegisterFunction(new FairFlip()); + inputInterpreter.RegisterFunction(new Bernoulli()); inputInterpreter.RegisterFunction(new RandomUniform()); inputInterpreter.RegisterFunction(new RandomUniformSpread()); inputInterpreter.RegisterFunction(new RandomNormal()); diff --git a/src/Tests/AngleFunctionsTests.cs b/src/Tests/AngleFunctionsTests.cs new file mode 100644 index 0000000..f16787b --- /dev/null +++ b/src/Tests/AngleFunctionsTests.cs @@ -0,0 +1,57 @@ +using System.Globalization; +using CSMic; +using CSMic.StandardLibrary; + +namespace CSMic.Tests; + +public class AngleFunctionsTests +{ + private InputInterpreter _interp = null!; + + [SetUp] + public void Setup() + { + CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; + _interp = new InputInterpreter(); + Initializer.InitializeAll(_interp); + } + + private static void AssertSuccess(decimal result, decimal expected, InputInterpreter interp) + { + Assert.That(result, Is.EqualTo(expected)); + Assert.That(interp.NumericValue, Is.EqualTo(expected)); + Assert.That(interp.StringValue, Is.EqualTo(string.Empty)); + } + + private static void AssertApprox(decimal result, decimal expected, decimal tol, InputInterpreter interp) + { + Assert.That(Math.Abs(result - expected) <= tol, $"Expected ~{expected} ± {tol}, got {result}"); + Assert.That(interp.StringValue, Is.EqualTo(string.Empty)); + } + + [Test] + public void Degrees_Works_OnCommonValues() + { + AssertSuccess(_interp.Interpret("degrees(0)"), 0m, _interp); + AssertSuccess(_interp.Interpret("degrees(pi)"), 180m, _interp); + AssertSuccess(_interp.Interpret("degrees(tau)"), 360m, _interp); + } + + [Test] + public void Radians_Works_OnCommonValues() + { + AssertSuccess(_interp.Interpret("radians(0)"), 0m, _interp); + var res = _interp.Interpret("radians(180)"); + // Approximately pi + AssertApprox(res, 3.1415926535897931m, 0.0000000000001m, _interp); + } + + [Test] + public void WrapAngle_WrapsIntoRange() + { + AssertSuccess(_interp.Interpret("wrapangle(-10, 0, 360)"), 350m, _interp); + AssertSuccess(_interp.Interpret("wrapangle(370, 0, 360)"), 10m, _interp); + AssertSuccess(_interp.Interpret("wrapangle(361, -180, 180)"), -179m, _interp); + } +} + diff --git a/src/Tests/NumberTheoryFunctionsTests.cs b/src/Tests/NumberTheoryFunctionsTests.cs new file mode 100644 index 0000000..e4c09b4 --- /dev/null +++ b/src/Tests/NumberTheoryFunctionsTests.cs @@ -0,0 +1,84 @@ +using System.Globalization; +using CSMic; +using CSMic.StandardLibrary; + +namespace CSMic.Tests; + +public class NumberTheoryFunctionsTests +{ + private InputInterpreter _interp = null!; + + [SetUp] + public void Setup() + { + CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; + _interp = new InputInterpreter(); + Initializer.InitializeAll(_interp); + } + + private static void AssertSuccess(decimal result, decimal expected, InputInterpreter interp) + { + Assert.That(result, Is.EqualTo(expected)); + Assert.That(interp.NumericValue, Is.EqualTo(expected)); + Assert.That(interp.StringValue, Is.EqualTo(string.Empty)); + } + + private static void AssertApprox(decimal result, decimal expected, decimal tol, InputInterpreter interp) + { + Assert.That(Math.Abs(result - expected) <= tol, $"Expected ~{expected} ± {tol}, got {result}"); + Assert.That(interp.StringValue, Is.EqualTo(string.Empty)); + } + + [Test] + public void Gcd_Works_And_Validates() + { + AssertSuccess(_interp.Interpret("gcd(54, 24)"), 6m, _interp); + AssertSuccess(_interp.Interpret("gcd(7, 3)"), 1m, _interp); + AssertSuccess(_interp.Interpret("gcd(0, 5)"), 0m, _interp); + AssertSuccess(_interp.Interpret("gcd(5.5, 2)"), 0m, _interp); + } + + [Test] + public void Lcm_Works_And_Validates() + { + AssertSuccess(_interp.Interpret("lcm(4, 6)"), 12m, _interp); + AssertSuccess(_interp.Interpret("lcm(21, 6)"), 42m, _interp); + AssertSuccess(_interp.Interpret("lcm(-2, 6)"), 0m, _interp); + AssertSuccess(_interp.Interpret("lcm(2.5, 6)"), 0m, _interp); + } + + [Test] + public void BinomialCoefficient_Works_And_Validates() + { + AssertSuccess(_interp.Interpret("ncr(5, 2)"), 10m, _interp); + AssertSuccess(_interp.Interpret("ncr(20, 0)"), 1m, _interp); + AssertSuccess(_interp.Interpret("ncr(5, -1)"), 0m, _interp); + AssertSuccess(_interp.Interpret("ncr(5, 6)"), 0m, _interp); + AssertSuccess(_interp.Interpret("ncr(5.2, 2)"), 0m, _interp); + } + + [Test] + public void Permutations_Works_And_Validates() + { + AssertSuccess(_interp.Interpret("npr(5, 2)"), 20m, _interp); + AssertSuccess(_interp.Interpret("npr(6, 6)"), 720m, _interp); + AssertSuccess(_interp.Interpret("npr(5, 6)"), 0m, _interp); + AssertSuccess(_interp.Interpret("npr(5.2, 2)"), 0m, _interp); + } + + [Test] + public void Factorial_Works_And_Validates() + { + AssertSuccess(_interp.Interpret("fac(0)"), 1m, _interp); + AssertSuccess(_interp.Interpret("fac(1)"), 1m, _interp); + AssertSuccess(_interp.Interpret("fac(5)"), 120m, _interp); + AssertSuccess(_interp.Interpret("fac(20)"), 2432902008176640000m, _interp); + AssertSuccess(_interp.Interpret("fac(-1)"), 0m, _interp); + AssertSuccess(_interp.Interpret("fac(21)"), 0m, _interp); + + var res = _interp.Interpret("fac(0.5)"); + // Gamma(1.5) ~= sqrt(pi)/2 ~= 0.8862269254527579 + AssertApprox(res, 0.8862269254527579m, 0.0000000000001m, _interp); + } +} + diff --git a/src/Tests/RandomFunctionsTests.cs b/src/Tests/RandomFunctionsTests.cs new file mode 100644 index 0000000..6c68045 --- /dev/null +++ b/src/Tests/RandomFunctionsTests.cs @@ -0,0 +1,99 @@ +using System.Globalization; +using CSMic; +using CSMic.StandardLibrary; + +namespace CSMic.Tests; + +public class RandomFunctionsTests +{ + private InputInterpreter _interp = null!; + + [SetUp] + public void Setup() + { + CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; + _interp = new InputInterpreter(); + Initializer.InitializeAll(_interp); + } + + private static void AssertSuccess(decimal result, decimal expected, InputInterpreter interp) + { + Assert.That(result, Is.EqualTo(expected)); + Assert.That(interp.NumericValue, Is.EqualTo(expected)); + Assert.That(interp.StringValue, Is.EqualTo(string.Empty)); + } + + [Test] + public void Flip_ReturnsBooleanAsNumeric() + { + for (int i = 0; i < 5; i++) + { + var res = _interp.Interpret("flip()"); + Assert.That(res == 0m || res == 1m, "flip() must return 0 or 1"); + Assert.That(_interp.StringValue, Is.EqualTo(string.Empty)); + } + } + + [Test] + public void Rand_IsWithinUnitInterval() + { + for (int i = 0; i < 5; i++) + { + var res = _interp.Interpret("rand()"); + Assert.That(res, Is.GreaterThanOrEqualTo(0m)); + Assert.That(res, Is.LessThan(1m)); + Assert.That(_interp.StringValue, Is.EqualTo(string.Empty)); + } + } + + [Test] + public void RandSpread_IsWithinBounds_And_Validates() + { + for (int i = 0; i < 5; i++) + { + var res = _interp.Interpret("rands(5, 10)"); + Assert.That(res, Is.GreaterThanOrEqualTo(5m)); + Assert.That(res, Is.LessThan(10m)); + Assert.That(_interp.StringValue, Is.EqualTo(string.Empty)); + } + + AssertSuccess(_interp.Interpret("rands(10, 5)"), 0m, _interp); + } + + [Test] + public void RandNormal_ProducesNumeric() + { + bool sawNonZero = false; + for (int i = 0; i < 10; i++) + { + var res = _interp.Interpret("randn()"); + if (res != 0m) sawNonZero = true; + Assert.That(_interp.StringValue, Is.EqualTo(string.Empty)); + } + Assert.That(sawNonZero, Is.True); + } + + [Test] + public void RandNormalSpread_ValidatesBounds() + { + AssertSuccess(_interp.Interpret("randns(10, 5)"), 0m, _interp); + // With valid bounds, it should succeed and produce a numeric (any value) + var res = _interp.Interpret("randns(5, 10)"); + Assert.That(_interp.StringValue, Is.EqualTo(string.Empty)); + } + + [Test] + public void Bernoulli_ValidatesP_And_ReturnsBoolean() + { + // Invalid p produces soft error (message populated) + _interp.Interpret("bern(-0.1)"); + Assert.That(string.IsNullOrEmpty(_interp.StringValue), Is.False); + _interp.Interpret("bern(1.1)"); + Assert.That(string.IsNullOrEmpty(_interp.StringValue), Is.False); + + // Valid p returns 0 or 1 without error + var res = _interp.Interpret("bern(0.7)"); + Assert.That(res == 0m || res == 1m); + Assert.That(_interp.StringValue, Is.EqualTo(string.Empty)); + } +} diff --git a/src/Tests/RoundingFunctionsTests.cs b/src/Tests/RoundingFunctionsTests.cs new file mode 100644 index 0000000..8153fcb --- /dev/null +++ b/src/Tests/RoundingFunctionsTests.cs @@ -0,0 +1,69 @@ +using System.Globalization; +using CSMic; +using CSMic.StandardLibrary; + +namespace CSMic.Tests; + +public class RoundingFunctionsTests +{ + private InputInterpreter _interp = null!; + + [SetUp] + public void Setup() + { + CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; + _interp = new InputInterpreter(); + Initializer.InitializeAll(_interp); + } + + private static void AssertSuccess(decimal result, decimal expected, InputInterpreter interp) + { + Assert.That(result, Is.EqualTo(expected)); + Assert.That(interp.NumericValue, Is.EqualTo(expected)); + Assert.That(interp.StringValue, Is.EqualTo(string.Empty)); + } + + [Test] + public void Floor_Works() + { + AssertSuccess(_interp.Interpret("floor(2.3)"), 2m, _interp); + AssertSuccess(_interp.Interpret("floor(-2.3)"), -3m, _interp); + } + + [Test] + public void Ceiling_Works() + { + AssertSuccess(_interp.Interpret("ceiling(2.3)"), 3m, _interp); + AssertSuccess(_interp.Interpret("ceiling(-2.3)"), -2m, _interp); + } + + [Test] + public void Truncate_Works() + { + AssertSuccess(_interp.Interpret("truncate(2.9)"), 2m, _interp); + AssertSuccess(_interp.Interpret("truncate(-2.9)"), -2m, _interp); + } + + [Test] + public void Fractional_Works() + { + AssertSuccess(_interp.Interpret("frac(2.75)"), 0.75m, _interp); + AssertSuccess(_interp.Interpret("frac(-2.75)"), -0.75m, _interp); + } + + [Test] + public void Round_WithPrecision_Works() + { + AssertSuccess(_interp.Interpret("round(2.346, 2)"), 2.35m, _interp); + AssertSuccess(_interp.Interpret("round(2.344, 2)"), 2.34m, _interp); + } + + [Test] + public void Clamp_Works() + { + AssertSuccess(_interp.Interpret("clamp(5, 1, 10)"), 5m, _interp); + AssertSuccess(_interp.Interpret("clamp(0, 1, 10)"), 1m, _interp); + AssertSuccess(_interp.Interpret("clamp(11, 1, 10)"), 10m, _interp); + } +} + diff --git a/src/Tests/StdlibFunctionsTests.cs b/src/Tests/StdlibFunctionsTests.cs index add1b05..263795e 100644 --- a/src/Tests/StdlibFunctionsTests.cs +++ b/src/Tests/StdlibFunctionsTests.cs @@ -3,7 +3,6 @@ using CSMic.StandardLibrary; using NUnit.Framework; using CSMic.StandardLibrary.Functions; using System.Globalization; -using System.Reflection.Metadata; namespace CSMic.Tests; @@ -16,8 +15,8 @@ public class StdlibFunctionsTests { CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; _interp = new InputInterpreter(); - Constants.Initialize(_interp); - Functions.Initialize(_interp); ; + // Initialize full standard library (functions + constants) + Initializer.InitializeAll(_interp); } private static void AssertSuccess(decimal result, decimal expected, InputInterpreter interp) diff --git a/src/Tests/TrigonometryFunctionsTests.cs b/src/Tests/TrigonometryFunctionsTests.cs new file mode 100644 index 0000000..4c2665f --- /dev/null +++ b/src/Tests/TrigonometryFunctionsTests.cs @@ -0,0 +1,98 @@ +using System.Globalization; +using CSMic; +using CSMic.StandardLibrary; + +namespace CSMic.Tests; + +public class TrigonometryFunctionsTests +{ + private InputInterpreter _interp = null!; + + [SetUp] + public void Setup() + { + CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; + _interp = new InputInterpreter(); + Initializer.InitializeAll(_interp); + } + + private static void AssertSuccess(decimal result, decimal expected, InputInterpreter interp) + { + Assert.That(result, Is.EqualTo(expected)); + Assert.That(interp.NumericValue, Is.EqualTo(expected)); + Assert.That(interp.StringValue, Is.EqualTo(string.Empty)); + } + + private static void AssertApprox(decimal result, decimal expected, decimal tol, InputInterpreter interp) + { + Assert.That(Math.Abs(result - expected) <= tol, $"Expected ~{expected} ± {tol}, got {result}"); + Assert.That(interp.StringValue, Is.EqualTo(string.Empty)); + } + + [Test] + public void BasicTrig_ZeroPoints() + { + AssertSuccess(_interp.Interpret("sin(0)"), 0m, _interp); + AssertSuccess(_interp.Interpret("cos(0)"), 1m, _interp); + AssertSuccess(_interp.Interpret("tan(0)"), 0m, _interp); + } + + [Test] + public void BasicTrig_CommonAngles() + { + AssertApprox(_interp.Interpret("sin(pi/2)"), 1m, 0.0000000000001m, _interp); + AssertApprox(_interp.Interpret("cos(pi/2)"), 0m, 0.0000000000001m, _interp); + AssertApprox(_interp.Interpret("tan(pi/4)"), 1m, 0.0000000000001m, _interp); + } + + [Test] + public void InverseTrig_ZeroPoints() + { + AssertSuccess(_interp.Interpret("asin(0)"), 0m, _interp); + AssertSuccess(_interp.Interpret("acos(1)"), 0m, _interp); + AssertSuccess(_interp.Interpret("atan(0)"), 0m, _interp); + AssertSuccess(_interp.Interpret("atan2(0, 1)"), 0m, _interp); + } + + [Test] + public void InverseTrig_CommonValues() + { + // asin(1) ~= pi/2, acos(0) ~= pi/2, atan(1) ~= pi/4, atan2(1,0) ~= pi/2 + AssertApprox(_interp.Interpret("asin(1)"), 1.5707963267948966m, 0.0000000000001m, _interp); + AssertApprox(_interp.Interpret("acos(0)"), 1.5707963267948966m, 0.0000000000001m, _interp); + AssertApprox(_interp.Interpret("atan(1)"), 0.7853981633974483m, 0.0000000000001m, _interp); + AssertApprox(_interp.Interpret("atan2(1, 0)"), 1.5707963267948966m, 0.0000000000001m, _interp); + } +} + +public class HyperbolicTrigFunctionsTests +{ + private InputInterpreter _interp = null!; + + [SetUp] + public void Setup() + { + CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; + _interp = new InputInterpreter(); + Initializer.InitializeAll(_interp); + } + + private static void AssertSuccess(decimal result, decimal expected, InputInterpreter interp) + { + Assert.That(result, Is.EqualTo(expected)); + Assert.That(interp.NumericValue, Is.EqualTo(expected)); + Assert.That(interp.StringValue, Is.EqualTo(string.Empty)); + } + + [Test] + public void Hyperbolic_ZeroPoints() + { + AssertSuccess(_interp.Interpret("sinh(0)"), 0m, _interp); + AssertSuccess(_interp.Interpret("cosh(0)"), 1m, _interp); + AssertSuccess(_interp.Interpret("tanh(0)"), 0m, _interp); + AssertSuccess(_interp.Interpret("asinh(0)"), 0m, _interp); + AssertSuccess(_interp.Interpret("acosh(1)"), 0m, _interp); + AssertSuccess(_interp.Interpret("atanh(0)"), 0m, _interp); + } +} + From f1cf26ad98766bbcb8f5c0973623518cf9cca92a Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Thu, 21 Aug 2025 04:11:03 -0500 Subject: [PATCH 54/54] Fixed spelling error. --- src/CsMic.sln | 2 +- src/StandardLibrary/CsMic.StandardLibrary.csproj | 6 ------ src/Tests/{CCMic.Tests.csproj => CSMic.Tests.csproj} | 0 3 files changed, 1 insertion(+), 7 deletions(-) rename src/Tests/{CCMic.Tests.csproj => CSMic.Tests.csproj} (100%) diff --git a/src/CsMic.sln b/src/CsMic.sln index a181550..6e95b8b 100644 --- a/src/CsMic.sln +++ b/src/CsMic.sln @@ -12,7 +12,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSMic.Core", "Core\CSMic.Co EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSMic.StandardLibrary", "StandardLibrary\CSMic.StandardLibrary.csproj", "{1533FED0-C765-4929-8797-CE6C2E594DAB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CCMic.Tests", "Tests\CCMic.Tests.csproj", "{CB09F818-33F7-427E-B6B9-DB8503EAAE4A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSMic.Tests", "Tests\CSMic.Tests.csproj", "{CB09F818-33F7-427E-B6B9-DB8503EAAE4A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/StandardLibrary/CsMic.StandardLibrary.csproj b/src/StandardLibrary/CsMic.StandardLibrary.csproj index 78bd2a7..268636f 100644 --- a/src/StandardLibrary/CsMic.StandardLibrary.csproj +++ b/src/StandardLibrary/CsMic.StandardLibrary.csproj @@ -8,12 +8,6 @@ enable - - - - - - diff --git a/src/Tests/CCMic.Tests.csproj b/src/Tests/CSMic.Tests.csproj similarity index 100% rename from src/Tests/CCMic.Tests.csproj rename to src/Tests/CSMic.Tests.csproj

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 JqFcl)3;`rQ5yb!i diff --git a/CS-MIC/csmic/CSMICTests/bin/Release/CSMICTests.dll b/CS-MIC/csmic/CSMICTests/bin/Release/CSMICTests.dll new file mode 100644 index 0000000000000000000000000000000000000000..129f7529782d568c03ca46a2a30fb7884d9686cd GIT binary patch literal 10752 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 literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/CSMICTests/bin/Release/CSMICTests.pdb b/CS-MIC/csmic/CSMICTests/bin/Release/CSMICTests.pdb new file mode 100644 index 0000000000000000000000000000000000000000..03f947d4935cbe59d52dd4f0e6b91f065c780d99 GIT binary patch literal 19968 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 literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/CSMICTests/bin/Release/Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll b/CS-MIC/csmic/CSMICTests/bin/Release/Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll new file mode 100644 index 0000000000000000000000000000000000000000..eb92aa1ab16084dcd5a6e1b44a925a3ecbfb0bf6 GIT binary patch literal 98856 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 z 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 R6GBWhrE4Y!Es$Yg0002&a+Cl7 literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/CSMICTests/bin/Release/csmic.dll b/CS-MIC/csmic/CSMICTests/bin/Release/csmic.dll new file mode 100644 index 0000000000000000000000000000000000000000..038b76863944a92fc3d2a5071f922b7390a41106 GIT binary patch literal 51712 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 C^5kLw literal 0 HcmV?d00001 diff --git a/CS-MIC/csmic/CSMICTests/obj/Debug/CSMICTests.csproj.CoreCompileInputs.cache b/CS-MIC/csmic/CSMICTests/obj/Debug/CSMICTests.csproj.CoreCompileInputs.cache index 2a37d33..51e51b2 100644 --- a/CS-MIC/csmic/CSMICTests/obj/Debug/CSMICTests.csproj.CoreCompileInputs.cache +++ b/CS-MIC/csmic/CSMICTests/obj/Debug/CSMICTests.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -36df016871eaf0623988524de0fae43fd7690943 +b39ce37174cad74c8729c35da3279f049bebd6ab diff --git a/CS-MIC/csmic/CSMICTests/obj/Debug/CSMICTests.csprojAssemblyReference.cache b/CS-MIC/csmic/CSMICTests/obj/Debug/CSMICTests.csprojAssemblyReference.cache index b81b4b1822d4958ec685dcfdbe211b346a248501..95c72669dc54a5597b694343fe741eec5dd0750f 100644 GIT binary patch literal 33341 zcmeI53ve98na6h|&F=QfMwW4S9EQlom)KzMN|xj&#@K7i_8~v8Z1eEiVzio-7VSgc zhaB^=Lym)cBoMejpx|&FN3I}OKvD^$Dulv0Umg^JJTMnXu7Yz1I2SuP;HnODWw`%; zdS^YW9^E15lya)NUHf^b)${c?J-_M4H{HDfBM=CDh`|3DCe=agT%S%B^2L0r6kS