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