我写了一个解析器生成器,它有这样的表达式:
a = f:"foo" "bar" { /* your code here */ }
经过一段时间后,它会生成如下所示的代码:
r0 = this.ReturnHelper<string>(cursor, cursor, () => /* your code here */);
这是完美的,因为用户可以指定一个表达式,比如f
只返回一个值,或者他们可以添加一组额外的花括号并编写一个方法。到目前为止,一切都很好。
现在,我也允许这样的断言:
a = w:word !{ w == "disallowed" }
目前编译成这样的东西:
var w = this.ParseWord(...).Value;
...
if (!( w == "disallowed" ))
{
r2 = new ParseResult<string>(cursor, cursor, string.Empty);
}
我希望断言支持 ReturnHelper 提供的相同方法体选项,但是拥有一个bool AssertionHelper(Func<bool> assertion)
只调用谓词的方法似乎效率低下。
我在想这new Func<bool>(() => /* your code here */)()
会起作用,但我不确定它是最有效的。
有任何想法吗?
编辑
怎么样 不,它会生成与上述版本相同的 IL。((Func<bool>)(() => /* code */))()
?这是否避免了分配?