我需要为编程语言实现一个解释器,作为我正在研究的项目的一部分。我不认为这个项目的细节太相关,除了它要求我从头开始实现一个解释器,我不能使用现有的编程语言(要求包括支持便携式分隔连续,并能够编写一个Javascript和Java中的解释器。
显然我宁愿避免发明一种全新的编程语言,所以我希望有一些非常简单的语言可以复制,或者至少从中汲取灵感。
我的第一个想法是Forth或一种基本的类似Lisp的语言,但是我更喜欢这种语言的语法更接近更流行的编程语言,如Java,Python或Ruby。特别是,这意味着支持中缀运算符(a + b),以及a = b变量赋值。
换句话说,我希望这种语言对今天用PHP编程的人感觉相当熟悉,我不相信Forth或Lisp都符合这个标准。
有人可以为这种语言提供任何建议吗?
答案 0 :(得分:14)
我认为Lisp和Forth有一些最简单的天真翻译。
您可以选择一种简单的动态语言,最难的部分就是构建解析器。例如,JavaScript的子集可能有效。解释器基本上遍历AST并执行每个节点的操作。
无论如何,研究可以嵌入到开发环境中的现有脚本语言,并避免不惜一切代价滚动自己的脚本语言。实现编译器(广义上讲)非常有趣,但从长远来看,维护起来可能很昂贵。
答案 1 :(得分:10)
这听起来像是Lua的工作。
你留下的工作是实现分隔的延续,但是当你排除Lisp / Scheme时就已经知道了。
答案 2 :(得分:8)
的Tcl。语法和Lisp一样简单,并且它有一个expr
proc用于中缀算术。它甚至使用{}
作为块,所以如果你恰到好处地斜视,你可以告诉人们它是一种类似C的语言。
它没有中缀赋值a=b
,但是一旦你开始使用通用中缀表示法,语言变得非常复杂,所以我不确定它是如何与你的其他要求兼容的。
答案 3 :(得分:6)
答案 4 :(得分:4)
答案 5 :(得分:3)
Brainfuck?我的意思是它只有8个命令,每个命令映射到一个字符。
答案 6 :(得分:2)
首先构建一个LISP解释器,这将是相对简单。
您将在语言分析方面获得大量经验,而不会受到其他功能要求的限制。
答案 7 :(得分:2)
我认为这对于你自己的教化来说是一种运动,因为它需要一种有用的最终产品。
在这种情况下,我必须同意推荐类似Lisp语言变体的其他人,至少在第一遍时,尤其是如果你之前没有这样做过。
Lua是一种非常流行的脚本语言,需要很小的,而不是特别高效的用户脚本。
您也可以考虑javascript本身(或子集)是否符合您的要求。
另请参阅此处的列表: http://en.wikipedia.org/wiki/Continuation#Programming_language_support
答案 8 :(得分:1)
答案 9 :(得分:1)
答案 10 :(得分:0)
我建议你从lisp的一个子集开始 - 基本上是car,cdr,cons和quote。确保你有一个处理无效字符的基本扫描程序,然后是无效类型(比如cons需要2个args,第2个必须是列表)。你可以通过基本数据结构的知识来完成这项工作(单独链接列表可以做到这一点,但双重链接或循环更好)。
答案 11 :(得分:0)
如果你使用sweet-expressions,或者至少使用卷曲中缀表示法,你可以使用Lisp子集并且仍然有更自然的表示法:
Curly-infix通过将{a + b}读为(+ a b)来添加中缀,并支持传统的函数符号,如f(x)。在SRFI-105中查看更多信息。
Sweet-expressions基于卷曲中缀构建,并添加与语法相关的缩进。在SRFI-110中查看更多信息。其网址为http://srfi.schemers.org/srfi-110/(对于SRFI-105,只需将“110”替换为“105”)。
两者都是由Readable Lisp S表达式项目实现的: http://readable.sourceforge.net/
享受!