103 lines
3.4 KiB
C#
103 lines
3.4 KiB
C#
// 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)
|
||
//Используется для возвращения значения при обходе дерева.
|
||
|
||
//(ssyy) 01.12.2007
|
||
//returner восполняет тот недостаток, что функции visit класса syntax_tree_visitor
|
||
//сами ничего не возвращают.
|
||
//Я внёс изменения в концепцию реализации класса returner.
|
||
//Теперь здесь только одна переменная ret_semantic типа semantic_node.
|
||
//Она приводится при необходимости к нужному типу.
|
||
//Внешне при этом работа с классом returner не изменилась.
|
||
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-а.
|
||
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;
|
||
}
|
||
|
||
}
|
||
|
||
} |