Skip to content
This repository has been archived by the owner on Jun 23, 2018. It is now read-only.

添加一种语言

JasinYip edited this page Dec 8, 2014 · 1 revision

向 jsREPL 添加一种语言

创建下面这两个路径下的目录(相对于 jsREPL 目录):

  1. extern/{语言名}:用于存放该语言的解释器的代码(可以是一个 git 子模块(submodule))。
  2. langs/{语言名}:用于存放语言引擎接口。

语言引擎接口

langs/{语言名} 下创建一个 CoffeeScript 类(class),建议将文件名写为 jsrepl_{语言名}.coffee,作为语言引擎用的接口。

类的名称必须是 self.JSREPLEngine,并且实现以下两个方法:

  1. constructor: (input, output, result, error, sandbox, ready) ->: 这是引擎的构造函数,它会在语言第一次加载时被调用,同时负责实例化一个解释器。调用时带有以下参数:

    • (方法) input:程序一个每次用户输入都会被调用的方法。当被调用时,它必须通过一个延拓(continuation)方法来接收用户的输入并继续执行。
    • (方法) output:语言输出时会被调用的方法。
    • (方法) result:返回 eval 的返回值一起被调用的方法。
    • (方法) error:当引擎有错误输出时会被调用的方法。
    • (对象) sandbox:一个包含语言的沙盒,可能是一个 iframe 窗口或一个 Web Worker
      • (方法) ready:当语言做好接收输入的准备时被调用的方法。
  2. Eval: (command) -> : 调用时将字符串计算成该语言的代码并执行,任何返回值都必须通过上面提到的 result 方法进行返回。

  3. GetNextLineIndent: (command) ->: 将 command 发送到 Eval 方法的之前,会调用这个方法,据此来决定 command 是否准备执行多行命令。 返回值:

  • false:表示单行指令,应该让它继续执行 Eval 方法。
  • (数字):解释器应该等待多行代码的输入,然后才将它们推送到 Eval 方法中。该数字表示下一行的缩进层次。

查看 Javascript 接口

配置语言

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)。
Clone this wiki locally