SyntaxTreeConvertersController
This commit is contained in:
parent
9b1a0c76cd
commit
b133c26287
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -483,7 +483,15 @@ namespace PascalABCCompiler
|
|||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
|
||||
public PascalABCCompiler.SyntaxTreeConverters.SyntaxTreeConvertersController SyntaxTreeConvertersController
|
||||
{
|
||||
get
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
|
||||
public PascalABCCompiler.SemanticTreeConverters.SemanticTreeConvertersController SemanticTreeConvertersController
|
||||
{
|
||||
get
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
32
SyntaxTreeConverters/ISyntaxTreeConverter.cs
Normal file
32
SyntaxTreeConverters/ISyntaxTreeConverter.cs
Normal 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);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue