Add XML serialization support for syntax generator

This commit is contained in:
Alexander Zakharenko 2017-02-18 12:20:03 +03:00
parent 58f342fdb2
commit c18f52abc3
21 changed files with 590 additions and 13 deletions

Binary file not shown.

View file

@ -1,3 +1,3 @@
tree.nin
tree.xml
1
Storage

View file

@ -342,12 +342,12 @@ namespace NodesGenerator
// openFileDialog1
//
this.openFileDialog1.DefaultExt = "nin";
this.openFileDialog1.Filter = "Файлы синтаксического дерева (*.nin)|*.nin|Все файлы (*.*)|*.*";
this.openFileDialog1.Filter = "Файлы синтаксического дерева (*.nin, *.xml)|*.nin;*.xml|Все файлы (*.*)|*.*";
//
// saveFileDialog1
//
this.saveFileDialog1.DefaultExt = "nin";
this.saveFileDialog1.Filter = "Файлы синтаксического дерева (*.nin)|*.nin|Все файлы (*.*)|*.*";
this.saveFileDialog1.Filter = "Файлы синтаксического дерева (*.nin, *.xml)|*.nin;*.xml|Все файлы (*.*)|*.*";
//
// toolStripStatusLabel1
//
@ -1535,7 +1535,7 @@ namespace NodesGenerator
else
{
set_nodes_information();
this.Text = Path.GetFileNameWithoutExtension(fname) + " - " + default_caption;
this.Text = Path.GetFileName(fname) + " - " + default_caption;
}
}

View file

