15

作为我正在从事的项目的一部分,我需要为一种编程语言实现一个解释器。我不认为这个项目的细节太相关,除了它需要我从头开始实现一个解释器,我不能使用现有的编程语言(要求包括支持可移植的定界延续,并且能够编写一个Javascript 和 Java 中的解释器)。

显然,我真的宁愿避免发明一种全新的编程语言,所以我希望有一些非常简单的语言可以复制,或者至少从中汲取灵感。

我的第一个想法是 Forth 或类似 Lisp 的基本语言,但我真的更希望该语言具有更接近更流行的编程语言(如 Java、Python 或 Ruby)的语法。特别是,这意味着支持中缀运算符 (a+b),以及 a=b 变量分配。

换句话说,我希望今天使用 PHP 编程的人对这种语言相当熟悉,而且我认为 Forth 或 Lisp 都不符合这个标准。

任何人都可以对这种语言提出任何建议吗?

4

12 回答 12

15

我认为 Lisp 和 Forth 有一些最简单的幼稚解释器。

您可以选择一种简单的动态语言,最难的部分是构建解析器。例如,JavaScript 的一个子集可能会起作用。解释器基本上是遍历AST,做各个节点的操作。

在任何情况下,研究可以嵌入到您的开发环境中的现有脚本语言,并避免不惜一切代价自己滚动。实现编译器(广义上)非常有趣,但从长远来看维护起来可能很昂贵。

于 2010-10-13T22:58:59.997 回答
12

这听起来像是Lua的工作。

  • 它是一种小型语言,旨在易于实现
  • Java中已经有几个实现,至少 Javascript 正在开发中。
  • 它的语法满足您的要求(赋值、中缀运算符)。

您剩下的工作是实现定界延续,但当您排除 Lisp/Scheme 时,您就已经知道了。

于 2010-10-15T17:28:22.177 回答
8

Tcl。语法与 Lisp 一样简单,并且它有一个expr用于中缀算术的 proc。它甚至{}用于块,所以如果你眯着眼睛,你可以告诉人们它是一种类似 C 的语言。

它没有中缀赋值a=b,但是一旦你开始走上通用中缀表示法的道路,语言就会变得非常复杂,所以我不确定它如何与你的其他要求兼容。

于 2010-10-13T23:34:28.747 回答
6

SmalltalkIo都有非常简单但富有表现力的语法。

于 2010-10-14T03:21:45.550 回答
4

Logo 是一种简单的类似 Lisp 的语言,没有括号和几百个实现。

维基百科上的标志信息

有关实施的信息,请参阅此 PDF:徽标树

于 2010-10-14T09:09:49.773 回答
4

脑残?我的意思是它只有 8 个命令,每个命令都映射到一个字符。

于 2010-10-13T23:03:55.460 回答
2

我认为这既是对您自己的启迪的练习,也是对有用的最终产品的渴望。

在这种情况下,我必须同意其他推荐类似 Lisp 语言变体的人的观点,至少在第一次通过时,尤其是如果您以前没有这样做过。

Lua 是一种非常流行的脚本语言,用于需要小的、不是特别高性能的用户脚本的这类事情。

您还可以考虑 javascript 本身(或子集)是否满足您的要求。

另请参阅此处的列表: http ://en.wikipedia.org/wiki/Continuation#Programming_language_support

于 2010-10-13T23:17:33.527 回答
2

先搭建一个LISP解释器,这个会比较简单。

您将获得大量语言解析方面的经验,而不会受到额外功能要求的阻碍。

于 2010-10-13T23:09:43.370 回答
1

你可以使用 Lisp 子集,如果你使用甜美表达式,或者至少是卷曲中缀表示法,仍然有一个更自然的表示法:

  • Curly-infix 添加中缀,将 {a + b} 读作 (+ ab),并支持 f(x) 等传统函数表示法。在 SRFI-105 中查看更多信息。

  • Sweet-expressions 建立在 curly-infix 之上,并添加了与语法相关的缩进。在 SRFI-110 中查看更多信息。它的 URL 是http://srfi.schemers.org/srfi-110/ (对于 SRFI-105,只需将“110”替换为“105”)。

两者都由 Readable Lisp S-expressions Project 实现: http ://readable.sourceforge.net/

享受!

于 2013-03-14T22:58:15.690 回答
1

从无到有引导一个简单的编译器

于 2010-10-16T03:19:41.013 回答
1

聚碳酸酯

于 2010-10-13T23:17:20.280 回答
0

我建议你从 lisp 的一个子集开始——基本上是 car、cdr、cons 和 quote。确保你有一个基本的扫描器来处理无效字符,然后是无效类型(比如 cons 需要 2 个 args,2nd 必须是一个列表)。您可以通过了解基本数据结构来完成此操作(仅链表可以做到这一点,但双重链接或循环要好得多)。

于 2010-10-13T23:29:55.990 回答