给定一个语法和附加的动作代码,是否有任何标准的解决方案可以推断出每个生产需要产生什么类型(因此,调用生产应该从中获得什么类型)?
我正在考虑使用类似c#var
语法的OO程序和动作代码(但我不是在寻找具体的c#)。
如果不是函数重载和递归语法,这将非常简单。
问题出现在这样的案例中:
Foo ::=
Bar Baz { return Fig(Bar, Baz); }
Foo Pit { return Pop(Foo, Pit); } // typeof(foo) = fn(typeof(Foo))
答案 0 :(得分:4)
如果您使用函数式语言编写代码,则很容易;标准的Hindley-Milner型推理效果很好。 不要这样做。在我的EBNF解析器生成器(从未发布,但源代码可根据要求提供),它支持Icon,c和Standard ML,我实际上实现了你想要的标准ML后端的想法:所有推断出类型。 结果语法几乎无法调试。
如果你将重载投入混合,结果只会难以调试。 (这是正确的!这只是在!比不可能更难!大于无限!过我的睡觉时间!)如果你真的想亲自尝试一下,欢迎你my code。 (你没有;有一个原因我从未发布它。)
答案 1 :(得分:1)
语法操作的返回值实际上与局部变量没有什么不同,因此您应该能够使用C#类型推断来完成这项工作。有关如何实现C#类型推断的一些见解,请参阅this paper。
进行类型推断的标准方法是Hindley-Milner algorithm,但这不会处理开箱即用的重载。
请注意,即使是类型推断语言的解析器生成器通常也不会推断语法操作的类型。例如,ocamlyacc需要类型注释。 Haskell的Happy解析器生成器可以infer types,但似乎不鼓励这种做法。这可能表明语法中的推断类型很难,一个坏主意或两者兼而有之。
[更新] Norman Ramsey非常关注他,他有痛苦的经历。