@ -1,3 +1,4 @@
using NodesGenerator.XmlModel;
using System;
using System.Collections;
using System.Collections.Generic;
@ -7,6 +8,7 @@ using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml.Serialization;
namespace NodeGenerator
{
@ -445,6 +447,8 @@ namespace NodeGenerator
{
private Hashtable ht=new Hashtable();
public Hashtable HelpData => ht;
public void add_context(object ob,HelpContext hc)
{
ht.Add(ob,hc);
@ -707,6 +711,14 @@ namespace NodeGenerator
writer.CloseBlock();
}
/// <summary>
/// Получает эквивалент поля для модели XML
/// </summary>
/// <returns></returns>
public virtual SyntaxField XmlField()
{
return new SyntaxField(this);
}
}
//miks 31.05.10
[Serializable]
@ -806,7 +818,11 @@ namespace NodeGenerator
}
}
}
public override SyntaxField XmlField()
{
return new SimpleField(this);
}
}
[Serializable]
public class extended_simple_element:simple_element
@ -872,6 +888,11 @@ namespace NodeGenerator
else
writer.WriteLine($"{destination} = {field_name};");
}
public override SyntaxField XmlField()
{
return new ExtendedField(this);
}
}
@ -3517,6 +3538,7 @@ namespace NodeGenerator
{
return hstr;
}
set { hstr = value; }
}
public void add_node(node_info ni)
@ -4492,9 +4514,24 @@ namespace NodeGenerator
Stream str=File.Open(file_name,FileMode.Create);
BinaryFormatter formatter=new BinaryFormatter();
var extension = Path.GetExtension(file_name).ToLower();
switch (extension)
{
case ".xml":
var serializer = new XmlSerializer(typeof(NodeGeneratorData));
serializer.Serialize(str, new NodeGeneratorData(this));
break;
case ".nin":
var formatter = new BinaryFormatter();
formatter.Serialize(str, this);
break;
default:
throw new FileLoadException($"Unknown file format: {extension}");
}
formatter.Serialize(str,this);
//var formatter=new XmlSerializer(typeof(NodeGenerator)); //new BinaryFormatter();
str.Flush();
str.Close();
@ -4503,16 +4540,30 @@ namespace NodeGenerator
public static NodeGenerator deserialize(string file_name)
{
Stream str=File.Open(file_name,FileMode.Open);
BinaryFormatter formatter=new BinaryFormatter();
object o=formatter.Deserialize(str);
var extension = Path.GetExtension(file_name).ToLower();
object deserializedGenerator;
switch (extension)
{
case ".xml":
var deserializer = new XmlSerializer(typeof(NodeGeneratorData));
var generator = (deserializer.Deserialize(str) as NodeGeneratorData).ToNodeGenerator();
generator.unsorted_nodes = new ArrayList(generator.nodes);
deserializedGenerator = generator;
break;
case ".nin":
var formatter = new BinaryFormatter();
deserializedGenerator = formatter.Deserialize(str);
break;
default:
throw new FileLoadException($"Unknown file format: {extension}");
}
str.Close();
NodeGenerator ng=(o as NodeGenerator);
NodeGenerator ng=(deserializedGenerator as NodeGenerator);
ng.removeIncorrectTags();
//str.Flush();
str.Close();
//for compatibility with the older serialization method
if (ng.hstr == null)

View file

@ -119,6 +119,13 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="XmlModel\ExtendedField.cs" />
<Compile Include="XmlModel\HelpStorage.cs" />
<Compile Include="XmlModel\Method.cs" />
<Compile Include="XmlModel\SimpleField.cs" />
<Compile Include="XmlModel\SyntaxField.cs" />
<Compile Include="XmlModel\SyntaxNodeTags.cs" />
<Compile Include="XmlModel\SyntaxTagStorage.cs" />
<Content Include="App.ico" />
<Compile Include="AboutBox.cs">
<SubType>Form</SubType>
@ -151,6 +158,9 @@
<Compile Include="GrammarBrowser.Designer.cs">
<DependentUpon>GrammarBrowser.cs</DependentUpon>
</Compile>
<Compile Include="XmlModel\SyntaxNode.cs" />
<Compile Include="XmlModel\Settings.cs" />
<Compile Include="XmlModel\NodeGeneratorData.cs" />
<Compile Include="options_form.cs">
<SubType>Form</SubType>
</Compile>
@ -213,6 +223,7 @@
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>

View file

@ -53,7 +53,6 @@ G:\MMCS\Programming\PABC.NET_GitRepo\Utils\NodesGeneratorNew\NodesGenerator_old\
G:\MMCS\Programming\PascalABC.NET\Utils\NodesGeneratorNew\NodesGenerator_old\bin\Debug\NodesGenerator.exe.config
G:\MMCS\Programming\PascalABC.NET\Utils\NodesGeneratorNew\NodesGenerator_old\bin\Debug\NodesGenerator.exe
G:\MMCS\Programming\PascalABC.NET\Utils\NodesGeneratorNew\NodesGenerator_old\bin\Debug\NodesGenerator.pdb
G:\MMCS\Programming\PascalABC.NET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator_old.csprojResolveAssemblyReference.cache
G:\MMCS\Programming\PascalABC.NET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator.Form1.resources
G:\MMCS\Programming\PascalABC.NET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator.method_editor.resources
G:\MMCS\Programming\PascalABC.NET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator.node_def.resources
@ -63,3 +62,17 @@ G:\MMCS\Programming\PascalABC.NET\Utils\NodesGeneratorNew\NodesGenerator_old\obj
G:\MMCS\Programming\PascalABC.NET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator_old.csproj.GenerateResource.Cache
G:\MMCS\Programming\PascalABC.NET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator.exe
G:\MMCS\Programming\PascalABC.NET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator.pdb
G:\MMCS\Programming\PascalABC.NET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator_old.csprojResolveAssemblyReference.cache
G:\MMCS\Programming\PascalABCNET\Utils\NodesGeneratorNew\NodesGenerator_old\bin\Debug\NodesGenerator.exe.config
G:\MMCS\Programming\PascalABCNET\Utils\NodesGeneratorNew\NodesGenerator_old\bin\Debug\NodesGenerator.exe
G:\MMCS\Programming\PascalABCNET\Utils\NodesGeneratorNew\NodesGenerator_old\bin\Debug\NodesGenerator.pdb
G:\MMCS\Programming\PascalABCNET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator_old.csprojResolveAssemblyReference.cache
G:\MMCS\Programming\PascalABCNET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator.Form1.resources
G:\MMCS\Programming\PascalABCNET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator.method_editor.resources
G:\MMCS\Programming\PascalABCNET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator.node_def.resources
G:\MMCS\Programming\PascalABCNET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator.simple_node_editor.resources
G:\MMCS\Programming\PascalABCNET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator.subnode_editor.resources
G:\MMCS\Programming\PascalABCNET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator.template_form.resources
G:\MMCS\Programming\PascalABCNET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator_old.csproj.GenerateResource.Cache
G:\MMCS\Programming\PascalABCNET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator.exe
G:\MMCS\Programming\PascalABCNET\Utils\NodesGeneratorNew\NodesGenerator_old\obj\Debug\NodesGenerator.pdb

View file

@ -0,0 +1,43 @@
using NodeGenerator;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace NodesGenerator.XmlModel
{
public class ExtendedField : SimpleField
{
public ExtendedField() { }
public ExtendedField(extended_simple_element field)
: base(field)
{
CreateVariable = field.create_var;
DeleteVariable = field.delete_var;
}
public override node_field_info ToNodeFieldInfo(Dictionary<string, node_info> nodeNames)
{
var result = new extended_simple_element();
InitFieldInfo(result, nodeNames);
return result;
}
protected void InitFieldInfo(extended_simple_element nodeField, Dictionary<string, node_info> nodeNames)
{
var extendedField = nodeField as simple_element;
base.InitFieldInfo(extendedField, nodeNames);
nodeField.create_var = CreateVariable;
nodeField.delete_var = DeleteVariable;
}
[XmlAttribute]
public bool CreateVariable;
[XmlAttribute]
public bool DeleteVariable;
}
}

View file

@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace NodesGenerator.XmlModel
{
[Serializable]
public class HelpUnit
{
public HelpUnit() { }
public HelpUnit(string key, string value)
{
Key = key;
Value = value;
}
[XmlAttribute]
public string Key;
[XmlAttribute]
public string Value;
}
[Serializable]
public class HelpStorage
{
[XmlArrayItem("HelpData")]
public List<HelpUnit> HelpData = new List<HelpUnit>();
//public Dictionary<string, string> HelpData = new Dictionary<string, string>();
public HelpStorage() { }
public HelpStorage(NodeGenerator.HelpStorage storage)
{
foreach (var helpElementKey in storage.HelpData.Keys)
{
HelpData.Add(new HelpUnit(
helpElementKey as string,
(storage.HelpData[helpElementKey] as NodeGenerator.HelpContext).help_context));
}
}
public NodeGenerator.HelpStorage ToHelpStorage()
{
NodeGenerator.HelpStorage storage = new NodeGenerator.HelpStorage();
foreach (var helpElement in HelpData)
storage.add_context(helpElement.Key, new NodeGenerator.HelpContext() { help_context = helpElement.Value });
return storage;
}
}
}

View file

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace NodesGenerator.XmlModel
{
[Serializable]
public class Method
{
public Method() { }
public Method(string text)
{
Text = text;
}
public NodeGenerator.method_info ToMethodInfo()
{
return new NodeGenerator.method_info(Text);
}
[XmlElement]
public string Text;
}
}

View file

@ -0,0 +1,64 @@
using NodeGenerator;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using NodesGenerator;
namespace NodesGenerator.XmlModel
{
[XmlRoot]
public class NodeGeneratorData
{
public NodeGeneratorData() { }
public NodeGeneratorData(NodeGenerator.NodeGenerator nodeGenerator)
{
foreach (var node in nodeGenerator.all_nodes.Cast<node_info>())
SyntaxNodes.Add(new SyntaxNode(node));
Settings = new Settings(nodeGenerator);
TagCategories = nodeGenerator.tag_cats.Select(x => new FilterCategory(x)).ToList();
HelpStorage = new HelpStorage(nodeGenerator.help_storage);
}
[XmlArrayItem(typeof(SyntaxNode), ElementName = "SyntaxNode")]
public List<SyntaxNode> SyntaxNodes = new List<SyntaxNode>();
[XmlElement]
public Settings Settings;
[XmlArrayItem("FilterCategory")]
public List<FilterCategory> TagCategories = new List<FilterCategory>();
[XmlElement]
public HelpStorage HelpStorage;
public NodeGenerator.NodeGenerator ToNodeGenerator()
{
NodeGenerator.NodeGenerator generator = new NodeGenerator.NodeGenerator();
var nodeNames = new Dictionary<string, node_info>();
foreach (var node in SyntaxNodes)
nodeNames.Add(node.Name, new node_info());
foreach (var node in SyntaxNodes)
node.InitNodeInfo(nodeNames, nodeInfo: nodeNames[node.Name]);
var oldNodes = SyntaxNodes.Select(x => nodeNames[x.Name]).ToArray();
generator.set_nodes(oldNodes);
Settings.InitNodeGenerator(generator);
generator.tag_cats = TagCategories.Select(x => x.ToFilterCategory()).ToList();
generator.help_storage = HelpStorage.ToHelpStorage();
return generator;
}
}
}

View file

@ -0,0 +1,73 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace NodesGenerator.XmlModel
{
[Serializable]
public class Settings
{
public Settings() { }
public Settings(NodeGenerator.NodeGenerator generator)
{
FileName = generator.file_name;
NamespaceName = generator.namespace_name;
FactoryName = generator.factory_name;
VisitorInterfaceFileName = generator.visitor_interface_file_name;
PcuWriterName = generator.pcu_writer_name;
PcuWriterFileName = generator.pcu_writer_file_name;
PcuReaderName = generator.pcu_reader_name;
PcuReaderFileName = generator.pcu_reader_file_name;
PcuReaderFileNameHeader = generator.pcu_reader_file_name_h;
PcuReaderFileNameCpp = generator.pcu_reader_file_name_cpp;
}
public void InitNodeGenerator(NodeGenerator.NodeGenerator generator)
{
generator.file_name = FileName;
generator.namespace_name = NamespaceName;
generator.factory_name = FactoryName;
generator.visitor_interface_file_name = VisitorInterfaceFileName;
generator.pcu_writer_name = PcuWriterName;
generator.pcu_writer_file_name = PcuWriterFileName;
generator.pcu_reader_name = PcuReaderName;
generator.pcu_reader_file_name = PcuReaderFileName;
generator.pcu_reader_file_name_h = PcuReaderFileNameHeader;
generator.pcu_reader_file_name_cpp = PcuReaderFileNameCpp;
}
[XmlElement]
public string FileName;
[XmlElement]
public string NamespaceName;
[XmlElement]
public string FactoryName;
[XmlElement]
public string VisitorInterfaceFileName;
[XmlElement]
public string PcuWriterName;
[XmlElement]
public string PcuWriterFileName;
[XmlElement]
public string PcuReaderName;
[XmlElement]
public string PcuReaderFileName;
[XmlElement]
public string PcuReaderFileNameHeader;
[XmlElement]
public string PcuReaderFileNameCpp;
}
}

View file

@ -0,0 +1,38 @@
using NodeGenerator;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace NodesGenerator.XmlModel
{
public class SimpleField : SyntaxField
{
public SimpleField() { }
public SimpleField(simple_element field)
: base(field)
{
Type = field.val_field_type_name;
}
public override node_field_info ToNodeFieldInfo(Dictionary<string, node_info> nodeNames)
{
var result = new simple_element();
InitFieldInfo(result, nodeNames);
return result;
}
protected void InitFieldInfo(simple_element nodeField, Dictionary<string, node_info> nodeNames)
{
var simpleField = nodeField as node_field_info;
base.InitFieldInfo(simpleField, nodeNames);
nodeField.val_field_type_name = Type;
}
[XmlAttribute]
public string Type;
}
}

View file

@ -0,0 +1,41 @@
using NodeGenerator;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace NodesGenerator.XmlModel
{
[Serializable]
public class SyntaxField
{
public SyntaxField() { }
public SyntaxField(node_field_info field)
{
Name = field.field_name;
SyntaxType = field.field_type?.node_name;
}
public virtual node_field_info ToNodeFieldInfo(Dictionary<string, node_info> nodeNames)
{
var nodeField = new node_field_info();
InitFieldInfo(nodeField, nodeNames);
return nodeField;
}
protected void InitFieldInfo(node_field_info nodeField, Dictionary<string, node_info> nodeNames)
{
nodeField.field_name = Name;
nodeField.field_type = SyntaxType == null ? null : nodeNames[SyntaxType];
}
[XmlAttribute]
public string Name;
[XmlAttribute]
public string SyntaxType;
}
}

View file

@ -0,0 +1,63 @@
using NodeGenerator;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace NodesGenerator.XmlModel
{
[Serializable]
public class SyntaxNode
{
public SyntaxNode() { }
public SyntaxNode(node_info node)
{
Name = node.node_name;
BaseName = node?.base_class?.node_name;
foreach (var field in node.subnodes)
Fields.Add(field.XmlField());
Methods.AddRange(
node.methods.Select(
method => new Method(method.method_text)));
Tags = new SyntaxNodeTags(node.tags);
}
public node_info ToNodeInfo(Dictionary<string, node_info> nodeNames)
{
var result = new node_info();
InitNodeInfo(nodeNames, result);
return result;
}
public void InitNodeInfo(Dictionary<string, node_info> nodeNames, node_info nodeInfo)
{
nodeInfo.node_name = Name;
nodeInfo.base_class = BaseName == null ? null : nodeNames[BaseName];
foreach (var field in Fields)
nodeInfo.add_subnode(field.ToNodeFieldInfo(nodeNames));
nodeInfo.set_methods(Methods.Select(m => m.ToMethodInfo()).ToArray());
nodeInfo.tags = Tags.ToNodeInfoTags();
}
[XmlAttribute]
public string Name;
[XmlAttribute]
public string BaseName;
[XmlArrayItem(typeof(SyntaxField), ElementName = "SyntaxField")]
[XmlArrayItem(typeof(SimpleField), ElementName = "SimpleField")]
[XmlArrayItem(typeof(ExtendedField), ElementName = "ExtendedField")]
public List<SyntaxField> Fields = new List<SyntaxField>();
[XmlArrayItem(typeof(Method), ElementName = "Method")]
public List<Method> Methods = new List<Method>();
[XmlElement]
public SyntaxNodeTags Tags;
}
}

View file

@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace NodesGenerator.XmlModel
{
[Serializable]
public class SyntaxNodeTags
{
public SyntaxNodeTags() { }
public SyntaxNodeTags(List<Tuple<int, int>> tags)
{
tags.ForEach(t =>
{
CategoryIndices.Add(t.Item1);
TagIndices.Add(t.Item2);
});
}
public List<Tuple<int, int>> ToNodeInfoTags()
{
return CategoryIndices
.Zip(TagIndices, (category, tag) => new Tuple<int, int>(category, tag))
.ToList();
}
[XmlArrayItem("CategoryIndex")]
public List<int> CategoryIndices = new List<int>();
[XmlArrayItem("TagIndex")]
public List<int> TagIndices = new List<int>();
}
}

View file

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace NodesGenerator.XmlModel
{
[Serializable]
public class FilterTag
{
public FilterTag() { }
public FilterTag(NodeGenerator.FilterTag tag)
{
Name = tag.name;
ReferenceCount = tag.ref_count;
}
[XmlAttribute]
public string Name = "";
[XmlAttribute]
public int ReferenceCount = 0;
public override string ToString()
{
return Name;
}
}
[Serializable]
public class FilterCategory
{
public FilterCategory() { }
public FilterCategory(NodeGenerator.FilterCategory filter)
{
Name = filter.name;
Tags = filter.tags.Select(tag => new FilterTag(tag)).ToList();
}
public NodeGenerator.FilterCategory ToFilterCategory()
{
var result = new NodeGenerator.FilterCategory();
result.name = Name;
result.tags = Tags.Select(x => new NodeGenerator.FilterTag() { name = x.Name, ref_count = x.ReferenceCount }).ToList();
return result;
}
[XmlAttribute]
public string Name = "";
[XmlArrayItem("Tag")]
public List<FilterTag> Tags = new List<FilterTag>();
}
}