diff --git a/Compiler/Compiler.cs b/Compiler/Compiler.cs index 09b9fd867..02b33b074 100644 --- a/Compiler/Compiler.cs +++ b/Compiler/Compiler.cs @@ -161,7 +161,8 @@ using System.CodeDom.Compiler; using Microsoft.Scripting.Hosting; using Microsoft.Scripting; using System.Reflection; -using SyntaxTreeChanger; +//using SyntaxTreeChanger; +using PascalABCCompiler.SyntaxTreeConverters; namespace PascalABCCompiler @@ -665,7 +666,7 @@ namespace PascalABCCompiler public class Compiler : MarshalByRefObject, ICompiler { - public ISyntaxTreeChanger SyntaxTreeChanger = null; // SSM 17/08/15 - для операций над синтаксическим деревом после его построения + //public ISyntaxTreeChanger SyntaxTreeChanger = null; // SSM 17/08/15 - для операций над синтаксическим деревом после его построения public static string Version { @@ -700,6 +701,15 @@ namespace PascalABCCompiler return Banner; } + private SyntaxTreeConvertersController syntaxTreeConvertersController = null; + public SyntaxTreeConvertersController SyntaxTreeConvertersController + { + get + { + return syntaxTreeConvertersController; + } + } + private SemanticTreeConvertersController semanticTreeConvertersController = null; public SemanticTreeConvertersController SemanticTreeConvertersController { @@ -913,7 +923,7 @@ namespace PascalABCCompiler public Compiler() { - SyntaxTreeChanger = new SyntaxTreeChanger.SyntaxTreeChange(); + //SyntaxTreeChanger = new SyntaxTreeChanger.SyntaxTreeChange(); OnChangeCompilerState += ChangeCompilerStateEvent; Reload(); @@ -921,7 +931,7 @@ namespace PascalABCCompiler public Compiler(ICompiler comp, SourceFilesProviderDelegate SourceFilesProvider, ChangeCompilerStateEventDelegate ChangeCompilerState) { - SyntaxTreeChanger = new SyntaxTreeChanger.SyntaxTreeChange(); // SSM 01/05/16 - подключение изменяльщика синтаксического дерева + //SyntaxTreeChanger = new SyntaxTreeChanger.SyntaxTreeChange(); // SSM 01/05/16 - подключение изменяльщика синтаксического дерева this.ParsersController = comp.ParsersController; this.internalDebug = comp.InternalDebug; @@ -936,6 +946,7 @@ namespace PascalABCCompiler public Compiler(SourceFilesProviderDelegate SourceFilesProvider, ChangeCompilerStateEventDelegate ChangeCompilerState) { + //SyntaxTreeChanger = new SyntaxTreeChanger.SyntaxTreeChange(); // SSM 01/05/16 - подключение изменяльщика синтаксического дерева OnChangeCompilerState += ChangeCompilerStateEvent; if (SourceFilesProvider != null) this.sourceFilesProvider = SourceFilesProvider; @@ -964,9 +975,15 @@ namespace PascalABCCompiler //PABCToCppCodeGeneratorsController = new PascalToCppConverter.Controller(); SetSupportedSourceFiles(); SetSupportedProjectFiles(); + + syntaxTreeConvertersController = new SyntaxTreeConvertersController(this); + syntaxTreeConvertersController.ChangeState += syntaxTreeConvertersController_ChangeState; + syntaxTreeConvertersController.AddConverters(); + semanticTreeConvertersController = new SemanticTreeConvertersController(this); - semanticTreeConvertersController.ChangeState += new SemanticTreeConvertersController.ChangeStateDelegate(semanticTreeConvertersController_ChangeState); + semanticTreeConvertersController.ChangeState += semanticTreeConvertersController_ChangeState; semanticTreeConvertersController.AddConverters(); + OnChangeCompilerState(this, CompilerState.Ready, null); } @@ -976,6 +993,19 @@ namespace PascalABCCompiler OnChangeCompilerState(this, CompilerState.ParserConnected, Parser.GetType().Assembly.ManifestModule.FullyQualifiedName); } + void syntaxTreeConvertersController_ChangeState(SyntaxTreeConvertersController.State State, ISyntaxTreeConverter SyntaxTreeConverter) + { + switch (State) + { + case SyntaxTreeConvertersController.State.Convert: + OnChangeCompilerState(this, CompilerState.SemanticTreeConversion, SyntaxTreeConverter.Name); + break; + case SyntaxTreeConvertersController.State.ConnectConverter: + OnChangeCompilerState(this, CompilerState.SemanticTreeConverterConnected, SyntaxTreeConverter.Name); + break; + } + } + void semanticTreeConvertersController_ChangeState(SemanticTreeConvertersController.State State, ISemanticTreeConverter SemanticTreeConverter) { switch (State) @@ -2866,10 +2896,9 @@ namespace PascalABCCompiler CurrentUnit.SyntaxTree = InternalParseText(UnitName, SourceText, errorsList); - if (errorsList.Count == 0) // SSM 17/08/15 - для преобразования синтаксических деревьев извне + if (errorsList.Count == 0) // SSM 2/05/16 - для преобразования синтаксических деревьев извне { - if (SyntaxTreeChanger != null) - SyntaxTreeChanger.Change(CurrentUnit.SyntaxTree); + CurrentUnit.SyntaxTree = syntaxTreeConvertersController.Convert(CurrentUnit.SyntaxTree) as SyntaxTree.compilation_unit; } if (errorsList.Count == 0 && need_gen_doc(CurrentUnit.SyntaxTree)) diff --git a/Compiler/Compiler.csproj b/Compiler/Compiler.csproj index 119783d2a..3796bd0e0 100644 --- a/Compiler/Compiler.csproj +++ b/Compiler/Compiler.csproj @@ -142,9 +142,9 @@ {613E0DDA-AA8A-437C-AC45-507B47429FF9} {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - + {f10a5330-dcf4-4533-877c-7b1b1be23884} - SyntaxTreeChanger + SyntaxTreeConverters SyntaxTree @@ -181,6 +181,7 @@ Code + diff --git a/Compiler/ICompiler.cs b/Compiler/ICompiler.cs index f5ed8a91c..48ab5d6b9 100644 --- a/Compiler/ICompiler.cs +++ b/Compiler/ICompiler.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Text; using PascalABCCompiler.SemanticTreeConverters; +using PascalABCCompiler.SyntaxTreeConverters; using PascalABCCompiler.Errors; ///В разработке DarkStar @@ -13,6 +14,10 @@ namespace PascalABCCompiler public enum CompilerType { Standart, Remote } public interface ICompiler { + SyntaxTreeConvertersController SyntaxTreeConvertersController + { + get; + } SemanticTreeConvertersController SemanticTreeConvertersController { get; diff --git a/Compiler/RemoteCompiler.cs b/Compiler/RemoteCompiler.cs index 7952dfd91..d70085d2f 100644 --- a/Compiler/RemoteCompiler.cs +++ b/Compiler/RemoteCompiler.cs @@ -483,7 +483,15 @@ namespace PascalABCCompiler { throw new NotSupportedException(); } - + + public PascalABCCompiler.SyntaxTreeConverters.SyntaxTreeConvertersController SyntaxTreeConvertersController + { + get + { + throw new NotSupportedException(); + } + } + public PascalABCCompiler.SemanticTreeConverters.SemanticTreeConvertersController SemanticTreeConvertersController { get diff --git a/Compiler/SemanticTreeConverters/SemanticTreeConvertersController.cs b/Compiler/SemanticTreeConverters/SemanticTreeConvertersController.cs index c6eeaac87..8676bb3ad 100644 --- a/Compiler/SemanticTreeConverters/SemanticTreeConvertersController.cs +++ b/Compiler/SemanticTreeConverters/SemanticTreeConvertersController.cs @@ -41,18 +41,18 @@ namespace PascalABCCompiler.SemanticTreeConverters { DirectoryInfo di = new DirectoryInfo(DirectoryName); FileInfo[] dllfiles = di.GetFiles("*Conversion.dll"); - System.Reflection.Assembly asssembly = null; + System.Reflection.Assembly assembly = null; ISemanticTreeConverter Converter; foreach (FileInfo fi in dllfiles) { try { - asssembly = System.Reflection.Assembly.LoadFile(fi.FullName); + assembly = System.Reflection.Assembly.LoadFile(fi.FullName); try { - Type[] types = asssembly.GetTypes(); - if (asssembly != null) + if (assembly != null) { + Type[] types = assembly.GetTypes(); foreach (Type type in types) { if (type.Name.IndexOf("SemanticTreeConverter") >= 0 && type.IsClass) diff --git a/Compiler/SyntaxTreeConvertersController/SyntaxTreeConvertersController.cs b/Compiler/SyntaxTreeConvertersController/SyntaxTreeConvertersController.cs new file mode 100644 index 000000000..c035eb8e3 --- /dev/null +++ b/Compiler/SyntaxTreeConvertersController/SyntaxTreeConvertersController.cs @@ -0,0 +1,97 @@ +// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using PascalABCCompiler.SyntaxTree; +using PascalABCCompiler.SyntaxTreeConverters; + +namespace PascalABCCompiler.SyntaxTreeConverters +{ + public class SyntaxTreeConvertersController + { + public enum State + { + ConnectConverter, Convert + } + ICompiler Compiler; + + private List syntaxTreeConverters = new List(); + public List SyntaxTreeConverters + { + get + { + return syntaxTreeConverters; + } + } + + public delegate void ChangeStateDelegate(State State, ISyntaxTreeConverter SyntaxTreeConverter); + public event ChangeStateDelegate ChangeState; + + + public SyntaxTreeConvertersController(ICompiler Compiler) + { + this.Compiler = Compiler; + } + + public void AddConverters() + { + AddConverters(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.FullyQualifiedName)); + } + private void AddConverters(string DirectoryName) + { + DirectoryInfo di = new DirectoryInfo(DirectoryName); + FileInfo[] dllfiles = di.GetFiles("*ConversionSyntax.dll"); + System.Reflection.Assembly assembly = null; + ISyntaxTreeConverter Converter; + foreach (FileInfo fi in dllfiles) + { + try + { + assembly = System.Reflection.Assembly.LoadFile(fi.FullName); + try + { + if (assembly != null) + { + Type[] types = assembly.GetTypes(); + foreach (Type type in types) + { + if (type.Name.IndexOf("SyntaxTreeConverter") >= 0 && type.IsClass) + { + Object obj = Activator.CreateInstance(type); + if (obj is ISyntaxTreeConverter) + { + Converter = obj as ISyntaxTreeConverter; + syntaxTreeConverters.Add(Converter); + ChangeState(State.ConnectConverter, Converter); + } + } + } + } + } + catch (Exception e) + { + //ErrorList.Add(new PluginLoadingError(fi.FullName, e)); + } + + } + catch (Exception) + { + //если dll не нетовская + } + } + + } + + public syntax_tree_node Convert(syntax_tree_node root) + { + foreach (ISyntaxTreeConverter SyntaxTreeConverter in syntaxTreeConverters) + { + ChangeState(State.Convert, SyntaxTreeConverter); + root = SyntaxTreeConverter.Convert(root); + } + return root; + } + } +} diff --git a/PascalABCNET.sln b/PascalABCNET.sln index 8f586793d..937da7b6a 100644 --- a/PascalABCNET.sln +++ b/PascalABCNET.sln @@ -93,7 +93,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PascalABCSaushkinParser", " EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DA0402DA-D618-47B4-8BF0-2959D16F2160}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxTreeChanger", "SyntaxTreeChanger\SyntaxTreeChanger.csproj", "{F10A5330-DCF4-4533-877C-7B1B1BE23884}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxTreeConverters", "SyntaxTreeConverters\SyntaxTreeConverters.csproj", "{F10A5330-DCF4-4533-877C-7B1B1BE23884}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/SyntaxTreeChanger/SyntaxTreeChange.cs b/SyntaxTreeChanger/SyntaxTreeChange.cs deleted file mode 100644 index 749424a56..000000000 --- a/SyntaxTreeChanger/SyntaxTreeChange.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using PascalABCCompiler; -using PascalABCCompiler.SyntaxTree; - -namespace SyntaxTreeChanger -{ - public interface ISyntaxTreeChanger - { - void Change(syntax_tree_node root); - } - - public class SyntaxTreeChange: ISyntaxTreeChanger - { - public void Change(syntax_tree_node root) - { - - } - } -} diff --git a/SyntaxTreeConverters/ISyntaxTreeConverter.cs b/SyntaxTreeConverters/ISyntaxTreeConverter.cs new file mode 100644 index 000000000..9cd14d0a5 --- /dev/null +++ b/SyntaxTreeConverters/ISyntaxTreeConverter.cs @@ -0,0 +1,32 @@ +// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) +using PascalABCCompiler.SyntaxTree; + +namespace PascalABCCompiler.SyntaxTreeConverters +{ + public enum ConverterType + { + Conversion, Analysis + } + public enum ExecutionOrder + { + Undefined, First, Last + } + public interface ISyntaxTreeConverter + { + string Name { get; } + + string Version { get; } + + string Description { get; } + + string Copyright { get; } + + ConverterType ConverterType { get; } + + ExecutionOrder ExecutionOrder { get; } + + syntax_tree_node Convert(syntax_tree_node root); + + } +} diff --git a/SyntaxTreeChanger/Properties/AssemblyInfo.cs b/SyntaxTreeConverters/Properties/AssemblyInfo.cs similarity index 100% rename from SyntaxTreeChanger/Properties/AssemblyInfo.cs rename to SyntaxTreeConverters/Properties/AssemblyInfo.cs diff --git a/SyntaxTreeChanger/SyntaxTreeChanger.csproj b/SyntaxTreeConverters/SyntaxTreeConverters.csproj similarity index 97% rename from SyntaxTreeChanger/SyntaxTreeChanger.csproj rename to SyntaxTreeConverters/SyntaxTreeConverters.csproj index a869fba30..9ed7accc2 100644 --- a/SyntaxTreeChanger/SyntaxTreeChanger.csproj +++ b/SyntaxTreeConverters/SyntaxTreeConverters.csproj @@ -34,7 +34,7 @@ - + diff --git a/_ParsePABC1/ParsePABC1.sln b/_ParsePABC1/ParsePABC1.sln index 7dcc35857..5f39f6e2b 100644 --- a/_ParsePABC1/ParsePABC1.sln +++ b/_ParsePABC1/ParsePABC1.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 +VisualStudioVersion = 14.0.25123.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxVisitors", "ParsePABC1\SyntaxVisitors.csproj", "{BAA767F1-6544-4A44-BA17-5FBFCF6F2D99}" EndProject @@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxTree", "..\SyntaxTree EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YieldDesugarTest", "YieldDesugarTest\YieldDesugarTest.csproj", "{9EBC62C6-3092-4E9D-940E-476D332E0951}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SyntaxTreeChanger", "..\SyntaxTreeChanger\SyntaxTreeChanger.csproj", "{F10A5330-DCF4-4533-877C-7B1B1BE23884}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -27,6 +29,10 @@ Global {9EBC62C6-3092-4E9D-940E-476D332E0951}.Debug|Any CPU.Build.0 = Debug|Any CPU {9EBC62C6-3092-4E9D-940E-476D332E0951}.Release|Any CPU.ActiveCfg = Release|Any CPU {9EBC62C6-3092-4E9D-940E-476D332E0951}.Release|Any CPU.Build.0 = Release|Any CPU + {F10A5330-DCF4-4533-877C-7B1B1BE23884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F10A5330-DCF4-4533-877C-7B1B1BE23884}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F10A5330-DCF4-4533-877C-7B1B1BE23884}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F10A5330-DCF4-4533-877C-7B1B1BE23884}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE