Re[2]: как распечатать AST во время компиляции?
От: xeno.by xeno.by
Дата: 28.09.11 14:48
Оценка:
Иногда хочется просто дампнуть текст — у меня, например, студия не установлена, и я пишу в емаксе. В любом случае, я нафигачил простенькую реализацию на рефлекшне. Кстати, приятно писать на Немерле — все базовые привычки после сишарпа работают. А вот к Скале мне пришлось пару дней привыкать =)

using System;
using System.Linq;
using System.Text;
using System.Console;
using System.Reflection;
using System.Reflection.BindingFlags;
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;

class Helper
{
    public static Render(this exprs : list[PExpr]) : String
    {
        def buf = StringBuilder();
        buf.Append("[");

        mutable first = true;
        foreach (expr in exprs)
        {
            if (first) { first = false; }
            else { buf.Append(", "); }

            buf.Append(expr.Render());
        }
                                                             
        buf.Append("]");
        buf.ToString();    
    }

    public static Render(this expr : PExpr) : String 
    {
        def buf = StringBuilder();
        def t = expr.GetType();
        buf.Append(t.Name);
        buf.Append("(");

        mutable first = true;
        foreach (f in t.GetFields(Public | Instance | DeclaredOnly))
        {
            if (first) { first = false; }
            else { buf.Append(", "); }

            buf.Append(f.Name);
            buf.Append(" = ");

            def v = f.GetValue(expr);
            if (v is PExpr) buf.Append((v :> PExpr).Render());
            else if (v is list[PExpr]) buf.Append((v :> list[PExpr]).Render()); 
            else buf.Append(v.ToString());
        }
                                                             
        buf.Append(")");
        buf.ToString();
    }

    public static Dump(this exprs : list[PExpr]) : void
    {
        WriteLine(exprs.Render());
    }

    public static Dump(this expr : PExpr) : void
    {
        WriteLine(expr.Render());
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.