Ирония: учебник по оценке узлов AST?

Я определил простую грамматику в Иронии и создал хороший компактный AST.

Сейчас я пытаюсь понять, как это оценить. Проблема в том, что я не могу найти учебники о том, как это сделать.

Я определил только 2 узла AST:

class TagListNode : AstNode
{
    public override void Init(ParsingContext context, ParseTreeNode treeNode)
    {
        base.Init(context, treeNode);
        AsString = "TagList";
        foreach (var node in treeNode.ChildNodes)
            AddChild(null, node);
    }

    public override void EvaluateNode(Irony.Interpreter.EvaluationContext context, AstMode mode)
    {
        foreach (var node in ChildNodes)
            node.EvaluateNode(context, AstMode.Read);
    }
}

class TagBlockNode : AstNode
{
    public AstNode Content;

    public override void Init(ParsingContext context,ParseTreeNode treeNode)
    {
        base.Init(context, treeNode);
        AsString = treeNode.ChildNodes[0].FindTokenAndGetText();
        Content = AddChild(null, treeNode.ChildNodes[1]);
    }

    public override void EvaluateNode(EvaluationContext context, AstMode mode)
    {
        context.Write(string.Format("<{0}>", AsString));
        Content.EvaluateNode(context, AstMode.Read);
        context.Write(string.Format("</{0}>", AsString));
    }
}

Это сгенерирует следующий вывод:

 <html><head><title></title></head><body><h1></h1><p></p><p></p></body></html>3.14159265358979

Принимая во внимание, что вывод, который я хочу, является:

<html>
    <head>
        <title>page title</title>
    </head>
    <body>
        <h1>header</h1>
        <p>paragraph 1</p>
        <p>3.14159265358979</p>
    </body>
</html> 

Я не думаю, что я должен использовать Context.Write(), Образцы показывают толкание материала на context.Data и высовывать их... но я не совсем уверен, как это работает.

я догадываюсь pi прикрепляется в конце, потому что он автоматически выдвигается на context.Data а потом один элемент отрывается в конце?? Я не совсем уверен.

Несколько указателей или ссылка на учебник было бы неплохо.

Кроме того, как я должен обрабатывать различные типы узлов? Каждый "тег" может иметь 4 различных типа содержимого: другой тег, строковый литерал, переменную или число. Должен ли я писать такие вещи, как if(node is StringLiteral) .... в EvaluateNode метод или что?


Я нашел это, но они просто зацикливаются на AST и не пользуются EvaluateNode,

И затем это то, которое заменяет одно значение в стеке данных... но на самом деле не объясняет, как это выводится или что-то еще.


Чтобы было ясно, я специально хочу знать, как переопределить EvaluateNode методы в Irony.Ast.AstNode делать то, что я хочу.


Хорошо, я проследил этот фрагмент в конце этой строки:

    if (EvaluationContext.HasLastResult)
      EvaluationContext.Write(EvaluationContext.LastResult + Environment.NewLine);

Что входит в стандартную процедуру оценки.... возможно, это хорошо работает для приложения калькулятора, но не так много в моем. Попытка выяснить, как обойти интерпретатор сценариев сейчас, но потом я не знаю, как установить глобальные переменные.

1 ответ

Лучший способ перебрать структуру AST - реализовать шаблон посетителя.

Может быть, эта ссылка поможет вам.

Другие вопросы по тегам