我开始使用 Irony(版本 Irony_2012_03_15),但在尝试生成 AST 时我很快就卡住了。下面是一个抛出异常的完全约束语言:
[Language("myLang", "0.1", "Bla Bla")]
public class MyLang: Grammar {
public NModel()
: base(false) {
var number = TerminalFactory.CreateCSharpNumber("number");
var binExpr = new NonTerminal("binExpr", typeof(BinaryOperationNode));
var binOp = new NonTerminal("BinOp");
binExpr.Rule = number + binOp + number;
binOp.Rule = ToTerm("+");
RegisterOperators(1, "+");
//MarkTransient(binOp);
this.Root = binExpr;
this.LanguageFlags = Parsing.LanguageFlags.CreateAst; // if I uncomment this line it throws the error
}
}
一旦我取消注释最后一行,它就会在语法资源管理器中或当我想解析测试时抛出 NullReferenceException。错误在 AstBuilder.cs 第 96 行:
parseNode.AstNode = config.DefaultNodeCreator();
DefaultNodeCreator 是一个尚未设置的委托。
我试过用 MarkTransient 等设置东西,但没有骰子。
有人可以帮我在这里漂浮吗?我可能遗漏了一些明显的东西。在整个网络上寻找 AST 教程,但我似乎无法找到有关其工作原理的解释。
提前致谢,
格特-扬