Parsing 反语AST生成抛出空引用例外
我刚开始使用Irony(版本Irony_2012_03_15),但在尝试生成AST时,我很快就被卡住了。下面是引发异常的完全strpped语言:Parsing 反语AST生成抛出空引用例外,parsing,irony,Parsing,Irony,我刚开始使用Irony(版本Irony_2012_03_15),但在尝试生成AST时,我很快就被卡住了。下面是引发异常的完全strpped语言: [Language("myLang", "0.1", "Bla Bla")] public class MyLang: Grammar { public NModel() : base(false) { var number = TerminalFactory.CreateCSh
[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教程,但我似乎找不到关于如何工作的解释
提前感谢,
Gert Jan设置语法上的
LanguageFlags.CreateAst
标志后,必须提供有关如何创建AST的其他信息
您应该能够为整个语言设置AstContext.Default*Type
,但目前存在错误
- 设置
。Irony将忽略此节点及其子节点termsflags.NoAstNode
- 设置
。这是一个可以做正确事情的委托AstConfig.NodeCreator
- 将
设置为AstNode的类型。此类型应该是可访问的,实现AstConfig.NodeType
,并且具有公共的无参数构造函数。在这种情况下,可访问性表示具有IAstInit
属性的InternalsVisibleTo
或public
internal
我刚从Irony.Translator.TranslationLanguageGrammar类继承了我的语法,它很有效。此外,任何试图让AST正常工作的人,请确保您的节点是“公共的”:-除了Jay和Erti Chris的回复之外,此线程也很有用: Irony的创建者指出了
解释器LanguageGrammar.BuildAst
中的相关配置代码
嗨,杰,谢谢你的回答。实际上,由于可用的支持,已停止使用Irony作为解析器。遗憾的是,它看起来很好,可惜它没有抓住它应得的东西。希望你有一个亡灵巫师徽章@gjvdkamp您现在使用的解析器是什么?我有同样的问题,我也不满意这个项目的文档或网络教程支持。它可能是好的,但它完全无法传达它,使它毫无用处。最后一个真正运行良好的语法是.Net上的ANTLR,这在很大程度上也是因为ANTLRWorks。我已经离开这个话题很多年了,所以在此期间可能发生了很多事情。这两个版本的新版本看起来都很有希望。。。在F#上,您可能希望查看fParsec或活动模式。