проекта TreeConverter, то есть, от семантического уровня Необходимо применить эти изменения и перекомпилировать в ОС РОСА
42 lines
1.5 KiB
C#
42 lines
1.5 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
|
||
using PascalABCCompiler.SyntaxTree;
|
||
using PascalABCCompiler.TreeRealization;
|
||
using PascalABCCompiler.SyntaxTreeConverters;
|
||
|
||
/// <summary>
|
||
/// Этот визитор позволяет при переходе к семантике заменить синтаксический узел lambda_any_type_node_syntax
|
||
/// на семантический lambda_any_type_node
|
||
/// Это - единственное место, которое делало зависимость синтаксиса от семантики и этот визитор ее убирает
|
||
/// Мы вызываем этот визитор в компиляторе сразу после всех синтаксических визиторов
|
||
/// </summary>
|
||
namespace SyntaxSemanticVisitors
|
||
{
|
||
public class LambdaAnyConverter : ISyntaxTreeConverter
|
||
{
|
||
public string Name { get; } = "LambdaAny";
|
||
public syntax_tree_node Convert(syntax_tree_node root)
|
||
{
|
||
LambdaAnyVisitor.New.ProcessNode(root);
|
||
return root;
|
||
}
|
||
}
|
||
|
||
public class LambdaAnyVisitor : BaseChangeVisitor
|
||
{
|
||
public static LambdaAnyVisitor New
|
||
{
|
||
get { return new LambdaAnyVisitor(); }
|
||
}
|
||
public override void visit(lambda_inferred_type lit)
|
||
{
|
||
if (lit.real_type is lambda_any_type_node_syntax)
|
||
lit.real_type = new lambda_any_type_node(); // семантический
|
||
}
|
||
}
|
||
}
|