|
|
1
76
我喜欢你的目标,但这是一项艰巨的任务。几点提示:
祝你好运通过课堂上的支持性证据,确定Haskell的语言水平,将对社区产生巨大的好处,并且肯定是一个可发布的结果! |
|
|
2
37
有一个完整的Haskell解析器: http://hackage.haskell.org/package/haskell-src-exts
然后,您有一个模块的AST:
您所需要做的就是定义一个白名单——其中包括可用的声明、导入、符号和语法,然后遍历AST并对您不希望他们知道的任何内容抛出“解析错误”。可以使用附加到AST中每个节点的SrcLoc值:
没有必要重新实现Haskell。如果您想提供更友好的编译错误,只需解析代码,过滤代码,将其发送给编译器,然后解析编译器输出。如果是“a”,则无法与推断的类型a匹配
除非你真的想花时间从头开始实现Haskell,或者搞乱Hugs的内部结构,或者一些愚蠢的实现,否则我认为你应该过滤传递给GHC的内容。这样,如果您的学生希望获得他们的代码库并进入下一步,编写一些真正成熟的Haskell代码,那么转换是透明的。 |
|
|
3
24
Write yourself a Scheme in 48 hours 对语法分析和解释技术进行冷静而实用的介绍。
因此,您应该定义Haskell的一个相当小的子集来使用,然后可以一步一步地扩展Scheme示例。 补充:
要使用的包是 hint (Language.Haskell.*) |
|
|
4
20
这将类似于 HLint
|
|
|
5
16
http://hackage.haskell.org/package/baskell 您可以从选择要实现的系统类型开始。这和Scheme的解释器一样复杂, http://hackage.haskell.org/package/thih |
|
|
6
6
EHC系列编译器可能是最好的选择:它是积极开发的,似乎正是您想要的——一系列小型lambda calculi编译器/解释器,最终在Haskell'98中达到顶峰。 类型和编程语言 ,或氦翻译(一个残废的哈斯克尔,专为学生设计的) http://en.wikipedia.org/wiki/Helium_(Haskell) ). |
|
|
7
6
如果您正在寻找易于实现的Haskell的子集,则可以取消类型类和类型检查。没有类型类,就不需要类型推断来计算Haskell代码。 我写了一封信 self-compiling Haskell subset compiler 对于有兴趣为Haskell子集实现解释器的学生,我建议从以下特性开始:
更具体地说,编写一个可以运行以下命令的解释器:
类型检查是Haskell的一个关键特性。然而,从零到类型检查Haskell编译器是非常困难的。如果您开始为上面的内容编写一个解释器,那么向其中添加类型检查应该不会那么困难。 |
|
|
8
3
你可以看看 Happy (Haskell中类似yacc的解析器)具有Haskell解析器。 |
|
|
10
2
看看是否 helium |
|
|
11
2
Uhc/Ehc是一系列启用/禁用各种Haskell功能的编译器。 http://www.cs.uu.nl/wiki/Ehc/WebHome#What_is_UHC_And_EHC |
|
|
12
2
我听说了 Idris 有一个相当紧凑的解析器,不确定它是否真的适合修改,但它是用Haskell编写的。 |
|
|
13
2
安德烈·鲍尔氏 Programming Language Zoo 有一个纯函数式编程语言的小实现,有点冒失地命名为“minihaskell”。它大约有700行OCaml,所以很容易消化。
|
|
14
1
你不觉得这样更容易接受吗 the GHC sources 去掉你不想要的东西,而不是从头开始编写自己的Haskell解释器?一般来说,应该有一个 大量 减少工作投入 移除 功能,而不是创建/添加功能。 不管怎么说,GHC是用Haskell编写的,所以从技术上讲,这就是用Haskell编写的Haskell解释器的问题。
|
|
|
15
0
有这么多LISP解释器的原因是LISP基本上是JSON的前身:一种简单的数据编码格式。这使得前端部分很容易处理。相比之下,Haskell,尤其是语言扩展,并不是最容易解析的语言。 以下是一些听起来很难理解的句法结构:
每一个问题,也许除了操作符,都可以由学生在他们的编译器构造课程结束后解决,但这会让人们把注意力从Haskell的实际工作方式上移开。除此之外,您可能不希望直接实现Haskell的所有语法构造,而是实现传递来消除它们。这就把我们带到了这个问题的字面核心,即双关语。
我的建议是实施类型检查和翻译
此外,您不应该回避使用GHC(或其他编译器)的前端。
我不认为这是作弊,因为自定义LISP使用主机LISP系统的解析器(至少在引导过程中)。清理
这里有一些链接指向
|