pascalabcnet/TreeConverter/TreeConversion/returner.cs

103 lines
3.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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;
}
}
}