syntax_tree_visitor_semcheck_helper.cs добавил

This commit is contained in:
miks1965 2017-01-20 21:41:28 +03:00
parent 10764db792
commit 0ea26ac4e9
12 changed files with 325 additions and 36 deletions

View file

@ -1098,9 +1098,14 @@ namespace PascalABCCompiler.SyntaxTree
DefaultVisit(_slice_expr_question);
}
public virtual void visit(semantic_check_sugared_statement _semantic_check_sugared_statement)
public virtual void visit(semantic_check_sugared_statement_node _semantic_check_sugared_statement_node)
{
DefaultVisit(_semantic_check_sugared_statement);
DefaultVisit(_semantic_check_sugared_statement_node);
}
public virtual void visit(sugared_expression _sugared_expression)
{
DefaultVisit(_sugared_expression);
}
}

View file

@ -1749,11 +1749,19 @@ namespace PascalABCCompiler.SyntaxTree
{
}
public virtual void pre_do_visit(semantic_check_sugared_statement _semantic_check_sugared_statement)
public virtual void pre_do_visit(semantic_check_sugared_statement_node _semantic_check_sugared_statement_node)
{
}
public virtual void post_do_visit(semantic_check_sugared_statement _semantic_check_sugared_statement)
public virtual void post_do_visit(semantic_check_sugared_statement_node _semantic_check_sugared_statement_node)
{
}
public virtual void pre_do_visit(sugared_expression _sugared_expression)
{
}
public virtual void post_do_visit(sugared_expression _sugared_expression)
{
}
@ -3623,11 +3631,19 @@ namespace PascalABCCompiler.SyntaxTree
post_do_visit(_slice_expr_question);
}
public override void visit(semantic_check_sugared_statement _semantic_check_sugared_statement)
public override void visit(semantic_check_sugared_statement_node _semantic_check_sugared_statement_node)
{
DefaultVisit(_semantic_check_sugared_statement);
pre_do_visit(_semantic_check_sugared_statement);
post_do_visit(_semantic_check_sugared_statement);
DefaultVisit(_semantic_check_sugared_statement_node);
pre_do_visit(_semantic_check_sugared_statement_node);
post_do_visit(_semantic_check_sugared_statement_node);
}
public override void visit(sugared_expression _sugared_expression)
{
DefaultVisit(_sugared_expression);
pre_do_visit(_sugared_expression);
visit(sugared_expression.new_expr);
post_do_visit(_sugared_expression);
}
}

View file

@ -457,7 +457,9 @@ namespace PascalABCCompiler.SyntaxTree
case 217:
return new slice_expr_question();
case 218:
return new semantic_check_sugared_statement();
return new semantic_check_sugared_statement_node();
case 219:
return new sugared_expression();
}
return null;
}
@ -3847,15 +3849,28 @@ namespace PascalABCCompiler.SyntaxTree
}
public void visit(semantic_check_sugared_statement _semantic_check_sugared_statement)
public void visit(semantic_check_sugared_statement_node _semantic_check_sugared_statement_node)
{
read_semantic_check_sugared_statement(_semantic_check_sugared_statement);
read_semantic_check_sugared_statement_node(_semantic_check_sugared_statement_node);
}
public void read_semantic_check_sugared_statement(semantic_check_sugared_statement _semantic_check_sugared_statement)
public void read_semantic_check_sugared_statement_node(semantic_check_sugared_statement_node _semantic_check_sugared_statement_node)
{
read_statement(_semantic_check_sugared_statement);
_semantic_check_sugared_statement.stat = (object)br.ReadByte();
read_statement(_semantic_check_sugared_statement_node);
_semantic_check_sugared_statement_node.stat = (object)br.ReadByte();
}
public void visit(sugared_expression _sugared_expression)
{
read_sugared_expression(_sugared_expression);
}
public void read_sugared_expression(sugared_expression _sugared_expression)
{
read_expression(_sugared_expression);
_sugared_expression.sugared_expr = (object)br.ReadByte();
_sugared_expression.new_expr = _read_node() as expression;
}
}

View file

