This repository has been archived by the owner on Jun 23, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 100
添加一种语言
JasinYip edited this page Dec 8, 2014
·
1 revision
创建下面这两个路径下的目录(相对于 jsREPL 目录):
-
extern/{语言名}
:用于存放该语言的解释器的代码(可以是一个 git 子模块(submodule))。 -
langs/{语言名}
:用于存放语言引擎接口。
在 langs/{语言名}
下创建一个 CoffeeScript 类(class),建议将文件名写为 jsrepl_{语言名}.coffee
,作为语言引擎用的接口。
类的名称必须是 self.JSREPLEngine
,并且实现以下两个方法:
-
constructor: (input, output, result, error, sandbox, ready) ->
: 这是引擎的构造函数,它会在语言第一次加载时被调用,同时负责实例化一个解释器。调用时带有以下参数:- (方法)
input
:程序一个每次用户输入都会被调用的方法。当被调用时,它必须通过一个延拓(continuation)方法来接收用户的输入并继续执行。 - (方法)
output
:语言输出时会被调用的方法。 - (方法)
result
:返回eval
的返回值一起被调用的方法。 - (方法)
error
:当引擎有错误输出时会被调用的方法。 - (对象)
sandbox
:一个包含语言的沙盒,可能是一个 iframe 窗口或一个 Web Worker。- (方法)
ready
:当语言做好接收输入的准备时被调用的方法。
- (方法)
- (方法)
-
Eval: (command) ->
: 调用时将字符串计算成该语言的代码并执行,任何返回值都必须通过上面提到的result
方法进行返回。 -
GetNextLineIndent: (command) ->
: 将 command 发送到Eval
方法的之前,会调用这个方法,据此来决定 command 是否准备执行多行命令。 返回值:
-
false
:表示单行指令,应该让它继续执行Eval
方法。 -
(数字)
:解释器应该等待多行代码的输入,然后才将它们推送到Eval
方法中。该数字表示下一行的缩进层次。
languages.coffee是一套使用 jsREPL 的语言引擎配置器。每个引擎必须创建一个对象,用以封装所有配置参数:
@JSREPL::Languages::JavaScript =
name: 'JavaScript'
extension: 'js'
matchings: [
['(', ')']
['[', ']']
['{', '}']
]
scripts: [
'util/inspect.js'
]
includes: []
engine: 'langs/javascript/jsrepl_js.coffee'
worker_friendly: true
minifier: 'closure'
-
name
:编程语言的名字。 -
extension
:编程语言的文件后缀名。 -
matchings
:包含一组字符,用以匹配元组阵列(Ps:就是匹配括号的意思)。 -
scripts
:一个数组,用于存放脚本路径(路径相对于 jsREPL 根目录)。也可以是一个存放对象的数组,用于某些需要加载不同脚本的浏览器:- key : 浏览器识别字符串
- value : 脚本路径
-
includes
:一个数组,用于指定一些需要引用的文件(路径相对于 jsREPL 根目录)。 -
engine
:引擎接口的路径。 -
worker_friendly
:一个布尔值,表示是否允许在 Web Worker 中加载。 -
minifier
:一个字符串,用于建立工程时指定使用的压缩器:-
none
:不使用任何压缩器 -
yui
:使用 YUI 压缩器 -
uglify
:使用 uglifyJS -
closure
:使用闭包编译器(closure compiler) -
closure_es5
:使用带 ES5 支持的闭包编译器(closure compiler) -
closure_advanced
:使用闭包编译器(closure compiler) 的高级模式(advanced mode)。
-