我开始使用 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 是一个尚未设置的委托(delegate)。
我试过用 MarkTransient 等设置东西,但没有骰子。
有人可以帮我在这里漂浮吗?我可能遗漏了一些明显的东西。在整个网络上寻找 AST 教程,但我似乎无法找到有关其工作原理的解释。
提前致谢,
格特-扬
最佳答案
一旦设置 LanguageFlags.CreateAst
语法上的标志,您必须提供有关如何创建 AST 的附加信息。
你应该能够设置AstContext.Default*Type
对于整个语言,但目前是错误的。
TermFlags.NoAstNode
. Irony 将忽略此节点及其子节点。 AstConfig.NodeCreator
.这是一个可以做正确事情的代表。 AstConfig.NodeType
到 AstNode 的类型。这种类型应该是可访问的,实现 IAstInit
,并且有一个公共(public)的、无参数的构造函数。在这种情况下,可访问意味着 public
或 internal
与 InternalsVisibleTo
属性。 关于parsing - 具有讽刺意味的 AST 生成抛出 nullreferenceexception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10541289/