@ -6004,16 +6004,38 @@ namespace PascalABCCompiler.SyntaxTree
}
public void visit(semantic_check_sugared_statement _semantic_check_sugared_statement)
public void visit(semantic_check_sugared_statement_node _semantic_check_sugared_statement_node)
{
bw.Write((Int16)218);
write_semantic_check_sugared_statement(_semantic_check_sugared_statement);
write_semantic_check_sugared_statement_node(_semantic_check_sugared_statement_node);
}
public void write_semantic_check_sugared_statement(semantic_check_sugared_statement _semantic_check_sugared_statement)
public void write_semantic_check_sugared_statement_node(semantic_check_sugared_statement_node _semantic_check_sugared_statement_node)
{
write_statement(_semantic_check_sugared_statement);
bw.Write((byte)_semantic_check_sugared_statement.stat);
write_statement(_semantic_check_sugared_statement_node);
bw.Write((byte)_semantic_check_sugared_statement_node.stat);
}
public void visit(sugared_expression _sugared_expression)
{
bw.Write((Int16)219);
write_sugared_expression(_sugared_expression);
}
public void write_sugared_expression(sugared_expression _sugared_expression)
{
write_expression(_sugared_expression);
bw.Write((byte)_sugared_expression.sugared_expr);
if (_sugared_expression.new_expr == null)
{
bw.Write((byte)0);
}
else
{
bw.Write((byte)1);
_sugared_expression.new_expr.visit(this);
}
}
}

View file

@ -38529,13 +38529,13 @@ namespace PascalABCCompiler.SyntaxTree
///узел, не генерирующий кода, но осуществляющий семантические проверки сахарных узлов. stat - это на самом деле statement. stat сделано типа object - чтобы оно автоматически не обходилось
///</summary>
[Serializable]
public partial class semantic_check_sugared_statement : statement
public partial class semantic_check_sugared_statement_node : statement
{
///<summary>
///Конструктор без параметров.
///</summary>
public semantic_check_sugared_statement()
public semantic_check_sugared_statement_node()
{
}
@ -38543,7 +38543,7 @@ namespace PascalABCCompiler.SyntaxTree
///<summary>
///Конструктор с параметрами.
///</summary>
public semantic_check_sugared_statement(object _stat)
public semantic_check_sugared_statement_node(object _stat)
{
this._stat=_stat;
}
@ -38551,7 +38551,7 @@ namespace PascalABCCompiler.SyntaxTree
///<summary>
///Конструктор с параметрами.
///</summary>
public semantic_check_sugared_statement(object _stat,SourceContext sc)
public semantic_check_sugared_statement_node(object _stat,SourceContext sc)
{
this._stat=_stat;
source_context = sc;
@ -38577,7 +38577,7 @@ namespace PascalABCCompiler.SyntaxTree
/// <summary> Создает копию узла </summary>
public override syntax_tree_node Clone()
{
semantic_check_sugared_statement copy = new semantic_check_sugared_statement();
semantic_check_sugared_statement_node copy = new semantic_check_sugared_statement_node();
copy.Parent = this.Parent;
if (source_context != null)
copy.source_context = new SourceContext(source_context);
@ -38591,9 +38591,9 @@ namespace PascalABCCompiler.SyntaxTree
}
/// <summary> Получает копию данного узла корректного типа </summary>
public new semantic_check_sugared_statement TypedClone()
public new semantic_check_sugared_statement_node TypedClone()
{
return Clone() as semantic_check_sugared_statement;
return Clone() as semantic_check_sugared_statement_node;
}
///<summary>
@ -38646,6 +38646,161 @@ namespace PascalABCCompiler.SyntaxTree
}
///<summary>
///
///</summary>
[Serializable]
public partial class sugared_expression : expression
{
///<summary>
///Конструктор без параметров.
///</summary>
public sugared_expression()
{
}
///<summary>
///Конструктор с параметрами.
///</summary>
public sugared_expression(object _sugared_expr,expression _new_expr)
{
this._sugared_expr=_sugared_expr;
this._new_expr=_new_expr;
}
///<summary>
///Конструктор с параметрами.
///</summary>
public sugared_expression(object _sugared_expr,expression _new_expr,SourceContext sc)
{
this._sugared_expr=_sugared_expr;
this._new_expr=_new_expr;
source_context = sc;
}
protected object _sugared_expr;
protected expression _new_expr;
///<summary>
///
///</summary>
public object sugared_expr
{
get
{
return _sugared_expr;
}
set
{
_sugared_expr=value;
}
}
///<summary>
///
///</summary>
public expression new_expr
{
get
{
return _new_expr;
}
set
{
_new_expr=value;
}
}
/// <summary> Создает копию узла </summary>
public override syntax_tree_node Clone()
{
sugared_expression copy = new sugared_expression();
copy.Parent = this.Parent;
if (source_context != null)
copy.source_context = new SourceContext(source_context);
if (attributes != null)
{
copy.attributes = (attribute_list)attributes.Clone();
copy.attributes.Parent = copy;
}
copy.sugared_expr = sugared_expr;
if (new_expr != null)
{
copy.new_expr = (expression)new_expr.Clone();
copy.new_expr.Parent = copy;
}
return copy;
}
/// <summary> Получает копию данного узла корректного типа </summary>
public new sugared_expression TypedClone()
{
return Clone() as sugared_expression;
}
///<summary>
///Свойство для получения количества всех подузлов без элементов поля типа List
///</summary>
public override Int32 subnodes_without_list_elements_count
{
get
{
return 1;
}
}
///<summary>
///Свойство для получения количества всех подузлов. Подузлом также считается каждый элемент поля типа List
///</summary>
public override Int32 subnodes_count
{
get
{
return 1;
}
}
///<summary>
///Индексатор для получения всех подузлов
///</summary>
public override syntax_tree_node this[Int32 ind]
{
get
{
if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1)
throw new IndexOutOfRangeException();
switch(ind)
{
case 0:
return new_expr;
}
return null;
}
set
{
if(subnodes_count == 0 || ind < 0 || ind > subnodes_count-1)
throw new IndexOutOfRangeException();
switch(ind)
{
case 0:
new_expr = (expression)value;
break;
}
}
}
///<summary>
///Метод для обхода дерева посетителем
///</summary>
///<param name="visitor">Объект-посетитель.</param>
///<returns>Return value is void</returns>
public override void visit(IVisitor visitor)
{
visitor.visit(this);
}
}
}

