SyntaxTreeConvertersController

This commit is contained in:
miks1965 2016-05-02 11:26:17 +03:00
parent 9b1a0c76cd
commit b133c26287
12 changed files with 196 additions and 40 deletions

View file

@ -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))

View file

@ -142,9 +142,9 @@
<Project>{613E0DDA-AA8A-437C-AC45-507B47429FF9}</Project>
<Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package>
</ProjectReference>
<ProjectReference Include="..\SyntaxTreeChanger\SyntaxTreeChanger.csproj">
<ProjectReference Include="..\SyntaxTreeConverters\SyntaxTreeConverters.csproj">
<Project>{f10a5330-dcf4-4533-877c-7b1b1be23884}</Project>
<Name>SyntaxTreeChanger</Name>
<Name>SyntaxTreeConverters</Name>
</ProjectReference>
<ProjectReference Include="..\SyntaxTree\SyntaxTree.csproj">
<Name>SyntaxTree</Name>
@ -181,6 +181,7 @@
<Compile Include="string_constants.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="SyntaxTreeConvertersController\SyntaxTreeConvertersController.cs" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">

View file

@ -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;

View file

@ -483,7 +483,15 @@ namespace PascalABCCompiler
{
throw new NotSupportedException();
}
public PascalABCCompiler.SyntaxTreeConverters.SyntaxTreeConvertersController SyntaxTreeConvertersController
{
get
{
throw new NotSupportedException();
}
}
public PascalABCCompiler.SemanticTreeConverters.SemanticTreeConvertersController SemanticTreeConvertersController
{
get

View file

@ -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)

View file

@ -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<ISyntaxTreeConverter> syntaxTreeConverters = new List<ISyntaxTreeConverter>();
public List<ISyntaxTreeConverter> 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;
}
}
}

View file

@ -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

View file

@ -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)
{
}
}
}

View file

@ -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);
}
}

View file

@ -34,7 +34,7 @@
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="SyntaxTreeChange.cs" />
<Compile Include="ISyntaxTreeConverter.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>

View file

@ -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