pascalabcnet/TreeConverter/TreeConversion/returner.cs

103 lines
3.4 KiB
C#
Raw Normal View History

2015-06-01 22:15:17 +03:00
// Copyright (c) Ivan Bondarev, Stanislav Mihalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
//Используется для возвращения значения при обходе дерева.
2015-05-14 22:35:07 +03:00
//(ssyy) 01.12.2007
//returner восполняет тот недостаток, что функции visit класса syntax_tree_visitor
//сами ничего не возвращают.
//Я внёс изменения в концепцию реализации класса returner.
//Теперь здесь только одна переменная ret_semantic типа semantic_node.
//Она приводится при необходимости к нужному типу.
//Внешне при этом работа с классом returner не изменилась.
2015-05-14 22:35:07 +03:00
using System;
using PascalABCCompiler.TreeRealization;
namespace PascalABCCompiler.TreeConverter
{
public class returner
{
private semantic_node ret_semantic;
private syntax_tree_visitor syntax_tree_visitor;
public returner(syntax_tree_visitor stv)
{
syntax_tree_visitor = stv;
}
public expression_node get_expression()
{
return ret_semantic as expression_node;
}
public void reset()
{
ret_semantic = null;
}
public semantic_node visit(SyntaxTree.syntax_tree_node tn)
{
tn.visit(syntax_tree_visitor);
return ret_semantic;
}
public statement_node visit(SyntaxTree.statement st)
{
st.visit(syntax_tree_visitor);
return ret_semantic as statement_node;
}
public expression_node visit(SyntaxTree.expression expr)
{
expr.visit(syntax_tree_visitor);
/*addressed_expression ad = ret_semantic as addressed_expression;
if (ad != null && ad.is_addressed)
{
if (convertion_data_and_alghoritms.check_for_constant(ad))
ad.is_addressed = false;
}*/
//Надеюсь, это сильно не скажется на производительности, хотя в другом случае этот же код просто будет разбросан по всем метдам syntax_tree_visitor-а.
2015-05-14 22:35:07 +03:00
base_function_call bfc = ret_semantic as base_function_call;
if (bfc != null)
{
if (bfc.simple_function_node.compile_time_executor != null)
{
expression_node ex = bfc.simple_function_node.compile_time_executor(bfc.location, bfc.parameters.ToArray());
if (ex != null)
{
return ex;
}
}
}
return ret_semantic as expression_node;
}
public type_node visit(SyntaxTree.type_definition type_def)
{
type_def.visit(syntax_tree_visitor);
return ret_semantic as type_node;
}
public addressed_expression visit(SyntaxTree.addressed_value av)
{
av.visit(syntax_tree_visitor);
return ret_semantic as addressed_expression;
}
public void return_value(semantic_node sn)
{
ret_semantic = sn;
}
public semantic_node get_result()
{
return ret_semantic;
}
}
}