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

Я ' В Irony я определил простую грамматику и сгенерировал красивый компактный 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("", AsString));
    }
}

Это даст следующий результат:

 

3.14159265358979

В то время как результат, который мне нужен, будет:


    
        page title
    
    
        

header

paragraph 1

3.14159265358979

Не думаю, что я должен использовать 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);

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

7
задан mpen 14 February 2011 в 18:20
поделиться