using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections.Generic;
namespace NodeGenerator
{
class text_consts
{
public class string_repl
{
public string_repl(string from,string to)
{
this.from=from;
this.to=to;
}
public string from;
public string to;
}
public static readonly string abstract_visitor_class_name = "AbstractVisitor";
public static readonly string abstract_visitor_file_name = abstract_visitor_class_name + ".cs";
public static readonly string space=" ";
public static readonly string semicolon=";";
public static readonly string namespace_keyword="namespace";
public static readonly string open_figure="{";
public static readonly string close_figure="}";
public static readonly string class_keyword="class";
public static readonly string underline="_";
public static readonly string public_keyword="public";
public static readonly string open_par="(";
public static readonly string close_par=")";
public static readonly string comma=",";
public static readonly string assign="=";
public static readonly string this_keyword="this";
public static readonly string dot=".";
public static readonly string create_word="create_";
public static readonly string static_keyword="static";
public static readonly string return_keyword="return";
public static readonly string new_keyword="new";
public static readonly string void_keyword="void";
public static readonly string visitor_interface_name="IVisitor";
public static readonly string visitor_name="visitor";
public static readonly string virtual_keyword="virtual";
public static readonly string visit_method_name="visit";
public static readonly string tab="\t";
public static readonly string tab2="\t\t";
public static readonly string nr="\r\n";
public static readonly string interface_keyword="interface";
public static readonly string colon=":";
public static readonly string override_keyword="override";
//ssyy
public static readonly string tab3 = "\t\t\t";
public static readonly string using_system = "using System;";
public static readonly string using_system_io = "using System.IO;";
public static readonly string base_tree_node_name = "syntax_tree_node";
public static readonly string source_context_name = "source_context";
public static readonly string source_context_class_name = "SourceContext";
public static readonly string file_position_class_name = "file_position";
public static readonly string begin_position_name = "begin_position";
public static readonly string end_position_name = "end_position";
public static readonly string column_num_name = "column_num";
public static readonly string line_num_name = "line_num";
public static readonly string count_name = "Count";
public static readonly string BinaryWriter_classname = "BinaryWriter";
public static readonly string BinaryReader_classname = "BinaryReader";
public static readonly string nodes_construct_method = "_construct_node";
public static readonly string nodes_read_method = "_read_node";
public static readonly string as_keyword = "as";
public static readonly string switch_keyword_name = "switch";
public static readonly string case_keyword_name = "case";
public static readonly string break_keyword_name = "break";
public static readonly string if_keyword_name = "if";
public static readonly string else_keyword_name = "else";
public static readonly string equal_keyword_name = "==";
public static readonly string not_equal_keyword_name = "!=";
public static readonly string null_keyword_name = "null";
public static readonly string cpp_null_keyword_name = "NULL";
public static readonly string for_keyword_name = "for";
public static readonly string less_keyword_name = "<";
public static readonly string greater_keyword_name = ">";
public static readonly string increment_keyword_name = "++";
public static readonly string open_qbracket = "[";
public static readonly string close_qbracket = "]";
public static readonly string i0_keyword_name = "0";
public static readonly string i1_keyword_name = "1";
public static readonly string im1_keyword_name = "-1";
public static readonly string temp_beg = "ssyy_beg";
public static readonly string temp_end = "ssyy_end";
public static readonly string cycle_i_name = "ssyy_i";
public static readonly string cycle_j_name = "ssyy_j";
public static readonly string temp_count_name = "ssyy_count";
public static readonly string temp_node_name = "ssyy_tmp";
public static readonly string param_number_name = "node_class_number";
public static readonly string writer_name = "bw";
public static readonly string reader_name = "br";
public static readonly string write_proc_name = "Write";
public static readonly string add_proc_name = "Add";
public static readonly string write_prefix = "write_";
public static readonly string read_prefix = "read_";
public static readonly string string_type_name = "string";
public static readonly string int16_type_name = "Int16";
public static readonly string int32_type_name = "Int32";
public static readonly string int64_type_name = "Int64";
public static readonly string uint64_type_name = "UInt64";
public static readonly string bool_type_name = "bool";
public static readonly string char_type_name = "char";
public static readonly string uchar_type_name = "unsigned char";
public static readonly string double_type_name = "double";
public static readonly string byte_type_name = "byte";
public static readonly string int16_type_name_cpp = "short";
public static readonly string int32_type_name_cpp = "int";
public static readonly string int64_type_name_cpp = "long";
public static readonly string uint64_type_name_cpp = "unsigned long";
public static readonly string read_byte_name = "ReadByte";
public static readonly string read_int16_name = "ReadInt16";
public static readonly string read_int32_name = "ReadInt32";
public static readonly string read_int64_name = "ReadInt64";
public static readonly string read_uint64_name = "ReadUInt64";
public static readonly string read_string_name = "ReadString";
public static readonly string read_bool_name = "ReadBoolean";
public static readonly string read_double_name = "ReadDouble";
public static readonly string read_char_name = "ReadChar";
public static readonly string cstring_type_name = "char*";
public static readonly string star = "*";
public static readonly string arrow = "->";
public static readonly string plus = "+";
public static readonly string address = "&";
public static readonly string colon2 = "::";
public static readonly string length_property_name = "Length";
public static readonly string CPP_reader_classname = "Reader";
public static readonly string ostream_classname = "ostream";
public static readonly string ostream_name = "*os";
public static readonly string cpp_short_name = "short";
public static readonly string GetChar_proc_name = "GetChar";
public static readonly string GetByte_proc_name = "GetByte";
public static readonly string GetShort_proc_name = "GetShort";
public static readonly string GetInt_proc_name = "GetInt";
public static readonly string GetString_proc_name = "GetString";
public static readonly string vector_name = "vector";
public static readonly string push_back_name = "push_back";
public static readonly string type_cast_name = "static_cast";
public static readonly string cross_platform_prefix = "CP";
public static readonly string visualizator_name = "TreePainter";
public static readonly string space_offset = "nspace";
public static readonly string base_space_count = "2";
public static readonly string inc_space = " += " + base_space_count;
public static readonly string dec_space = " -= " + base_space_count;
public static readonly string print_spaces_name = "PrintSpaces";
public static readonly string stream_out = "<<";
public static readonly string inverted_comma2 = "\"";
public static readonly string print_node_proc = "print_node";
public static readonly string endline_name = "endl";
public static readonly string count_string = "\" Count=\"";
public static readonly string size_proc_name = "size";
public static readonly string delete_keyword = "delete";
public static readonly string tilde = "~";
public static readonly string vector_classname = "vector";
public static readonly string iterator_name = "iterator";
public static readonly string begin_seq = "begin";
public static readonly string end_seq = "end";
//\ssyy
public static readonly string prop_template=
@" ///
///help_context
///
public property_type property_name
{
get
{
return field_name;
}
set
{
field_name=value;
}
}
";
public static readonly string field_template=
@" private field_type field_name;";
public static readonly string field_with_new_template=
@" private field_type field_name=new field_type();";
public static readonly string simple_constructor_template=
@" public class_name()
{
}
";
public static string change_word(string where,string from,string to)
{
Regex rg=new Regex(from);
return rg.Replace(where,to);
}
public static string change_word(string where,string_repl sr)
{
return change_word(where,sr.from,sr.to);
}
public static string change_words(string where,params string_repl[] sr_arr)
{
foreach(string_repl sr in sr_arr)
{
where=change_word(where,sr);
}
return where;
}
public static string create_property(string property_type,string property_name,string field_name,string help_context)
{
return change_words(prop_template,new string_repl("property_type",property_type),
new string_repl("property_name",property_name),new string_repl("field_name",field_name),
new string_repl("help_context",help_context));
}
public static string create_field(string field_type,string field_name)
{
return change_words(field_template,new string_repl("field_type",field_type),
new string_repl("field_name",field_name));
}
public static string create_field_with_new(string field_type,string field_name)
{
return change_words(field_with_new_template,new string_repl("field_type",field_type),
new string_repl("field_name",field_name));
}
public static string create_simple_constructor(string class_name)
{
return change_words(simple_constructor_template,new string_repl("class_name",class_name));
}
}
[Serializable]
public class HelpContext
{
private string _help_context="";
public string help_context
{
get
{
return _help_context;
}
set
{
_help_context=value;
}
}
}
[Serializable]
public class HelpStorage
{
private Hashtable ht=new Hashtable();
public void add_context(object ob,HelpContext hc)
{
ht.Add(ob,hc);
}
public HelpContext get_help_context(object key)
{
object o=ht[key];
if (o==null)
{
HelpContext hc=new HelpContext();
ht.Add(key,hc);
return hc;
}
return (o as HelpContext);
}
public static HelpStorage deserialize(string file_name)
{
HelpStorage hc;
BinaryFormatter formatter=new BinaryFormatter();
FileStream fs;
if (!File.Exists(file_name))
{
fs=File.Create(file_name);
hc=new HelpStorage();
formatter.Serialize(fs,hc);
fs.Flush();
fs.Close();
return hc;
}
fs=File.Open(file_name,FileMode.Open);
hc=(HelpStorage)formatter.Deserialize(fs);
fs.Close();
return hc;
}
public void serialize(string file_name)
{
FileStream fs=File.Create(file_name);
BinaryFormatter formatter=new BinaryFormatter();
formatter.Serialize(fs,this);
fs.Flush();
fs.Close();
}
}
[Serializable]
public class node_field_info
{
private string _field_name;
private node_info _field_type;
public string field_name
{
get
{
return _field_name;
}
set
{
_field_name=value;
}
}
public node_info field_type
{
get
{
return _field_type;
}
set
{
_field_type=value;
}
}
public override string ToString()
{
return (field_type.node_name+text_consts.space+field_name+text_consts.semicolon);
}
public string property_name
{
get
{
return field_name;
}
}
public string field_code_name
{
get
{
return (text_consts.underline+field_name);
}
}
public virtual string field_type_name
{
get
{
return field_type.node_name;
}
}
public void generate_code_property(StreamWriter sw,node_info ni,HelpStorage hst)
{
string prop=text_consts.create_property(field_type_name,property_name,field_code_name,
hst.get_help_context(ni.node_name+"."+field_name).help_context);
sw.WriteLine();
sw.WriteLine(prop);
sw.WriteLine();
}
public void generate_field_code(StreamWriter sw)
{
sw.WriteLine();
extended_simple_element ese=this as extended_simple_element;
bool created=false;
if (ese!=null)
{
if (ese.create_var)
{
sw.WriteLine(text_consts.create_field_with_new(field_type_name,field_code_name));
created=true;
}
}
if (!created)
{
sw.WriteLine(text_consts.create_field(field_type_name,field_code_name));
}
sw.WriteLine();
}
//ssyy
public void generate_cpp_field_code(StreamWriter sw, List destructor_code)
{
//sw.WriteLine();
extended_simple_element ese = this as extended_simple_element;
string f_name;
if (ese != null)
{
if (field_type_name == text_consts.string_type_name)
{
f_name = text_consts.cstring_type_name;
}
else
{
if (field_type_name == text_consts.int32_type_name)
{
f_name = text_consts.int32_type_name_cpp;
}
else
{
if (field_type_name == text_consts.int16_type_name)
{
f_name = text_consts.int16_type_name_cpp;
}
else
{
if (field_type_name == text_consts.int64_type_name)
{
f_name = text_consts.int64_type_name_cpp;
}
else
{
if (field_type_name == text_consts.uint64_type_name)
{
f_name = text_consts.uint64_type_name_cpp;
}
else
{
if (field_type_name == text_consts.source_context_class_name)
{
f_name = text_consts.source_context_class_name + text_consts.star;
}
else
{
f_name = field_type_name.Replace("List", "vector");
f_name = f_name.Replace(">", "*>*");
if (f_name.Length > 7 && f_name.Substring(0, 7) == "vector<")
{
string type_name = f_name.Substring(0, f_name.Length - 1);
//if (имя != NULL)
//{
// for (vector::iterator ssyy_j = имя->begin(); ssyy_j != имя->end(); ssyy_j++)
// {
// delete *ssyy_j;
// }
// delete имя;
//}
destructor_code.Add(text_consts.tab2 + text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + property_name + text_consts.space +
text_consts.not_equal_keyword_name + text_consts.space +
text_consts.cpp_null_keyword_name + text_consts.close_par);
destructor_code.Add(text_consts.tab2 + text_consts.open_figure);
destructor_code.Add(text_consts.tab2 + text_consts.tab + text_consts.for_keyword_name +
text_consts.space + text_consts.open_par + type_name + text_consts.colon2 +
text_consts.iterator_name + text_consts.space + text_consts.cycle_j_name +
text_consts.space + text_consts.assign + text_consts.space + property_name +
text_consts.arrow + text_consts.begin_seq + text_consts.open_par +
text_consts.close_par + text_consts.semicolon + text_consts.space +
text_consts.cycle_j_name + text_consts.space + text_consts.not_equal_keyword_name +
text_consts.space + property_name + text_consts.arrow + text_consts.end_seq +
text_consts.open_par + text_consts.close_par + text_consts.semicolon +
text_consts.space + text_consts.cycle_j_name + text_consts.increment_keyword_name +
text_consts.close_par);
destructor_code.Add(text_consts.tab2 + text_consts.tab + text_consts.open_figure);
destructor_code.Add(text_consts.tab3 + text_consts.tab + text_consts.delete_keyword +
text_consts.space + text_consts.star + text_consts.cycle_j_name +
text_consts.semicolon);
destructor_code.Add(text_consts.tab2 + text_consts.tab + text_consts.close_figure);
destructor_code.Add(text_consts.tab2 + text_consts.tab + text_consts.delete_keyword +
text_consts.space + property_name + text_consts.semicolon);
destructor_code.Add(text_consts.tab2 + text_consts.close_figure);
}
}
}
}
}
}
}
}
else
{
if (this is simple_element)
{
f_name = field_type_name;
}
else
{
f_name = field_type_name + '*';
destructor_code.Add(text_consts.tab3 + text_consts.delete_keyword +
text_consts.space + property_name + text_consts.semicolon);
}
}
sw.WriteLine(text_consts.tab2 + f_name + text_consts.space + property_name + text_consts.semicolon);
//sw.WriteLine();
}
//\ssyy
}
[Serializable]
public class simple_element:node_field_info
{
private string _field_type_name;
public string val_field_type_name
{
get
{
return _field_type_name;
}
set
{
_field_type_name=value;
}
}
public override string ToString()
{
return (this.field_type_name+text_consts.space+this.field_name);
}
public override string field_type_name
{
get
{
return val_field_type_name;
}
}
}
[Serializable]
public class extended_simple_element:simple_element
{
private bool _delete_var=false;
private bool _create_var=false;
public bool delete_var
{
get
{
return _delete_var;
}
set
{
_delete_var=value;
}
}
public bool create_var
{
get
{
return _create_var;
}
set
{
_create_var=value;
}
}
}
[Serializable]
public class node_info
{
private string _node_name;
private ArrayList _subnodes=new ArrayList();
private node_info _base_class;
public node_field_info[] subnodes
{
get
{
return ((node_field_info[])_subnodes.ToArray(typeof(node_field_info)));
}
}
public node_info base_class
{
get
{
return _base_class;
}
set
{
_base_class=value;
}
}
public string node_name
{
get
{
return _node_name;
}
set
{
_node_name=value;
}
}
public string creator_name
{
get
{
return text_consts.create_word+node_name;
}
}
public void set_subnodes(ICollection new_subnodes)
{
_subnodes.Clear();
_subnodes.AddRange(new_subnodes);
}
public void add_subnode(node_field_info nfi)
{
_subnodes.Add(nfi);
}
public override string ToString()
{
return node_name;
}
public void generate_simple_constructor_code(StreamWriter sw)
{
sw.WriteLine();
sw.WriteLine(@" ///");
sw.WriteLine(@" ///Конструктор без параметров.");
sw.WriteLine(@" ///");
sw.WriteLine(text_consts.create_simple_constructor(node_name));
sw.WriteLine();
}
private string subnode_variable(int i)
{
return (((node_field_info)_subnodes[i]).field_type_name+text_consts.space+
((node_field_info)_subnodes[i]).field_code_name);
}
public void generate_big_constructor_code(StreamWriter sw)
{
sw.WriteLine();
sw.WriteLine(@" ///");
sw.WriteLine(@" ///Конструктор с параметрами.");
sw.WriteLine(@" ///");
sw.Write(text_consts.tab+text_consts.tab+text_consts.public_keyword+text_consts.space+node_name+
text_consts.open_par);
for(int i=0;i<_subnodes.Count-1;i++)
{
sw.Write(subnode_variable(i)+text_consts.comma);
}
if (_subnodes.Count>0)
{
sw.Write(subnode_variable(_subnodes.Count-1));
}
sw.WriteLine(text_consts.close_par);
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.open_figure);
foreach(node_field_info nfi in _subnodes)
{
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.tab+text_consts.this_keyword+
text_consts.dot+nfi.field_code_name+text_consts.assign+
nfi.field_code_name+text_consts.semicolon);
}
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.close_figure);
sw.WriteLine();
}
public void generate_creator_method(StreamWriter sw)
{
sw.WriteLine();
sw.Write(text_consts.tab+text_consts.tab+text_consts.public_keyword+text_consts.space+
text_consts.static_keyword+text_consts.space+
node_name+text_consts.space+creator_name+text_consts.open_par);
for(int i=0;i<_subnodes.Count-1;i++)
{
sw.Write(subnode_variable(i)+text_consts.comma);
}
if (_subnodes.Count>0)
{
sw.Write(subnode_variable(_subnodes.Count-1));
}
sw.WriteLine(text_consts.close_par);
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.open_figure);
sw.Write(text_consts.tab+text_consts.tab+text_consts.tab+text_consts.return_keyword+
text_consts.space+text_consts.new_keyword+text_consts.space+
node_name+text_consts.open_par);
for(int i=0;i<_subnodes.Count-1;i++)
{
sw.Write(((node_field_info)_subnodes[i]).field_code_name+text_consts.comma);
}
if (_subnodes.Count>0)
{
sw.Write(((node_field_info)_subnodes[_subnodes.Count-1]).field_code_name);
}
sw.WriteLine(text_consts.close_par+text_consts.semicolon);
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.close_figure);
sw.WriteLine();
}
public void generate_visitor_node(StreamWriter sw)
{
sw.WriteLine();
sw.WriteLine(@" ///");
sw.WriteLine(@" ///Метод для обхода дерева посетителем");
sw.WriteLine(@" ///");
sw.WriteLine(@" ///Объект-посетитель.");
sw.WriteLine(@" ///Return value is void");
string pol_type="";
if (base_class!=null)
{
pol_type=text_consts.override_keyword;
}
else
{
pol_type=text_consts.virtual_keyword;
}
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.public_keyword+text_consts.space+
pol_type+text_consts.space+
text_consts.void_keyword+text_consts.space+text_consts.visit_method_name+text_consts.open_par+
text_consts.visitor_interface_name+text_consts.space+text_consts.visitor_name+text_consts.close_par);
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.open_figure);
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.tab+text_consts.visitor_name+
text_consts.dot+text_consts.visit_method_name+
text_consts.open_par+text_consts.this_keyword+text_consts.close_par+text_consts.semicolon);
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.close_figure);
sw.WriteLine();
}
public void generate_visitor_node_cpp(StreamWriter sw)
{
sw.WriteLine();
sw.WriteLine(@" ///");
sw.WriteLine(@" ///Метод для обхода дерева посетителем");
sw.WriteLine(@" ///");
sw.WriteLine(@" ///Объект-посетитель.");
sw.WriteLine(@" ///Return value is void");
string pol_type = "";
if (base_class == null)
{
pol_type = text_consts.virtual_keyword + text_consts.space;
}
sw.WriteLine(text_consts.tab + text_consts.tab + pol_type +
text_consts.void_keyword + text_consts.space + text_consts.visit_method_name + text_consts.open_par +
text_consts.abstract_visitor_class_name + text_consts.star + text_consts.space + text_consts.visitor_name + text_consts.close_par);
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.tab + text_consts.visitor_name +
text_consts.arrow + text_consts.visit_method_name +
text_consts.open_par + text_consts.this_keyword + text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.close_figure);
sw.WriteLine();
}
public void genrate_summury_comment_for_interface_method(StreamWriter sw)
{
sw.WriteLine(@" ///");
sw.WriteLine(@" ///Method to visit "+this.node_name+".");
sw.WriteLine(@" ///");
sw.WriteLine(@" ///"+"Node to visit"+@"");
sw.WriteLine(@" /// Return value is void ");
}
public void generate_visit_method_for_interface(StreamWriter sw)
{
sw.WriteLine();
genrate_summury_comment_for_interface_method(sw);
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.void_keyword+text_consts.space+
text_consts.visit_method_name+text_consts.open_par+
node_name+text_consts.space+text_consts.underline+node_name+text_consts.close_par+text_consts.semicolon);
sw.WriteLine();
}
public void generate_visit_method_cpp(StreamWriter sw)
{
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.virtual_keyword + text_consts.space + text_consts.void_keyword + text_consts.space +
text_consts.visit_method_name + text_consts.open_par +
node_name + text_consts.star + text_consts.space + node_name + text_consts.close_par +
text_consts.open_figure + text_consts.close_figure);
}
public void generate_visit_method_for_abstract_visitor(StreamWriter sw)
{
sw.WriteLine();
//genrate_summury_comment_for_interface_method(sw);
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.public_keyword + text_consts.space+ text_consts.virtual_keyword + text_consts.space + text_consts.void_keyword + text_consts.space +
text_consts.visit_method_name + text_consts.open_par +
node_name + text_consts.space + text_consts.underline + node_name + text_consts.close_par);
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.close_figure);
//sw.WriteLine();
}
public void generate_visit_method(StreamWriter sw)
{
sw.WriteLine();
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.public_keyword+
text_consts.space+text_consts.void_keyword+text_consts.space+text_consts.visit_method_name+
text_consts.open_par+node_name+text_consts.space+text_consts.underline+node_name+text_consts.close_par);
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.open_figure);
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.tab);
sw.WriteLine(text_consts.tab+text_consts.tab+text_consts.close_figure);
sw.WriteLine();
}
public void generate_painter(StreamWriter sw_h, StreamWriter sw_cpp)
{
//Пишем процедуру visit для данного типа узла
//void visit(имя_узла *_имя_узла);
//void Painter::visit(имя_узла *_имя_узла)
//{
// PrintSpaces();
// *os<<тип_узла<(_<имя_типа>);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.write_prefix + base_class.node_name +
text_consts.open_par + text_consts.underline +
node_name + text_consts.close_par + text_consts.semicolon);
}
//Пишем поля объекта
foreach (node_field_info nfi in _subnodes)
{
simple_element se = nfi as simple_element;
//Если поле не является узлом дерева
if (se != null)
{
//Получаем имя типа поля
string tname = se.val_field_type_name;//.ToLower();
if (tname.Length > 4 && tname.Substring(0, 5) == "List<")
{
//пишем:
//if (<параметр_visit>-><имя_поля> != null)
//{
// PrintSpaces();
// *os<<имя_узла<<" Count="<<_параметр_visit->имя_узла->size()<имя_узла->size(); ssyy_i++)
// {
// PrintSpaces();
// *os<<"["<имя_узла))[i]);
// }
//}
sw_cpp.WriteLine(text_consts.tab2 + text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.underline + node_name +
text_consts.arrow + nfi.field_name + text_consts.space +
text_consts.not_equal_keyword_name + text_consts.space + text_consts.cpp_null_keyword_name +
text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.print_spaces_name +
text_consts.open_par + text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.ostream_name + text_consts.stream_out +
text_consts.inverted_comma2 + nfi.field_name + text_consts.inverted_comma2 +
text_consts.stream_out + text_consts.count_string + text_consts.stream_out +
text_consts.underline + node_name + text_consts.arrow + nfi.field_name + text_consts.arrow +
text_consts.size_proc_name + text_consts.open_par + text_consts.close_par +
text_consts.stream_out + text_consts.endline_name + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.for_keyword_name +
text_consts.open_par + text_consts.int32_type_name_cpp +
text_consts.space + text_consts.cycle_i_name +
text_consts.space + text_consts.assign +
text_consts.space + text_consts.i0_keyword_name +
text_consts.semicolon + text_consts.space +
text_consts.cycle_i_name + text_consts.space +
text_consts.less_keyword_name + text_consts.space +
text_consts.underline + node_name +
text_consts.arrow + nfi.field_name +
text_consts.arrow + text_consts.size_proc_name + text_consts.open_par + text_consts.close_par +
text_consts.semicolon + text_consts.space +
text_consts.cycle_i_name + text_consts.increment_keyword_name +
text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.print_spaces_name +
text_consts.open_par + text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.ostream_name +
text_consts.stream_out + text_consts.inverted_comma2 + text_consts.open_qbracket +
text_consts.inverted_comma2 + text_consts.stream_out + text_consts.cycle_i_name +
text_consts.stream_out + text_consts.inverted_comma2 + text_consts.close_qbracket +
text_consts.inverted_comma2 + text_consts.stream_out + text_consts.endline_name +
text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.print_node_proc +
text_consts.open_par + text_consts.open_par + text_consts.star +
text_consts.open_par +
text_consts.underline + node_name + text_consts.arrow + nfi.field_name +
text_consts.close_par +
text_consts.close_par +
text_consts.open_qbracket + text_consts.cycle_i_name + text_consts.close_qbracket +
text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.close_figure);
}
else
if (tname == text_consts.string_type_name) //к сожалению, у нас это иногда null
{
//if (<параметр>-><имя_поля> != null)
//{
// PrintSpaces();
// *os<<"имя_узла="<<<параметр>-><имя_поля><-><имя_поля><-><имя_поля>);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.print_spaces_name +
text_consts.open_par + text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.ostream_name +
text_consts.stream_out + text_consts.inverted_comma2 + nfi.field_name +
text_consts.inverted_comma2 +
text_consts.stream_out +
text_consts.inverted_comma2 + text_consts.colon + text_consts.inverted_comma2 +
text_consts.stream_out +
text_consts.endline_name +
text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.print_node_proc +
text_consts.open_par + text_consts.underline + node_name +
text_consts.arrow + nfi.field_name + text_consts.close_par +
text_consts.semicolon);
}
}
}
sw_cpp.WriteLine(text_consts.tab + text_consts.close_figure);
sw_cpp.WriteLine();
}
//ssyy
//number - номер узла в общем списке
public void generate_pcu_writer(StreamWriter sw, int number, bool cross_platform)
{
//пишем
//public void visit(<имя_типа> _<имя_типа>)
//{
// sw.Write((Int16)<номер_типа_узла>);
// write_<имя типа>(_<имя типа>);
//}
sw.WriteLine();
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.public_keyword +
text_consts.space + text_consts.void_keyword + text_consts.space + text_consts.visit_method_name +
text_consts.open_par + node_name + text_consts.space + text_consts.underline + node_name + text_consts.close_par);
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par +
text_consts.int16_type_name + text_consts.close_par +
number.ToString() + text_consts.close_par +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.write_prefix + node_name +
text_consts.open_par + text_consts.underline + node_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.close_figure);
sw.WriteLine();
//Пишем процедуру write для данного типа узла
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.public_keyword +
text_consts.space + text_consts.void_keyword + text_consts.space +
text_consts.write_prefix + node_name +
text_consts.open_par + node_name + text_consts.space +
text_consts.underline + node_name + text_consts.close_par);
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.open_figure);
if (node_name == text_consts.base_tree_node_name)
{
//пишем
//if (_<имя_типа>.SourceContext == null)
//{
// sw.Write((byte)0);
//}
//else
//{
// sw.Write((byte)1);
// if (_<имя_типа>.SourceContext.begin_position == null)
// {
// sw.Write((byte)0);
// }
// else
// {
// sw.Write((byte)1);
// sw.Write(_<имя_типа>.SourceContext.begin_position.line_num);
// sw.Write(_<имя_типа>.SourceContext.begin_position.column_num);
// }
// if (_<имя_типа>.SourceContext.end_position == null)
// {
// sw.Write((byte)0);
// }
// else
// {
// sw.Write((byte)1);
// sw.Write(_<имя_типа>.SourceContext.end_position.line_num);
// sw.Write(_<имя_типа>.SourceContext.end_position.column_num);
// }
//}
sw.WriteLine(text_consts.tab3 + text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.underline + node_name +
text_consts.dot + text_consts.source_context_name + text_consts.space +
text_consts.equal_keyword_name + text_consts.space + text_consts.null_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i0_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.else_keyword_name);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i1_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.underline + node_name +
text_consts.dot + text_consts.source_context_name +
text_consts.dot + text_consts.begin_position_name + text_consts.space +
text_consts.equal_keyword_name + text_consts.space + text_consts.null_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i0_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.else_keyword_name);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i1_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab2 + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.underline + node_name +
text_consts.dot + text_consts.source_context_name +
text_consts.dot + text_consts.begin_position_name + text_consts.dot +
text_consts.line_num_name + text_consts.close_par +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab2 + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.underline + node_name +
text_consts.dot + text_consts.source_context_name +
text_consts.dot + text_consts.begin_position_name + text_consts.dot +
text_consts.column_num_name + text_consts.close_par +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.underline + node_name +
text_consts.dot + text_consts.source_context_name +
text_consts.dot + text_consts.end_position_name + text_consts.space +
text_consts.equal_keyword_name + text_consts.space + text_consts.null_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i0_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.else_keyword_name);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i1_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab2 + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.underline + node_name +
text_consts.dot + text_consts.source_context_name +
text_consts.dot + text_consts.end_position_name + text_consts.dot +
text_consts.line_num_name + text_consts.close_par +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab2 + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.underline + node_name +
text_consts.dot + text_consts.source_context_name +
text_consts.dot + text_consts.end_position_name + text_consts.dot +
text_consts.column_num_name + text_consts.close_par +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
}
else
{
//if (base_class != null) //(ssyy) Все должны быть наследниками syntax_tree_node
{
//Пишем вызов сериализации полей предка
//write_<имя_типа_предка>(_<имя_типа>);
sw.WriteLine(text_consts.tab3 + text_consts.write_prefix + base_class.node_name +
text_consts.open_par + text_consts.underline +
node_name + text_consts.close_par + text_consts.semicolon);
}
//Пишем поля объекта
foreach (node_field_info nfi in _subnodes)
{
simple_element se = nfi as simple_element;
//Если поле не является узлом дерева
if (se != null)
{
//Получаем имя типа поля
string tname = se.val_field_type_name;//.ToLower();
if (tname.Length > 4 && tname.Substring(0, 5) == "List<")
{
//пишем:
//if (<параметр_visit>.<имя_поля> == null)
//{
// sw.Write((byte)0);
//}
//else
//{
// sw.Write((byte)1);
// sw.Write(<параметр_visit>.<имя_поля>.Count);
// for(int ssyy_i = 0; ssyy_i < <параметр_visit>.<имя_поля>.Count; ssyy_i++)
// {
// if (<параметр_visit>.<имя_поля>[ssyy_i] == null)
// {
// sw.Write((byte)0);
// }
// else
// {
// sw.Write((byte)1);
// <параметр_visit>.имя_поля[ssyy_i].visit(this);
// }
// }
//}
sw.WriteLine(text_consts.tab3 + text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.underline + node_name +
text_consts.dot + nfi.field_name + text_consts.space +
text_consts.equal_keyword_name + text_consts.space + text_consts.null_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i0_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.else_keyword_name);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i1_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.underline + node_name +
text_consts.dot + nfi.field_name +
text_consts.dot + text_consts.count_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.for_keyword_name +
text_consts.open_par + text_consts.int32_type_name +
text_consts.space + text_consts.cycle_i_name +
text_consts.space + text_consts.assign +
text_consts.space + text_consts.i0_keyword_name +
text_consts.semicolon + text_consts.space +
text_consts.cycle_i_name + text_consts.space +
text_consts.less_keyword_name + text_consts.space +
text_consts.underline + node_name +
text_consts.dot + nfi.field_name +
text_consts.dot + text_consts.count_name +
text_consts.semicolon + text_consts.space +
text_consts.cycle_i_name + text_consts.increment_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.tab +
text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.underline + node_name +
text_consts.dot + nfi.field_name + text_consts.open_qbracket +
text_consts.cycle_i_name + text_consts.close_qbracket +
text_consts.space +
text_consts.equal_keyword_name + text_consts.space + text_consts.null_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.tab + text_consts.tab +
text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i0_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.tab + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.tab + text_consts.else_keyword_name);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.tab + text_consts.tab +
text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i1_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.tab + text_consts.tab +
text_consts.underline + node_name
+ text_consts.dot + nfi.field_name +
text_consts.open_qbracket + text_consts.cycle_i_name +
text_consts.close_qbracket + text_consts.dot +
text_consts.visit_method_name +
text_consts.open_par + text_consts.this_keyword +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.tab + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
}
else
if (tname == text_consts.string_type_name) //к сожалению, у нас это иногда null
{
//if (<параметр>.<имя_поля> == null)
//{
// sw.Write((byte)0);
//}
//else
//{
// sw.Write((byte)1);
// sw.Write(<параметр>.<имя_поля>); //Для .NET
//}
//Для кроссплатформенных:
// sw.Write(<параметр>.<имя_поля>.Length + 1);
// for(int ssyy_i = 0; i < <параметр>.<имя_поля>.Length; i++)
// {
// sw.Write(<параметр>.<имя_поля>[ssyy_i]);
// }
// sw.Write((byte)0); //Последний символ
sw.WriteLine(text_consts.tab3 + text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.underline + node_name +
text_consts.dot + nfi.field_name + text_consts.space +
text_consts.equal_keyword_name + text_consts.space + text_consts.null_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i0_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.else_keyword_name);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i1_keyword_name +
text_consts.close_par + text_consts.semicolon);
if (!cross_platform)
{
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.underline + node_name + text_consts.dot +
se.field_name + text_consts.close_par +
text_consts.semicolon);
}
else
{
//Пишем для последующего чтения в C-строку, т.е. в char*
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.underline + node_name + text_consts.dot +
se.field_name + text_consts.dot + text_consts.length_property_name +
text_consts.space + text_consts.plus + text_consts.space +
text_consts.i1_keyword_name + text_consts.close_par +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.for_keyword_name +
text_consts.open_par + text_consts.int32_type_name +
text_consts.space + text_consts.cycle_i_name +
text_consts.space + text_consts.assign +
text_consts.space + text_consts.i0_keyword_name +
text_consts.semicolon + text_consts.space +
text_consts.cycle_i_name + text_consts.space +
text_consts.less_keyword_name + text_consts.space + text_consts.underline + node_name +
text_consts.dot + nfi.field_name +
text_consts.dot + text_consts.length_property_name +
text_consts.semicolon + text_consts.space +
text_consts.cycle_i_name + text_consts.increment_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab2 +
text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.underline + node_name + text_consts.dot + nfi.field_name +
text_consts.open_qbracket + text_consts.cycle_i_name +
text_consts.close_qbracket + text_consts.close_par +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i0_keyword_name +
text_consts.close_par + text_consts.semicolon);
}
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
}
else
if (tname == text_consts.bool_type_name && cross_platform)
{
//if (_<параметр>.<имя_поля>)
//{
// sw.Write((byte)1);
//}
//else
//{
// sw.Write((byte)0);
//}
sw.WriteLine(text_consts.tab3 + text_consts.if_keyword_name +
text_consts.space + text_consts.open_par +
text_consts.underline + node_name +
text_consts.dot + se.field_name + text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i1_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i0_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
}
else
if (tname == text_consts.int32_type_name ||
tname == text_consts.int64_type_name ||
tname == text_consts.uint64_type_name ||
tname == text_consts.double_type_name ||
tname == text_consts.bool_type_name ||
tname == text_consts.char_type_name)
{
//пишем: sw.Write(<параметр>.<имя_поля>);
sw.WriteLine(text_consts.tab3 + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.underline + node_name + text_consts.dot +
se.field_name + text_consts.close_par +
text_consts.semicolon);
}
else
{
sw.WriteLine(text_consts.tab3 + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.underline +
node_name + text_consts.dot + se.field_name +
text_consts.close_par + text_consts.semicolon);
}
}
else
{
//пишем:
//if (<параметр_visit>.<имя_поля> == null)
//{
// sw.Write((byte)0);
//}
//else
//{
// sw.Write((byte)1);
// <параметр_visit>.<имя_поля>.visit(this);
//}
sw.WriteLine(text_consts.tab3 + text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.underline + node_name +
text_consts.dot + nfi.field_name + text_consts.space +
text_consts.equal_keyword_name + text_consts.space + text_consts.null_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i0_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.else_keyword_name);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.writer_name + text_consts.dot +
text_consts.write_proc_name + text_consts.open_par +
text_consts.open_par + text_consts.byte_type_name +
text_consts.close_par + text_consts.i1_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.underline + node_name
+ text_consts.dot + nfi.field_name + text_consts.dot +
text_consts.visit_method_name +
text_consts.open_par + text_consts.this_keyword +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
}
}
}
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.close_figure);
sw.WriteLine();
}
public void generate_stream_reader_cpp(StreamWriter sw_h, StreamWriter sw_cpp, string pcu_reader_name)
{
//пишем
//void visit(<имя_типа> *_<имя_типа>)
//{
// read_<имя типа>(_<имя типа>);
//}
sw_h.WriteLine();
sw_h.WriteLine(text_consts.tab + text_consts.tab +
text_consts.void_keyword + text_consts.space + text_consts.visit_method_name +
text_consts.open_par + node_name + text_consts.space + text_consts.star +
text_consts.underline + node_name + text_consts.close_par);
sw_h.WriteLine(text_consts.tab + text_consts.tab + text_consts.open_figure);
sw_h.WriteLine(text_consts.tab3 + text_consts.read_prefix + node_name +
text_consts.open_par + text_consts.underline + node_name +
text_consts.close_par + text_consts.semicolon);
sw_h.WriteLine(text_consts.tab + text_consts.tab + text_consts.close_figure);
//пишем процедуру чтения данного типа
sw_h.WriteLine(text_consts.tab + text_consts.tab +
text_consts.void_keyword + text_consts.space +
text_consts.read_prefix + node_name +
text_consts.open_par + node_name + text_consts.space + text_consts.star +
text_consts.underline + node_name + text_consts.close_par +
text_consts.semicolon);
sw_cpp.WriteLine();
sw_cpp.WriteLine(text_consts.tab +
text_consts.void_keyword + text_consts.space +
pcu_reader_name + text_consts.colon2 +
text_consts.read_prefix + node_name +
text_consts.open_par + node_name + text_consts.space + text_consts.star +
text_consts.underline + node_name + text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab + text_consts.open_figure);
//Пишем процедуру чтения полей для данного типа узла
if (node_name == text_consts.base_tree_node_name)
{
//пишем
//if (br.GetChar() == 0)
//{
// _<имя_типа>->source_context = NULL;
//}
//else
//{
// SourceContext *ssyy_beg = NULL;
// SourceContext *ssyy_end = NULL;
// if (br.GetChar() == 1)
// {
// ssyy_beg = new SourceContext(br.GetInt(), br.GetInt(), 0, 0);
// }
// if (br.GetChar() == 1)
// {
// ssyy_end = new SourceContext(0, 0, br.GetInt(), br.GetInt());
// }
// _<имя_типа>->source_context = new SourceContext(ssyy_beg, ssyy_end);
//}
sw_cpp.WriteLine(text_consts.tab2 + text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.reader_name +
text_consts.dot + text_consts.GetChar_proc_name +
text_consts.open_par + text_consts.close_par +
text_consts.space + text_consts.equal_keyword_name +
text_consts.space + text_consts.i0_keyword_name +
text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.underline +
node_name + text_consts.arrow + text_consts.source_context_name +
text_consts.space + text_consts.assign + text_consts.space +
text_consts.cpp_null_keyword_name + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.close_figure);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.else_keyword_name);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab3 +
text_consts.source_context_class_name + text_consts.space +
text_consts.star +
text_consts.temp_beg + text_consts.space + text_consts.assign +
text_consts.space + text_consts.cpp_null_keyword_name +
text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab3 +
text_consts.source_context_class_name + text_consts.space +
text_consts.star +
text_consts.temp_end + text_consts.space + text_consts.assign +
text_consts.space + text_consts.cpp_null_keyword_name +
text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab3 +
text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.reader_name +
text_consts.dot + text_consts.GetChar_proc_name +
text_consts.open_par + text_consts.close_par +
text_consts.space + text_consts.equal_keyword_name +
text_consts.space + text_consts.i1_keyword_name +
text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.temp_beg + text_consts.space + text_consts.assign +
text_consts.space + text_consts.new_keyword +
text_consts.space + text_consts.source_context_class_name +
text_consts.open_par + text_consts.reader_name +
text_consts.dot + text_consts.GetInt_proc_name +
text_consts.open_par + text_consts.close_par +
text_consts.comma + text_consts.space +
text_consts.reader_name +
text_consts.dot + text_consts.GetInt_proc_name +
text_consts.open_par + text_consts.close_par +
text_consts.comma + text_consts.space + text_consts.i0_keyword_name +
text_consts.comma + text_consts.space + text_consts.i0_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw_cpp.WriteLine(text_consts.tab3 +
text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.reader_name +
text_consts.dot + text_consts.GetChar_proc_name +
text_consts.open_par + text_consts.close_par +
text_consts.space + text_consts.equal_keyword_name +
text_consts.space + text_consts.i1_keyword_name +
text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.temp_end + text_consts.space + text_consts.assign +
text_consts.space + text_consts.new_keyword +
text_consts.space + text_consts.source_context_class_name +
text_consts.open_par +
text_consts.i0_keyword_name +
text_consts.comma + text_consts.space + text_consts.i0_keyword_name +
text_consts.comma + text_consts.space + text_consts.reader_name +
text_consts.dot + text_consts.GetInt_proc_name +
text_consts.open_par + text_consts.close_par +
text_consts.comma + text_consts.space +
text_consts.reader_name +
text_consts.dot + text_consts.GetInt_proc_name +
text_consts.open_par + text_consts.close_par +
text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.underline +
node_name + text_consts.arrow + text_consts.source_context_name +
text_consts.space + text_consts.assign + text_consts.space +
text_consts.new_keyword + text_consts.space +
text_consts.source_context_class_name + text_consts.open_par +
text_consts.temp_beg + text_consts.comma +
text_consts.space + text_consts.temp_end +
text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.close_figure);
}
else
{
//if (base_class != null) //(ssyy) Все должны быть наследниками tree_node
{
//Пишем вызов десериализации полей предка
//read_<имя_типа_предка>(_<имя_типа>);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.read_prefix + base_class.node_name +
text_consts.open_par + text_consts.underline +
node_name + text_consts.close_par + text_consts.semicolon);
}
//Пишем поля объекта
foreach (node_field_info nfi in _subnodes)
{
simple_element se = nfi as simple_element;
string write_proc_string = "";
//Если поле не является узлом дерева
if (se != null)
{
//Получаем имя типа поля
string tname = se.val_field_type_name;//.ToLower();
if (tname.Length > 5 && tname.Substring(0, 5) == "List<")
{
//пишем:
//if (br.GetChar() == 0)
//{
// <параметр_visit>-><имя_поля> = NULL;
//}
//else
//{
// <параметр_visit>-><имя_поля> = new vector<параметр_List*>();
// int ssyy_count = br.GetInt();
// for(int ssyy_i = 0; ssyy_i < ssyy_count; ssyy_i++)
// {
// <параметр_visit>-><имя_поля>.push_back(static_cast<параметр_List*>(read_node()));
// }
//}
string list_param = tname.Substring(5, tname.Length - 6);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.reader_name +
text_consts.dot + text_consts.GetChar_proc_name +
text_consts.open_par + text_consts.close_par +
text_consts.space + text_consts.equal_keyword_name +
text_consts.space + text_consts.i0_keyword_name +
text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.tab + text_consts.underline +
node_name + text_consts.arrow + nfi.field_name +
text_consts.space + text_consts.assign + text_consts.space +
text_consts.cpp_null_keyword_name + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.close_figure);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.else_keyword_name);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.underline +
node_name + text_consts.arrow + nfi.field_name +
text_consts.space + text_consts.assign + text_consts.space +
text_consts.new_keyword + text_consts.space +
text_consts.vector_name + text_consts.less_keyword_name +
list_param + text_consts.star + text_consts.greater_keyword_name +
text_consts.open_par + text_consts.close_par +
text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab3 +
text_consts.int32_type_name_cpp + text_consts.space +
text_consts.temp_count_name + text_consts.space +
text_consts.assign + text_consts.space +
text_consts.reader_name + text_consts.dot +
text_consts.GetInt_proc_name + text_consts.open_par +
text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.for_keyword_name +
text_consts.open_par + text_consts.int32_type_name_cpp +
text_consts.space + text_consts.cycle_i_name +
text_consts.space + text_consts.assign +
text_consts.space + text_consts.i0_keyword_name +
text_consts.semicolon + text_consts.space +
text_consts.cycle_i_name + text_consts.space +
text_consts.less_keyword_name + text_consts.space +
text_consts.temp_count_name +
text_consts.semicolon + text_consts.space +
text_consts.cycle_i_name + text_consts.increment_keyword_name +
text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.underline +
node_name + text_consts.arrow + nfi.field_name +
text_consts.arrow + text_consts.push_back_name +
text_consts.open_par +
text_consts.type_cast_name + text_consts.less_keyword_name +
list_param + text_consts.star + text_consts.greater_keyword_name +
text_consts.open_par +
text_consts.nodes_read_method +
text_consts.open_par + text_consts.close_par +
text_consts.close_par + text_consts.close_par +
text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.close_figure);
}
else
{
if (tname == text_consts.string_type_name)
{
//if (br.GetChar() == 0)
//{
// <параметр_visit>-><имя_поля> = NULL;
//}
//else
//{
// <параметр_visit>-><имя_поля> = br.GetString();
//}
sw_cpp.WriteLine(text_consts.tab2 + text_consts.if_keyword_name +
text_consts.space + text_consts.open_par +
text_consts.reader_name + text_consts.dot +
text_consts.GetChar_proc_name + text_consts.open_par +
text_consts.close_par + text_consts.space +
text_consts.equal_keyword_name + text_consts.space +
text_consts.i0_keyword_name + text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab3 +
text_consts.underline + node_name +
text_consts.arrow + nfi.field_name + text_consts.space +
text_consts.assign + text_consts.space + text_consts.cpp_null_keyword_name +
text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.close_figure);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.else_keyword_name);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab3 +
text_consts.underline + node_name +
text_consts.arrow + nfi.field_name + text_consts.space +
text_consts.assign + text_consts.space +
text_consts.reader_name + text_consts.dot +
text_consts.GetString_proc_name + text_consts.open_par +
text_consts.close_par +
text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.close_figure);
}
//простые типы - обрабатываются схожим образом:
else
{
if (tname == text_consts.int32_type_name)
{
write_proc_string = text_consts.read_int32_name;
}
else
if (tname == text_consts.int64_type_name)
{
write_proc_string = text_consts.read_int64_name;
}
else
if (tname == text_consts.uint64_type_name)
{
write_proc_string = text_consts.read_uint64_name;
}
else
if (tname == text_consts.double_type_name)
{
write_proc_string = text_consts.read_double_name;
}
else
if (tname == text_consts.bool_type_name)
{
write_proc_string = text_consts.read_bool_name;
}
else
if (tname == text_consts.char_type_name)
{
write_proc_string = text_consts.read_char_name;
}
if (write_proc_string != "")
{
//br.Read...(&<параметр_visit>-><имя_поля>);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.reader_name +
text_consts.dot + write_proc_string +
text_consts.open_par + text_consts.address +
text_consts.underline +
node_name + text_consts.arrow + nfi.field_name +
text_consts.close_par + text_consts.semicolon);
}
else
{
//<параметр_visit>-><имя_поля> = (<тип_поля>)br.GetByte();
sw_cpp.WriteLine(text_consts.tab2 + text_consts.underline +
node_name + text_consts.arrow + nfi.field_name +
text_consts.space + text_consts.assign +
text_consts.space +
text_consts.open_par + nfi.field_type_name + text_consts.close_par +
text_consts.reader_name +
text_consts.dot + text_consts.GetByte_proc_name +
text_consts.open_par + text_consts.close_par +
text_consts.semicolon);
}
}
}
}
else
{
//пишем:
//<параметр_visit>-><имя_поля> = static_cast<тип_узла*>(read_node());
sw_cpp.WriteLine(text_consts.tab2 + text_consts.underline +
node_name + text_consts.arrow + nfi.field_name +
text_consts.space + text_consts.assign +
text_consts.space +
text_consts.type_cast_name + text_consts.less_keyword_name +
nfi.field_type_name + text_consts.star +
text_consts.greater_keyword_name +
text_consts.open_par +
text_consts.nodes_read_method +
text_consts.open_par + text_consts.close_par +
text_consts.close_par +
text_consts.semicolon);
}
}
}
sw_cpp.WriteLine(text_consts.tab + text_consts.close_figure);
sw_cpp.WriteLine();
}
//----------------------------------------------------------------------------
public void generate_pcu_reader(StreamWriter sw)
{
//пишем
//public void visit(<имя_типа> _<имя_типа>)
//{
// read_<имя типа>(_<имя типа>);
//}
sw.WriteLine();
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.public_keyword +
text_consts.space + text_consts.void_keyword + text_consts.space + text_consts.visit_method_name +
text_consts.open_par + node_name + text_consts.space + text_consts.underline + node_name + text_consts.close_par);
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.read_prefix + node_name +
text_consts.open_par + text_consts.underline + node_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.close_figure);
//пишем процедуру чтения данного типа
sw.WriteLine();
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.public_keyword +
text_consts.space + text_consts.void_keyword + text_consts.space +
text_consts.read_prefix + node_name +
text_consts.open_par + node_name + text_consts.space +
text_consts.underline + node_name + text_consts.close_par);
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.open_figure);
//Пишем процедуру чтения полей для данного типа узла
if (node_name == text_consts.base_tree_node_name)
{
//пишем
//if (br.ReadByte() == 0)
//{
// _<имя_типа>.source_context = null;
//}
//else
//{
// SourceContext ssyy_beg = null;
// SourceContext ssyy_end = null;
// if (br.ReadByte() == 1)
// {
// ssyy_beg = new SourceContext(br.ReadInt32(), br.ReadInt32(), 0, 0);
// }
// if (br.ReadByte() == 1)
// {
// ssyy_end = new SourceContext(0, 0, br.ReadInt32(), br.ReadInt32());
// }
// _<имя_типа>.source_context = new SourceContext(ssyy_beg, ssyy_end);
//}
sw.WriteLine(text_consts.tab3 + text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.reader_name +
text_consts.dot + text_consts.read_byte_name +
text_consts.open_par + text_consts.close_par +
text_consts.space + text_consts.equal_keyword_name +
text_consts.space + text_consts.i0_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.underline +
node_name + text_consts.dot + text_consts.source_context_name +
text_consts.space + text_consts.assign + text_consts.space +
text_consts.null_keyword_name + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.else_keyword_name);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.source_context_class_name + text_consts.space +
text_consts.temp_beg + text_consts.space + text_consts.assign +
text_consts.space + text_consts.null_keyword_name +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.source_context_class_name + text_consts.space +
text_consts.temp_end + text_consts.space + text_consts.assign +
text_consts.space + text_consts.null_keyword_name +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.reader_name +
text_consts.dot + text_consts.read_byte_name +
text_consts.open_par + text_consts.close_par +
text_consts.space + text_consts.equal_keyword_name +
text_consts.space + text_consts.i1_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab2 +
text_consts.temp_beg + text_consts.space + text_consts.assign +
text_consts.space + text_consts.new_keyword +
text_consts.space + text_consts.source_context_class_name +
text_consts.open_par + text_consts.reader_name +
text_consts.dot + text_consts.read_int32_name +
text_consts.open_par + text_consts.close_par +
text_consts.comma + text_consts.space +
text_consts.reader_name +
text_consts.dot + text_consts.read_int32_name +
text_consts.open_par + text_consts.close_par +
text_consts.comma + text_consts.space + text_consts.i0_keyword_name +
text_consts.comma + text_consts.space + text_consts.i0_keyword_name +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.reader_name +
text_consts.dot + text_consts.read_byte_name +
text_consts.open_par + text_consts.close_par +
text_consts.space + text_consts.equal_keyword_name +
text_consts.space + text_consts.i1_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab2 +
text_consts.temp_end + text_consts.space + text_consts.assign +
text_consts.space + text_consts.new_keyword +
text_consts.space + text_consts.source_context_class_name +
text_consts.open_par +
text_consts.i0_keyword_name +
text_consts.comma + text_consts.space + text_consts.i0_keyword_name +
text_consts.comma + text_consts.space + text_consts.reader_name +
text_consts.dot + text_consts.read_int32_name +
text_consts.open_par + text_consts.close_par +
text_consts.comma + text_consts.space +
text_consts.reader_name +
text_consts.dot + text_consts.read_int32_name +
text_consts.open_par + text_consts.close_par +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.underline +
node_name + text_consts.dot + text_consts.source_context_name +
text_consts.space + text_consts.assign + text_consts.space +
text_consts.new_keyword + text_consts.space +
text_consts.source_context_class_name + text_consts.open_par +
text_consts.temp_beg + text_consts.comma +
text_consts.space + text_consts.temp_end +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
}
else
{
//if (base_class != null) //(ssyy) Все должны быть наследниками tree_node
{
//Пишем вызов десериализации полей предка
//read_<имя_типа_предка>(_<имя_типа>);
sw.WriteLine(text_consts.tab3 + text_consts.read_prefix + base_class.node_name +
text_consts.open_par + text_consts.underline +
node_name + text_consts.close_par + text_consts.semicolon);
}
//Пишем поля объекта
foreach (node_field_info nfi in _subnodes)
{
simple_element se = nfi as simple_element;
string write_proc_string = "";
//Если поле не является узлом дерева
if (se != null)
{
//Получаем имя типа поля
string tname = se.val_field_type_name;//.ToLower();
if (tname.Length > 5 && tname.Substring(0, 5) == "List<")
{
//пишем:
//if (br.ReadByte() == 0)
//{
// <параметр_visit>.<имя_поля> = null;
//}
//else
//{
// <параметр_visit>.<имя_поля> = new <тип_поля>();
// Int32 ssyy_count = br.ReadInt32();
// for(int ssyy_i = 0; ssyy_i < ssyy_count; ssyy_i++)
// {
// <параметр_visit>.<имя_поля>.Add(read_node() as <параметр_List>);
// }
//}
sw.WriteLine(text_consts.tab3 + text_consts.if_keyword_name + text_consts.space +
text_consts.open_par + text_consts.reader_name +
text_consts.dot + text_consts.read_byte_name +
text_consts.open_par + text_consts.close_par +
text_consts.space + text_consts.equal_keyword_name +
text_consts.space + text_consts.i0_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.underline +
node_name + text_consts.dot + nfi.field_name +
text_consts.space + text_consts.assign + text_consts.space +
text_consts.null_keyword_name + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.else_keyword_name);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.underline +
node_name + text_consts.dot + nfi.field_name +
text_consts.space + text_consts.assign + text_consts.space +
text_consts.new_keyword + text_consts.space +
tname + text_consts.open_par + text_consts.close_par +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.int32_type_name + text_consts.space +
text_consts.temp_count_name + text_consts.space +
text_consts.assign + text_consts.space +
text_consts.reader_name + text_consts.dot +
text_consts.read_int32_name + text_consts.open_par +
text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.for_keyword_name +
text_consts.open_par + text_consts.int32_type_name +
text_consts.space + text_consts.cycle_i_name +
text_consts.space + text_consts.assign +
text_consts.space + text_consts.i0_keyword_name +
text_consts.semicolon + text_consts.space +
text_consts.cycle_i_name + text_consts.space +
text_consts.less_keyword_name + text_consts.space +
text_consts.temp_count_name +
text_consts.semicolon + text_consts.space +
text_consts.cycle_i_name + text_consts.increment_keyword_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.open_figure);
string list_param = tname.Substring(5, tname.Length - 6);
sw.WriteLine(text_consts.tab3 + text_consts.tab2 + text_consts.underline +
node_name + text_consts.dot + nfi.field_name +
text_consts.dot + text_consts.add_proc_name +
text_consts.open_par + text_consts.nodes_read_method +
text_consts.open_par + text_consts.close_par +
text_consts.space + text_consts.as_keyword +
text_consts.space + list_param + text_consts.close_par+
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
}
else
{
if (tname == text_consts.string_type_name)
{
//if (br.ReadByte() == 0)
//{
// <параметр_visit>.<имя_поля> = null;
//}
//else
//{
// <параметр_visit>.<имя_поля> = br.ReadString();
//}
sw.WriteLine(text_consts.tab3 + text_consts.if_keyword_name +
text_consts.space + text_consts.open_par +
text_consts.reader_name + text_consts.dot +
text_consts.read_byte_name + text_consts.open_par +
text_consts.close_par + text_consts.space +
text_consts.equal_keyword_name + text_consts.space +
text_consts.i0_keyword_name + text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.underline + node_name +
text_consts.dot + nfi.field_name + text_consts.space +
text_consts.assign + text_consts.space + text_consts.null_keyword_name +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.else_keyword_name);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.underline + node_name +
text_consts.dot + nfi.field_name + text_consts.space +
text_consts.assign + text_consts.space +
text_consts.reader_name + text_consts.dot +
text_consts.read_string_name + text_consts.open_par +
text_consts.close_par +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
}
//простые типы - обрабатываются схожим образом:
else
{
if (tname == text_consts.int32_type_name)
{
write_proc_string = text_consts.read_int32_name;
}
else
if (tname == text_consts.int64_type_name)
{
write_proc_string = text_consts.read_int64_name;
}
else
if (tname == text_consts.uint64_type_name)
{
write_proc_string = text_consts.read_uint64_name;
}
else
if (tname == text_consts.double_type_name)
{
write_proc_string = text_consts.read_double_name;
}
else
if (tname == text_consts.bool_type_name)
{
write_proc_string = text_consts.read_bool_name;
}
else
if (tname == text_consts.char_type_name)
{
write_proc_string = text_consts.read_char_name;
}
if (write_proc_string != "")
{
//<параметр_visit>.<имя_поля> = br.Read...();
sw.WriteLine(text_consts.tab3 + text_consts.underline +
node_name + text_consts.dot + nfi.field_name +
text_consts.space + text_consts.assign +
text_consts.space + text_consts.reader_name +
text_consts.dot + write_proc_string +
text_consts.open_par + text_consts.close_par +
text_consts.semicolon);
}
else
{
//<параметр_visit>.<имя_поля> = (<тип_поля>)br.ReadByte();
sw.WriteLine(text_consts.tab3 + text_consts.underline +
node_name + text_consts.dot + nfi.field_name +
text_consts.space + text_consts.assign +
text_consts.space +
text_consts.open_par + nfi.field_type_name + text_consts.close_par +
text_consts.reader_name +
text_consts.dot + text_consts.read_byte_name +
text_consts.open_par + text_consts.close_par +
text_consts.semicolon);
}
}
}
}
else
{
//пишем:
//<параметр_visit>.<имя_поля> = read_node() as <тип_узла>;
sw.WriteLine(text_consts.tab3 + text_consts.underline +
node_name + text_consts.dot + nfi.field_name +
text_consts.space + text_consts.assign +
text_consts.space + text_consts.nodes_read_method +
text_consts.open_par + text_consts.close_par +
text_consts.space + text_consts.as_keyword +
text_consts.space + nfi.field_type_name +
text_consts.semicolon);
}
}
}
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.close_figure);
sw.WriteLine();
}
//\ssyy
//ssyy
public void generate_cpp_code(StreamWriter sw_h, StreamWriter sw_cpp, HelpStorage hst)
{
sw_h.WriteLine();
string temp = "";
if (hst.get_help_context(this.node_name) != null)
{
sw_h.WriteLine(@" ///");
sw_h.WriteLine(@" ///" + hst.get_help_context(this.node_name).help_context);
sw_h.WriteLine(@" ///");
if (base_class != null)
{
temp = text_consts.space + text_consts.colon + text_consts.space
+ text_consts.public_keyword + text_consts.space + base_class.node_name;
}
sw_h.WriteLine(text_consts.tab + text_consts.class_keyword + text_consts.space +
node_name + temp);
sw_h.WriteLine(text_consts.tab + text_consts.open_figure);
sw_h.WriteLine(text_consts.tab + text_consts.public_keyword + text_consts.colon);
List destructor_code = new List();
foreach (node_field_info nfi in _subnodes)
{
nfi.generate_cpp_field_code(sw_h, destructor_code);
}
if (destructor_code.Count > 0)
{
sw_h.WriteLine();
sw_h.WriteLine(text_consts.tab2 + text_consts.tilde + node_name +
text_consts.open_par + text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine();
sw_cpp.WriteLine(text_consts.tab + node_name + text_consts.colon2 +
text_consts.tilde + node_name +
text_consts.open_par + text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab + text_consts.open_figure);
foreach (string s in destructor_code)
{
sw_cpp.WriteLine(s);
}
sw_cpp.WriteLine(text_consts.tab + text_consts.close_figure);
}
generate_visitor_node_cpp(sw_h);
sw_h.WriteLine(text_consts.tab + text_consts.close_figure + text_consts.semicolon);
sw_h.WriteLine();
}
}
public void generate_cpp_predef_code(StreamWriter sw)
{
sw.WriteLine(text_consts.tab + text_consts.class_keyword + text_consts.space +
node_name + text_consts.semicolon);
}
//\ssyy
public void generate_code(StreamWriter sw,HelpStorage hst)
{
sw.WriteLine();
string temp="";
if (hst.get_help_context(this.node_name)!=null)
{
sw.WriteLine(@" ///");
sw.WriteLine(@" ///"+hst.get_help_context(this.node_name).help_context);
sw.WriteLine(@" ///");
}
sw.WriteLine(" [Serializable]");
if (base_class!=null)
{
temp=text_consts.space+text_consts.colon+text_consts.space+base_class.node_name;
}
sw.WriteLine(text_consts.tab+text_consts.public_keyword+text_consts.space+text_consts.class_keyword+text_consts.space+
node_name+temp);
sw.WriteLine(text_consts.tab+text_consts.open_figure);
sw.WriteLine();
generate_simple_constructor_code(sw);
sw.WriteLine();
if (_subnodes.Count>0)
{
generate_big_constructor_code(sw);
sw.WriteLine();
}
foreach(node_field_info nfi in _subnodes)
{
nfi.generate_field_code(sw);
}
sw.WriteLine();
foreach(node_field_info nfi in _subnodes)
{
nfi.generate_code_property(sw,this,hst);
}
sw.WriteLine();
generate_visitor_node(sw);
sw.WriteLine();
sw.WriteLine(text_consts.tab+text_consts.close_figure);
sw.WriteLine();
sw.WriteLine();
}
public void generate_to_text(StreamWriter sw,HelpStorage hst)
{
if (this.base_class!=null)
sw.WriteLine(this.node_name+"->"+this.base_class.node_name);
else
sw.WriteLine(this.node_name);
foreach(node_field_info nfi in _subnodes)
{
sw.WriteLine(text_consts.tab+nfi.field_type_name+" "+nfi.field_name);
}
/*
string resize_part=
text_consts.tab2+"if ("+this.node_name+"_size<="+this.node_name+"_count)"+text_consts.nr+
text_consts.tab2+"{"+text_consts.nr+
text_consts.tab2+this.node_name+"_size*=2;"+text_consts.nr+
text_consts.tab2+this.node_name+"[] "+this.node_name+"_arrayold="+this.node_name+"_array;"+text_consts.nr+
text_consts.tab2+this.node_name+"_array=new "+this.node_name+"["+this.node_name+"_size];"+text_consts.nr+
text_consts.tab2+this.node_name+"_arrayold.CopyTo("+this.node_name+"_array,0);"+text_consts.nr+
text_consts.tab2+"for (int i="+this.node_name+"_count;i<"+this.node_name+"_size;i++) "+this.node_name+"_array[i]=new "+this.node_name+"();"+text_consts.nr+
text_consts.tab2+"}";
sw.WriteLine(text_consts.tab2+this.node_name+"_count++"+text_consts.semicolon);
sw.WriteLine(resize_part);
string elem=this.node_name+"_array["+this.node_name+"_count-1]";
string reset_elem="";
for(int i=0;i<_subnodes.Count;i++)
{
if (!(_subnodes[i] is simple_element))
reset_elem+=text_consts.tab2+elem+"."+((node_field_info)_subnodes[i]).field_name+"=null;"+text_consts.nr;
if (_subnodes[i] is extended_simple_element)
if (((extended_simple_element)_subnodes[i]).field_type_name.IndexOf("ArrayList")>=0)
reset_elem+=text_consts.tab2+elem+"."+((node_field_info)_subnodes[i]).field_name+".Clear();"+text_consts.nr;
}
if(reset_elem!="")
{
sw.WriteLine(reset_elem);
}
sw.WriteLine(text_consts.tab2+"return "+elem+";");
sw.WriteLine(text_consts.tab+text_consts.close_figure);
sw.WriteLine();
if (_subnodes.Count>0)
{
//tn(...)
sw.Write(text_consts.tab+text_consts.public_keyword+text_consts.space+
text_consts.space+
node_name+text_consts.space+text_consts.new_keyword+text_consts.underline+this.node_name+text_consts.open_par);
for(int i=0;i<_subnodes.Count-1;i++)
sw.Write(subnode_variable(i)+text_consts.comma);
if (_subnodes.Count>0)
sw.Write(subnode_variable(_subnodes.Count-1));
sw.WriteLine(text_consts.close_par);
sw.WriteLine(text_consts.tab+text_consts.open_figure);
sw.WriteLine(text_consts.tab2+this.node_name+"_count++"+text_consts.semicolon);
sw.WriteLine(resize_part);
reset_elem="";
for(int i=0;i<_subnodes.Count;i++)
{
if (_subnodes[i] is extended_simple_element)
if (((extended_simple_element)_subnodes[i]).field_type_name.IndexOf("ArrayList")>=0)
reset_elem+=text_consts.tab2+elem+"."+((node_field_info)_subnodes[i]).field_name+".Clear();"+text_consts.nr;
}
if(reset_elem!="")
{
sw.WriteLine(reset_elem);
}
for(int i=0;i<_subnodes.Count;i++)
sw.WriteLine(text_consts.tab2+elem+"."+((node_field_info)_subnodes[i]).field_name+"="+((node_field_info)_subnodes[i]).field_code_name+text_consts.semicolon);
sw.WriteLine(text_consts.tab2+"return "+elem+";");
sw.WriteLine(text_consts.tab+text_consts.close_figure);
}
*/
sw.WriteLine();
}
public void generate_fabric_method(StreamWriter sw)
{
sw.WriteLine(text_consts.tab+this.node_name+"[] "+this.node_name+"_array"+text_consts.semicolon);
sw.WriteLine(text_consts.tab+"int "+this.node_name+"_size=0,"+this.node_name+"_count=0"+text_consts.semicolon);
sw.WriteLine();
//tn()
sw.WriteLine(text_consts.tab+text_consts.public_keyword+text_consts.space+this.node_name+
text_consts.space+text_consts.new_keyword+text_consts.underline+this.node_name+text_consts.open_par+text_consts.close_par);
sw.WriteLine(text_consts.tab+text_consts.open_figure);
string resize_part=
text_consts.tab2+"if ("+this.node_name+"_size<="+this.node_name+"_count)"+text_consts.nr+
text_consts.tab2+"{"+text_consts.nr+
text_consts.tab2+this.node_name+"_size*=2;"+text_consts.nr+
text_consts.tab2+this.node_name+"[] "+this.node_name+"_arrayold="+this.node_name+"_array;"+text_consts.nr+
text_consts.tab2+this.node_name+"_array=new "+this.node_name+"["+this.node_name+"_size];"+text_consts.nr+
text_consts.tab2+this.node_name+"_arrayold.CopyTo("+this.node_name+"_array,0);"+text_consts.nr+
text_consts.tab2+"for (int i="+this.node_name+"_count;i<"+this.node_name+"_size;i++) "+this.node_name+"_array[i]=new "+this.node_name+"();"+text_consts.nr+
text_consts.tab2+"}";
sw.WriteLine(text_consts.tab2+this.node_name+"_count++"+text_consts.semicolon);
sw.WriteLine(resize_part);
string elem=this.node_name+"_array["+this.node_name+"_count-1]";
string reset_elem="";
for(int i=0;i<_subnodes.Count;i++)
{
if (!(_subnodes[i] is simple_element))
reset_elem+=text_consts.tab2+elem+"."+((node_field_info)_subnodes[i]).field_name+"=null;"+text_consts.nr;
if (_subnodes[i] is extended_simple_element)
if (((extended_simple_element)_subnodes[i]).field_type_name.IndexOf("ArrayList")>=0)
reset_elem+=text_consts.tab2+elem+"."+((node_field_info)_subnodes[i]).field_name+".Clear();"+text_consts.nr;
}
if(reset_elem!="")
{
sw.WriteLine(reset_elem);
}
sw.WriteLine(text_consts.tab2+"return "+elem+";");
sw.WriteLine(text_consts.tab+text_consts.close_figure);
sw.WriteLine();
if (_subnodes.Count>0)
{
//tn(...)
sw.Write(text_consts.tab+text_consts.public_keyword+text_consts.space+
text_consts.space+
node_name+text_consts.space+text_consts.new_keyword+text_consts.underline+this.node_name+text_consts.open_par);
for(int i=0;i<_subnodes.Count-1;i++)
sw.Write(subnode_variable(i)+text_consts.comma);
if (_subnodes.Count>0)
sw.Write(subnode_variable(_subnodes.Count-1));
sw.WriteLine(text_consts.close_par);
sw.WriteLine(text_consts.tab+text_consts.open_figure);
sw.WriteLine(text_consts.tab2+this.node_name+"_count++"+text_consts.semicolon);
sw.WriteLine(resize_part);
reset_elem="";
for(int i=0;i<_subnodes.Count;i++)
{
if (_subnodes[i] is extended_simple_element)
if (((extended_simple_element)_subnodes[i]).field_type_name.IndexOf("ArrayList")>=0)
reset_elem+=text_consts.tab2+elem+"."+((node_field_info)_subnodes[i]).field_name+".Clear();"+text_consts.nr;
}
if(reset_elem!="")
{
sw.WriteLine(reset_elem);
}
for(int i=0;i<_subnodes.Count;i++)
sw.WriteLine(text_consts.tab2+elem+"."+((node_field_info)_subnodes[i]).field_name+"="+((node_field_info)_subnodes[i]).field_code_name+text_consts.semicolon);
sw.WriteLine(text_consts.tab2+"return "+elem+";");
sw.WriteLine(text_consts.tab+text_consts.close_figure);
}
sw.WriteLine();sw.WriteLine();
}
public void generate_fabric_create_part(StreamWriter sw)
{
sw.WriteLine(text_consts.tab2+this.node_name+"_size=start_size"+text_consts.semicolon);
sw.WriteLine(text_consts.tab2+this.node_name+"_array=new "+this.node_name+"["+this.node_name+"_size];");
sw.WriteLine(text_consts.tab2+"for (int i=0;i<"+this.node_name+"_size;i++) "+this.node_name+"_array[i]=new "+this.node_name+"();");
sw.WriteLine();
}
public void generate_fabric_reset_part(StreamWriter sw)
{
sw.WriteLine(text_consts.tab2+this.node_name+"_count=0"+text_consts.semicolon);
}
}
[Serializable]
public class NodeGenerator
{
private ArrayList nodes=new ArrayList();
private string _file_name;
private string _namespace_name;
private string _factory_name;
private string _visitor_interface_file_name;
private string _pcu_writer_name;
private string _pcu_writer_file_name;
private string _pcu_reader_name;
private string _pcu_reader_file_name;
private string _pcu_reader_file_name_h;
public string pcu_reader_file_name_h
{
get { return _pcu_reader_file_name_h; }
set { _pcu_reader_file_name_h = value; }
}
private string _pcu_reader_file_name_cpp;
public string pcu_reader_file_name_cpp
{
get { return _pcu_reader_file_name_cpp; }
set { _pcu_reader_file_name_cpp = value; }
}
[NonSerialized]
private HelpStorage hstr=new HelpStorage();
public HelpStorage help_storage
{
get
{
return hstr;
}
}
public void add_node(node_info ni)
{
nodes.Add(ni);
}
public ArrayList all_nodes
{
get
{
return nodes;
}
set
{
nodes.Clear();
nodes.AddRange(value);
}
}
public void set_nodes(ICollection tnodes)
{
nodes.Clear();
nodes.AddRange(tnodes);
}
public string visitor_interface_file_name
{
get
{
return _visitor_interface_file_name;
}
set
{
_visitor_interface_file_name=value;
}
}
public string pcu_writer_file_name
{
get
{
return _pcu_writer_file_name;
}
set
{
_pcu_writer_file_name = value;
}
}
public string pcu_writer_name
{
get
{
return _pcu_writer_name;
}
set
{
_pcu_writer_name = value;
}
}
public string pcu_reader_file_name
{
get
{
return _pcu_reader_file_name;
}
set
{
_pcu_reader_file_name = value;
}
}
public string pcu_reader_name
{
get
{
return _pcu_reader_name;
}
set
{
_pcu_reader_name = value;
}
}
public string factory_name
{
get
{
return _factory_name;
}
set
{
_factory_name=value;
}
}
public string namespace_name
{
get
{
return _namespace_name;
}
set
{
_namespace_name=value;
}
}
public string file_name
{
get
{
return _file_name;
}
set
{
_file_name=value;
}
}
public void generate_pre_code(StreamWriter sw)
{
sw.WriteLine();
sw.WriteLine(text_consts.namespace_keyword+text_consts.space+namespace_name);
sw.WriteLine(text_consts.open_figure);
}
public void generate_post_code(StreamWriter sw)
{
sw.WriteLine();
sw.WriteLine(text_consts.close_figure);
sw.WriteLine();
}
public void generate_header_code(StreamWriter sw)
{
sw.WriteLine("/********************************************************************************************");
sw.WriteLine("Этот файл создан программой");
sw.WriteLine("PascalABC.NET: syntax tree generator v1.5(с) Водолазов Н., Ткачук А.В., Иванов С.О., 2007");
sw.WriteLine();
sw.WriteLine("Вручную не редактировать!");
sw.WriteLine("*********************************************************************************************/");
sw.WriteLine(text_consts.using_system);
sw.WriteLine(text_consts.using_system_io);
}
public void generate_factory_class(StreamWriter sw)
{
sw.WriteLine();
sw.WriteLine(text_consts.tab+text_consts.public_keyword+text_consts.space+text_consts.class_keyword+text_consts.space+factory_name);
sw.WriteLine(text_consts.tab+text_consts.open_figure);
sw.WriteLine();
foreach(node_info ni in nodes)
{
ni.generate_creator_method(sw);
}
sw.WriteLine();
sw.WriteLine(text_consts.tab+text_consts.close_figure);
sw.WriteLine();
}
public void generate_visitor_interface_code()
{
StreamWriter sw=new StreamWriter(visitor_interface_file_name);
generate_pre_code(sw);
sw.WriteLine();
sw.WriteLine(text_consts.tab+text_consts.public_keyword+text_consts.space+text_consts.interface_keyword+
text_consts.space+
text_consts.visitor_interface_name);
sw.WriteLine(text_consts.tab+text_consts.open_figure);
foreach(node_info ni in nodes)
{
ni.generate_visit_method_for_interface(sw);
}
sw.WriteLine(text_consts.tab+text_consts.close_figure);
sw.WriteLine();
generate_post_code(sw);
sw.Flush();
sw.Close();
}
public void generate_abstract_visitor_code()
{
StreamWriter sw = new StreamWriter(text_consts.abstract_visitor_file_name);
generate_pre_code(sw);
sw.WriteLine();
sw.WriteLine(text_consts.tab + text_consts.public_keyword + text_consts.space + text_consts.class_keyword+
text_consts.space +
text_consts.abstract_visitor_class_name+ text_consts.colon+text_consts.space+text_consts.visitor_interface_name);
sw.WriteLine(text_consts.tab + text_consts.open_figure);
foreach (node_info ni in nodes)
{
ni.generate_visit_method_for_abstract_visitor(sw);
}
sw.WriteLine(text_consts.tab + text_consts.close_figure);
sw.WriteLine();
generate_post_code(sw);
sw.Flush();
sw.Close();
}
public void generate_visitor_template(string visitor_name,string visitor_template_file_name)
{
StreamWriter sw=new StreamWriter(visitor_template_file_name);
generate_pre_code(sw);
sw.WriteLine();
sw.WriteLine(text_consts.tab+text_consts.class_keyword+text_consts.space+visitor_name+text_consts.space+
text_consts.colon+text_consts.space+text_consts.visitor_interface_name);
sw.WriteLine(text_consts.tab+text_consts.open_figure);
foreach(node_info ni in nodes)
{
ni.generate_visit_method(sw);
}
sw.WriteLine(text_consts.tab+text_consts.close_figure);
sw.WriteLine();
generate_post_code(sw);
sw.Flush();
sw.Close();
}
public void generate_visitor_cpp(StreamWriter sw, string visitor_name)
{
sw.WriteLine();
sw.WriteLine(text_consts.tab + text_consts.class_keyword + text_consts.space +
visitor_name);
sw.WriteLine(text_consts.tab + text_consts.open_figure);
sw.WriteLine(text_consts.tab + text_consts.public_keyword + text_consts.colon);
foreach (node_info ni in nodes)
{
ni.generate_visit_method_cpp(sw);
}
sw.WriteLine(text_consts.tab + text_consts.close_figure + text_consts.semicolon);
sw.WriteLine();
}
public void generate_nodes_fabric(string fabric_name,string file_name)
{
StreamWriter sw=new StreamWriter(file_name);
generate_pre_code(sw);
sw.WriteLine();
sw.WriteLine(text_consts.tab+text_consts.public_keyword+text_consts.space+text_consts.class_keyword+text_consts.space+fabric_name+text_consts.space);
sw.WriteLine(text_consts.tab+text_consts.open_figure);
foreach(node_info ni in nodes)
{
ni.generate_fabric_method(sw);
}
sw.WriteLine(text_consts.tab+text_consts.public_keyword+text_consts.space+fabric_name+"(int start_size)");
sw.WriteLine(text_consts.tab+text_consts.open_figure);
foreach(node_info ni in nodes)
{
ni.generate_fabric_create_part(sw);
}
sw.WriteLine(text_consts.tab+text_consts.close_figure);
sw.WriteLine(text_consts.tab+text_consts.public_keyword+text_consts.space+"void reset()");
sw.WriteLine(text_consts.tab+text_consts.open_figure);
foreach(node_info ni in nodes)
{
ni.generate_fabric_reset_part(sw);
}
sw.WriteLine(text_consts.tab+text_consts.close_figure);
sw.WriteLine(text_consts.tab+text_consts.close_figure);
sw.WriteLine();
generate_post_code(sw);
sw.Flush();
sw.Close();
}
public void generate_code()
{
StreamWriter sw=new StreamWriter(file_name);
StreamWriter swt=new StreamWriter(file_name+".txt");
sw.WriteLine();
sw.WriteLine("using System;");
sw.WriteLine("using System.Collections;");
sw.WriteLine("using System.Collections.Generic;");
generate_pre_code(sw);
foreach(node_info ni in nodes)
{
ni.generate_code(sw,this.help_storage);
}
foreach(node_info ni in nodes)
{
ni.generate_to_text(swt,this.help_storage);
}
//generate_factory_class(sw);
generate_post_code(sw);
generate_visitor_interface_code();
generate_abstract_visitor_code();
sw.Flush();
sw.Close();
swt.Flush();
swt.Close();
}
public void generate_cpp_code()
{
int dot_pos = file_name.IndexOf('.');
string name_of_file = file_name.Substring(0, dot_pos);
StreamWriter sw_h = new StreamWriter(name_of_file + ".h");
StreamWriter sw_cpp = new StreamWriter(name_of_file + ".cpp");
sw_h.WriteLine();
sw_h.WriteLine("#ifndef " + name_of_file.ToUpper() + "_H");
sw_h.WriteLine("#define " + name_of_file.ToUpper() + "_H");
sw_h.WriteLine();
sw_h.WriteLine("#include \"TreeSubsidiary.h\"");
sw_h.WriteLine("#include ");
sw_h.WriteLine("using namespace std;");
sw_cpp.WriteLine("#include \"stdafx.h\"");
sw_cpp.WriteLine("#include \"" + text_consts.visualizator_name + ".h" + "\"");
generate_pre_code(sw_h);
generate_pre_code(sw_cpp);
foreach (node_info ni in nodes)
{
ni.generate_cpp_predef_code(sw_h);
}
generate_visitor_cpp(sw_h, text_consts.abstract_visitor_class_name);
ArrayList tmp_nodes = new ArrayList(nodes);
while (tmp_nodes.Count > 0)
{
int i = 0;
while (i < tmp_nodes.Count)
{
node_info ni = tmp_nodes[i] as node_info;
if (ni.base_class == null || !tmp_nodes.Contains(ni.base_class))
{
ni.generate_cpp_code(sw_h, sw_cpp, this.help_storage);
tmp_nodes.RemoveAt(i);
}
else
{
i++;
}
}
}
/*foreach (node_info ni in nodes)
{
ni.generate_cpp_code(sw, this.help_storage);
}*/
generate_post_code(sw_h);
generate_post_code(sw_cpp);
sw_h.WriteLine();
sw_h.WriteLine("#endif");
sw_h.WriteLine();
sw_h.Flush();
sw_h.Close();
sw_cpp.Flush();
sw_cpp.Close();
}
public void generate_pcu_writer_code(bool cross_platform)
{
string prefix = (cross_platform) ? "CP" : "";
StreamWriter sw = new StreamWriter(prefix + pcu_writer_file_name);
generate_header_code(sw);
generate_pre_code(sw);
sw.WriteLine();
sw.WriteLine(text_consts.tab + text_consts.public_keyword + text_consts.space + text_consts.class_keyword +
text_consts.space +
prefix + pcu_writer_name + text_consts.colon +
text_consts.visitor_interface_name);
sw.WriteLine(text_consts.tab + text_consts.open_figure);
sw.WriteLine();
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.public_keyword +
text_consts.space + text_consts.BinaryWriter_classname +
text_consts.space + text_consts.writer_name + text_consts.semicolon);
sw.WriteLine();
for (int i = 0; i < nodes.Count; i++)
{
((node_info)nodes[i]).generate_pcu_writer(sw, i, cross_platform);
}
sw.WriteLine(text_consts.tab + text_consts.close_figure);
sw.WriteLine();
generate_post_code(sw);
sw.Flush();
sw.Close();
}
public void generate_vizualizator_cpp()
{
StreamWriter sw_h = new StreamWriter(text_consts.visualizator_name + ".h");
StreamWriter sw_cpp = new StreamWriter(text_consts.visualizator_name + ".cpp");
sw_h.WriteLine();
sw_h.WriteLine("#ifndef " + text_consts.visualizator_name.ToUpper() + "_H");
sw_h.WriteLine("#define " + text_consts.visualizator_name.ToUpper() + "_H");
sw_h.WriteLine();
sw_h.WriteLine("#include ");
sw_h.WriteLine("#include \"Tree.h\"");
sw_h.WriteLine("using namespace std;");
sw_cpp.WriteLine("#include \"stdafx.h\"");
sw_cpp.WriteLine("#include \"" + text_consts.visualizator_name + ".h" + "\"");
generate_pre_code(sw_h);
generate_pre_code(sw_cpp);
sw_h.WriteLine(text_consts.tab + text_consts.class_keyword +
text_consts.space + text_consts.visualizator_name + text_consts.colon +
text_consts.public_keyword + text_consts.space +
text_consts.abstract_visitor_class_name);
sw_h.WriteLine(text_consts.tab + text_consts.open_figure);
sw_h.WriteLine(text_consts.tab + text_consts.public_keyword + text_consts.colon);
sw_h.WriteLine(text_consts.tab2 + text_consts.int32_type_name_cpp +
text_consts.space + text_consts.space_offset + text_consts.semicolon);
sw_h.WriteLine(text_consts.tab + text_consts.tab +
text_consts.ostream_classname +
text_consts.space + text_consts.ostream_name + text_consts.semicolon);
sw_h.WriteLine();
//void PrintSpaces();
//void TreePainter::PrintSpaces()
//{
// for(int ssyy_i = 0; ssyy_i < nspace; ssyy_i++)
// {
// *os<<" ";
// }
//}
sw_h.WriteLine(text_consts.tab2 + text_consts.void_keyword +
text_consts.space + text_consts.print_spaces_name +
text_consts.open_par +
text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab + text_consts.void_keyword +
text_consts.space + text_consts.visualizator_name +
text_consts.colon2 + text_consts.print_spaces_name +
text_consts.open_par + text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.for_keyword_name +
text_consts.open_par + text_consts.int32_type_name_cpp +
text_consts.space + text_consts.cycle_i_name + text_consts.space +
text_consts.assign + text_consts.space + text_consts.i0_keyword_name +
text_consts.semicolon + text_consts.space + text_consts.cycle_i_name +
text_consts.space + text_consts.less_keyword_name + text_consts.space +
text_consts.space_offset + text_consts.semicolon +
text_consts.space + text_consts.cycle_i_name + text_consts.increment_keyword_name +
text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.ostream_name + text_consts.stream_out +
text_consts.inverted_comma2 + text_consts.space + text_consts.inverted_comma2 +
text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.close_figure);
sw_cpp.WriteLine(text_consts.tab + text_consts.close_figure);
//void print_node(tree_node *_tree_node);
//void TreePainter::print_node(tree_node *_tree_node)
//{
// if (_tree_node != null)
// {
// _tree_node->visit(this);
// }
//}
sw_h.WriteLine(text_consts.tab2 + text_consts.void_keyword +
text_consts.space + text_consts.print_node_proc +
text_consts.open_par + text_consts.base_tree_node_name +
text_consts.space + text_consts.star + text_consts.underline +
text_consts.base_tree_node_name +
text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine();
sw_cpp.WriteLine(text_consts.tab +
text_consts.void_keyword + text_consts.space +
text_consts.visualizator_name + text_consts.colon2 +
text_consts.print_node_proc +
text_consts.open_par + text_consts.base_tree_node_name +
text_consts.space + text_consts.star + text_consts.underline +
text_consts.base_tree_node_name +
text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab2 +
text_consts.if_keyword_name + text_consts.open_par +
text_consts.underline + text_consts.base_tree_node_name +
text_consts.space + text_consts.not_equal_keyword_name +
text_consts.space + text_consts.cpp_null_keyword_name +
text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.underline +
text_consts.base_tree_node_name + text_consts.arrow +
text_consts.visit_method_name + text_consts.open_par +
text_consts.this_keyword + text_consts.close_par +
text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.close_figure);
sw_cpp.WriteLine(text_consts.tab + text_consts.close_figure);
for (int i = 0; i < nodes.Count; i++)
{
((node_info)nodes[i]).generate_painter(sw_h, sw_cpp);
}
sw_h.WriteLine(text_consts.tab + text_consts.close_figure + text_consts.semicolon);
sw_h.WriteLine();
generate_post_code(sw_h);
generate_post_code(sw_cpp);
sw_h.WriteLine();
sw_h.WriteLine("#endif");
sw_h.WriteLine();
sw_h.Flush();
sw_h.Close();
sw_cpp.Flush();
sw_cpp.Close();
}
public void generate_stream_reader_cpp()
{
StreamWriter sw_h = new StreamWriter(pcu_reader_file_name_h);
StreamWriter sw_cpp = new StreamWriter(pcu_reader_file_name_cpp);
sw_h.WriteLine();
sw_h.WriteLine("#ifndef " + pcu_reader_name.ToUpper() + "_H");
sw_h.WriteLine("#define " + pcu_reader_name.ToUpper() + "_H");
sw_h.WriteLine();
sw_h.WriteLine("#include ");
sw_h.WriteLine("#include \"Tree.h\"");
sw_h.WriteLine("#include \"Reader.h\"");
sw_h.WriteLine("using namespace std;");
sw_cpp.WriteLine("#include \"stdafx.h\"");
sw_cpp.WriteLine("#include \"" + pcu_reader_file_name_h + "\"");
generate_pre_code(sw_h);
generate_pre_code(sw_cpp);
sw_h.WriteLine(text_consts.tab + text_consts.class_keyword +
text_consts.space + pcu_reader_name + text_consts.colon +
text_consts.public_keyword + text_consts.space +
text_consts.abstract_visitor_class_name);
sw_h.WriteLine(text_consts.tab + text_consts.open_figure);
sw_h.WriteLine(text_consts.tab + text_consts.public_keyword + text_consts.colon);
sw_h.WriteLine(text_consts.tab + text_consts.tab +
text_consts.CPP_reader_classname +
text_consts.space + text_consts.reader_name + text_consts.semicolon);
sw_h.WriteLine();
//Пишем конструктор узлов.
//tree_node* construct_node(short node_class_number);
//tree_node* SyntaxTreeReader::construct_node(short node_class_number)
//{
// switch(node_class_number)
// {
// case <номер>:
// return new <узел_дерева>();
// ...
// }
// return NULL;
//}
sw_h.WriteLine(text_consts.tab2 + text_consts.base_tree_node_name +
text_consts.star +
text_consts.space + text_consts.nodes_construct_method +
text_consts.open_par + text_consts.cpp_short_name +
text_consts.space + text_consts.param_number_name +
text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab + text_consts.base_tree_node_name +
text_consts.star + text_consts.space +
pcu_reader_name + text_consts.colon2 +
text_consts.nodes_construct_method +
text_consts.open_par + text_consts.cpp_short_name +
text_consts.space + text_consts.param_number_name +
text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.switch_keyword_name +
text_consts.open_par + text_consts.param_number_name +
text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.open_figure);
for (int i = 0; i < nodes.Count; i++)
{
sw_cpp.WriteLine(text_consts.tab3 +
text_consts.case_keyword_name + text_consts.space +
i.ToString() + text_consts.colon);
sw_cpp.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.return_keyword + text_consts.space +
text_consts.new_keyword + text_consts.space +
((node_info)nodes[i]).node_name + text_consts.open_par +
text_consts.close_par + text_consts.semicolon);
}
sw_cpp.WriteLine(text_consts.tab2 + text_consts.close_figure);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.return_keyword +
text_consts.space + text_consts.cpp_null_keyword_name + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab + text_consts.close_figure);
sw_cpp.WriteLine();
//Пишем процедуру чтения узла
//tree_node* read_node();
//tree_node* SyntaxTreeReader::read_node()
//{
// if (br.GetChar() == 1)
// {
// tree_node* ssyy_tmp = construct_node(br.GetShort());
// ssyy_tmp->visit(this);
// return ssyy_tmp;
// }
// else
// {
// return NULL;
// }
//}
sw_h.WriteLine(text_consts.tab2 +
text_consts.base_tree_node_name + text_consts.star + text_consts.space +
text_consts.nodes_read_method + text_consts.open_par +
text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab +
text_consts.base_tree_node_name + text_consts.star + text_consts.space +
pcu_reader_name + text_consts.colon2 +
text_consts.nodes_read_method + text_consts.open_par +
text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.if_keyword_name +
text_consts.space + text_consts.open_par +
text_consts.reader_name + text_consts.dot +
text_consts.GetChar_proc_name + text_consts.open_par +
text_consts.close_par + text_consts.space +
text_consts.equal_keyword_name + text_consts.space +
text_consts.i1_keyword_name + text_consts.close_par);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.tab +
text_consts.base_tree_node_name + text_consts.space +
text_consts.star +
text_consts.temp_node_name + text_consts.space +
text_consts.assign + text_consts.space +
text_consts.nodes_construct_method + text_consts.open_par +
text_consts.reader_name + text_consts.dot +
text_consts.GetShort_proc_name + text_consts.open_par +
text_consts.close_par + text_consts.close_par + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.tab +
text_consts.temp_node_name + text_consts.arrow +
text_consts.visit_method_name + text_consts.open_par +
text_consts.this_keyword + text_consts.close_par +
text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.tab +
text_consts.return_keyword + text_consts.space +
text_consts.temp_node_name +
text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.close_figure);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.else_keyword_name);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.open_figure);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.tab +
text_consts.return_keyword + text_consts.space +
text_consts.cpp_null_keyword_name + text_consts.semicolon);
sw_cpp.WriteLine(text_consts.tab2 + text_consts.close_figure);
sw_cpp.WriteLine(text_consts.tab + text_consts.close_figure);
sw_cpp.WriteLine();
for (int i = 0; i < nodes.Count; i++)
{
((node_info)nodes[i]).generate_stream_reader_cpp(sw_h, sw_cpp, pcu_reader_name);
}
sw_h.WriteLine(text_consts.tab + text_consts.close_figure + text_consts.semicolon);
sw_h.WriteLine();
generate_post_code(sw_h);
generate_post_code(sw_cpp);
sw_h.WriteLine();
sw_h.WriteLine("#endif");
sw_h.WriteLine();
sw_h.Flush();
sw_h.Close();
sw_cpp.Flush();
sw_cpp.Close();
}
public void generate_pcu_reader_code()
{
StreamWriter sw = new StreamWriter(pcu_reader_file_name);
generate_header_code(sw);
sw.WriteLine("using System.Collections.Generic;");
generate_pre_code(sw);
sw.WriteLine();
sw.WriteLine(text_consts.tab + text_consts.public_keyword + text_consts.space + text_consts.class_keyword +
text_consts.space +
pcu_reader_name + text_consts.colon +
text_consts.visitor_interface_name);
sw.WriteLine(text_consts.tab + text_consts.open_figure);
sw.WriteLine();
sw.WriteLine(text_consts.tab + text_consts.tab + text_consts.public_keyword +
text_consts.space + text_consts.BinaryReader_classname +
text_consts.space + text_consts.reader_name + text_consts.semicolon);
sw.WriteLine();
//Пишем конструктор узлов.
//public tree_node construct_node(Int16 node_class_number)
//{
// switch(node_class_number)
// {
// case <номер>:
// return new <узел_дерева>();
// ...
// }
// return null;
//}
sw.WriteLine(text_consts.tab2 + text_consts.public_keyword +
text_consts.space + text_consts.base_tree_node_name +
text_consts.space + text_consts.nodes_construct_method +
text_consts.open_par + text_consts.int16_type_name +
text_consts.space + text_consts.param_number_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab2 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.switch_keyword_name +
text_consts.open_par + text_consts.param_number_name +
text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
for (int i = 0; i < nodes.Count; i++)
{
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.case_keyword_name + text_consts.space +
i.ToString() + text_consts.colon);
sw.WriteLine(text_consts.tab3 + text_consts.tab2 +
text_consts.return_keyword + text_consts.space +
text_consts.new_keyword + text_consts.space +
((node_info)nodes[i]).node_name + text_consts.open_par +
text_consts.close_par + text_consts.semicolon);
}
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.return_keyword +
text_consts.space + text_consts.null_keyword_name + text_consts.semicolon);
sw.WriteLine(text_consts.tab2 + text_consts.close_figure);
//Пишем процедуру чтения узла
//public tree_node read_node()
//{
// if (br.ReadByte() == 1)
// {
// tree_node ssyy_tmp = construct_node(br.ReadInt16());
// ssyy_tmp.visit(this);
// return ssyy_tmp;
// }
// else
// {
// return null;
// }
//}
sw.WriteLine(text_consts.tab2 + text_consts.public_keyword +
text_consts.space +
text_consts.base_tree_node_name + text_consts.space +
text_consts.nodes_read_method + text_consts.open_par +
text_consts.close_par);
sw.WriteLine(text_consts.tab2 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.if_keyword_name +
text_consts.space + text_consts.open_par +
text_consts.reader_name + text_consts.dot +
text_consts.read_byte_name + text_consts.open_par +
text_consts.close_par + text_consts.space +
text_consts.equal_keyword_name + text_consts.space +
text_consts.i1_keyword_name + text_consts.close_par);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.base_tree_node_name + text_consts.space +
text_consts.temp_node_name + text_consts.space +
text_consts.assign + text_consts.space +
text_consts.nodes_construct_method + text_consts.open_par +
text_consts.reader_name + text_consts.dot +
text_consts.read_int16_name + text_consts.open_par +
text_consts.close_par + text_consts.close_par + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.temp_node_name + text_consts.dot +
text_consts.visit_method_name + text_consts.open_par +
text_consts.this_keyword + text_consts.close_par +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.return_keyword + text_consts.space +
text_consts.temp_node_name +
text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw.WriteLine(text_consts.tab3 + text_consts.else_keyword_name);
sw.WriteLine(text_consts.tab3 + text_consts.open_figure);
sw.WriteLine(text_consts.tab3 + text_consts.tab +
text_consts.return_keyword + text_consts.space +
text_consts.null_keyword_name + text_consts.semicolon);
sw.WriteLine(text_consts.tab3 + text_consts.close_figure);
sw.WriteLine(text_consts.tab2 + text_consts.close_figure);
for (int i = 0; i < nodes.Count; i++)
{
((node_info)nodes[i]).generate_pcu_reader(sw);
}
sw.WriteLine(text_consts.tab + text_consts.close_figure);
sw.WriteLine();
generate_post_code(sw);
sw.Flush();
sw.Close();
}
public void serialize(string file_name)
{
Stream str=File.Open(file_name,FileMode.Create);
BinaryFormatter formatter=new BinaryFormatter();
formatter.Serialize(str,this);
str.Flush();
str.Close();
string fn2=Path.ChangeExtension(file_name,".hcnt");
hstr.serialize(fn2);
}
public static NodeGenerator deserialize(string file_name)
{
Stream str=File.Open(file_name,FileMode.Open);
BinaryFormatter formatter=new BinaryFormatter();
object o=formatter.Deserialize(str);
NodeGenerator ng=(o as NodeGenerator);
//str.Flush();
str.Close();
string fn2=Path.ChangeExtension(file_name,".hcnt");
HelpStorage hc=HelpStorage.deserialize(fn2);
ng.hstr=hc;
return ng;
}
}
}