View file

@ -1313,11 +1313,17 @@ namespace PascalABCCompiler.SyntaxTree
///<returns> Return value is void </returns>
void visit(slice_expr_question _slice_expr_question);
///<summary>
///Method to visit semantic_check_sugared_statement.
///Method to visit semantic_check_sugared_statement_node.
///</summary>
///<param name="_semantic_check_sugared_statement">Node to visit</param>
///<param name="_semantic_check_sugared_statement_node">Node to visit</param>
///<returns> Return value is void </returns>
void visit(semantic_check_sugared_statement _semantic_check_sugared_statement);
void visit(semantic_check_sugared_statement_node _semantic_check_sugared_statement_node);
///<summary>
///Method to visit sugared_expression.
///</summary>
///<param name="_sugared_expression">Node to visit</param>
///<returns> Return value is void </returns>
void visit(sugared_expression _sugared_expression);
}

Binary file not shown.

View file

@ -25,7 +25,7 @@ namespace SyntaxVisitors.SugarVisitors
public override void visit(assign_tuple asstup)
{
var sl = new statement_list();
sl.Add(new semantic_check_sugared_statement(asstup)); // Это нужно для проверок на этапе преобразования в семантику
sl.Add(new semantic_check_sugared_statement_node(asstup)); // Это нужно для проверок на этапе преобразования в семантику
var tname = "#temp_var" + UniqueNumStr();
var tt = new var_statement(new ident(tname), asstup.expr);
@ -48,7 +48,7 @@ namespace SyntaxVisitors.SugarVisitors
public override void visit(assign_var_tuple assvartup)
{
var sl = new List<statement>();
sl.Add(new semantic_check_sugared_statement(assvartup)); // Это нужно для проверок на этапе преобразования в семантику
sl.Add(new semantic_check_sugared_statement_node(assvartup)); // Это нужно для проверок на этапе преобразования в семантику
var tname = "#temp_var" + UniqueNumStr();
var tt = new var_statement(new ident(tname), assvartup.expr); // тут для assvartup.expr внутри повторно вызывается convert_strong, это плохо, но если там лямбда, то иначе - с semantic_addr_value - не работает!!!

View file

@ -19415,19 +19415,25 @@ namespace PascalABCCompiler.TreeConverter
visit(pc);
}
public override void visit(SyntaxTree.semantic_check_sugared_statement st)
public override void visit(SyntaxTree.semantic_check_sugared_statement_node st)
{
if (st.stat is SyntaxTree.assign_var_tuple)
if (st.stat is SyntaxTree.assign_tuple)
{
check_sugared(st.stat as SyntaxTree.assign_var_tuple);
check_sugared(st.stat as SyntaxTree.assign_tuple);
}
else
else
{
AddError(get_location(st), "MISSED_SEMANTIC_CHECK_FOR_SUGARED_NODE_{0}");
}
ret.reset(); // обязательно очистить - этот узел в семантику ничего не должен приносить!
}
public override void visit(SyntaxTree.sugared_expression ex)
{
//semantic_check_sugared_expression(ex.sugared_expr);
visit(ex.new_expr);
}
/*public SyntaxTree.question_colon_expression ConvertToQCE(dot_question_node dqn)
{
// Неверно работает. Пока не используется. Доделать

View file

@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PascalABCCompiler.SyntaxTree;
using PascalABCCompiler.TreeRealization;
namespace PascalABCCompiler.TreeConverter
{
public partial class syntax_tree_visitor
{
void semcheck_slice_expr_helper(SyntaxTree.slice_expr sl)
{
var semvar = convert_strong(sl.v);
if (semvar is typed_expression)
semvar = convert_typed_expression_to_function_call(semvar as typed_expression);
var t = ConvertSemanticTypeNodeToNETType(semvar.type);
var IsSlicedType = 0; // проверим, является ли semvar.type динамическим массивом, списком List или строкой
// semvar.type должен быть array of T, List<T> или string
if (t == null)
IsSlicedType = 0; // можно ничего не присваивать :)
else if (t.IsArray)
IsSlicedType = 1;
else if (t == typeof(System.String))
IsSlicedType = 2;
else if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(System.Collections.Generic.List<>))
IsSlicedType = 3;
if (IsSlicedType == 0)
AddError(get_location(sl.v), "BAD_SLICE_OBJECT");
var semfrom = convert_strong(sl.from);
var b = convertion_data_and_alghoritms.can_convert_type(semfrom, SystemLibrary.SystemLibrary.integer_type);
if (!b)
AddError(get_location(sl.from), "INTEGER_VALUE_EXPECTED");
var semto = convert_strong(sl.to);
b = convertion_data_and_alghoritms.can_convert_type(semto, SystemLibrary.SystemLibrary.integer_type);
if (!b)
AddError(get_location(sl.to), "INTEGER_VALUE_EXPECTED");
if (sl.step != null)
{
var semstep = convert_strong(sl.step);
b = convertion_data_and_alghoritms.can_convert_type(semstep, SystemLibrary.SystemLibrary.integer_type);
if (!b)
AddError(get_location(sl.step), "INTEGER_VALUE_EXPECTED");
}
}
public void semcheck(SyntaxTree.slice_expr sl)
{
semcheck_slice_expr_helper(sl);
}
public void semcheck(SyntaxTree.slice_expr_question sl)
{
semcheck_slice_expr_helper(sl);
}
}
}

View file

@ -9,3 +9,5 @@ BAD_SLICE_OBJECT=Slices are allowed for strings, dynamic arrays and lists only
ONLY_IN_SHORT_FUNC_DEFS_RETURN_TYPE_CANBE_OMITTED=Only in short function definitions you can omit the return type
ONE_TKIDENTIFIER=Type here must be identifier
SUGARED_NODE_{0}_IN_SYNTAX_TREE_VISITOR=Sugared node {0} must not be visited in syntax_tree_visitor
MISSED_SEMANTIC_CHECK_FOR_SUGARED_NODE_{0}=Missed semantic check for sugared node {0}

View file

@ -9,3 +9,4 @@ BAD_SLICE_OBJECT=Срезы допустимы только для строк,
ONLY_IN_SHORT_FUNC_DEFS_RETURN_TYPE_CANBE_OMITTED=Только в коротких определениях функций можно не указывать тип возвращаемого значения
ONE_TKIDENTIFIER=В качестве типа ожидался идентификатор
SUGARED_NODE_{0}_IN_SYNTAX_TREE_VISITOR=Сахарный узел {0} не должен обходиться в syntax_tree_visitor. Обратитесь к разработчикам PascalABC.NET
MISSED_SEMANTIC_CHECK_FOR_SUGARED_NODE_{0}=Отсутствует семантическая проверка для сахарного узла {0}