Я ' В 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("{0}>", 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);
Которая включена в стандартную процедуру оценки… возможно, она хорошо работает для калькулятора, но не так сильно для меня. Сейчас пытаюсь понять, как обойти интерпретатор скриптов, но тогда я не знаю, как установить глобальные переменные.