我正在使用 Antlr 和表达式树编写一种语言。
我已经为我的树解析器定义了一个标准的工厂方法,以便在生成加法时使用,它对于内置的整数类型非常有效,现在我正在转向更通用的类型。
目前它非常天真,它只是这样做(进行中的 TDD 代码通常看起来很天真!?):
protected Expression GenerateAdd(Expression left, Expression right)
{
if (left.Type.Equals(right.Type))
return Expression.Add(left, right);
if (left.Type.IsValueType && right.Type.IsValueType)
Promote7_2_6_2(ref left, ref right);
return Expression.Add(left, right);
}
WherePromote7_2_6_2
生成遵循 C# 规范 7.2.6.2 规定的积分提升规则的 Convert 表达式(该语言将类似于 C#,但将与 JScript 交叉以及具有其他全新的关键字)。
自然地,我继续测试字符串添加 - 即"a" + "b";
我得到了错误:
System.InvalidOperationException: The binary operator Add is not defined for the types 'System.String' and 'System.String'.
很公平 - 我反映 System.String 并且确实没有定义该运算符。在这样的测试方法中生成表达式树:
Expression<Func<string, string, string>> e = (s1, s2) => s1 + s2;
表明确实创建了 Add BinaryExpression,但实现方法设置为其中一种string.Concat
方法。
我知道在某些情况下我将不得不考虑做这样的事情,但是有多少其他类型以这种方式定义加法?只是string
吗?
它是嵌入在 C# 编译器中的规则 - 还是有某种可发现的元数据可用于在其他类型上自动发现此类方法?
提前致谢!