SOSML:使用TypeScript编写的标准ML在线解释器

  • w5_482263
    了解作者
  • 299.7KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-11 22:33
    上传日期
SOSML:标准ML的在线解释器 SOSML是使用TypeScript编写的功能编程语言Standard ML(SML)的在线解释器。 SOSML在萨尔大学的新生中使用。 您可以在进行检查。 特征 正确地词法分析,细化和解释任何SML核心语言程序,即可能包含以下构造的程序: 支持的声明(部分支持的斜体声明) 值声明( val x = 42; ) 函数声明( fun f 0 = 42 | fx = f (x-1); ) 类型别名声明( type t = 'a -> (int * int) ) 数据类型声明( datatype tree = T of tree list; ) 不支持withtype 。 抽象数据类型声明( abstype tree = T of tree list with val empty = T []; )请注意, abstype是作为继承者ML提出的派生形
SOSML-main.zip
  • SOSML-main
  • .gitignore
    311B
  • tsconfig.json
    735B
  • README.md
    6.7KB
  • .github
  • workflows
  • deploy_test.yml
    405B
  • ISSUE_TEMPLATE
  • squid-report.md
    986B
  • feature_request.md
    910B
  • webpack.cli.js
    620B
  • test
  • simplify.ts
    14.9KB
  • squids.ts
    27.3KB
  • types.ts
    9.5KB
  • test_helper.ts
    4.3KB
  • parser.ts
    159.2KB
  • lexer.ts
    30.7KB
  • exhaustiveness.ts
    7.9KB
  • evaluate.ts
    15.8KB
  • test_examples.ts
    421.7KB
  • LICENSE
    34.3KB
  • package.json
    2.3KB
  • tslint.json
    2.6KB
  • src
  • initialState.ts
    30.8KB
  • errors.ts
    3.2KB
  • types.ts
    51.5KB
  • parser.ts
    91.6KB
  • lexer.ts
    21.3KB
  • evaluator.ts
    2.3KB
  • stdlib.ts
    6.9KB
  • expressions.ts
    115.1KB
  • stdlib
  • vector.ts
    8.5KB
  • char.ts
    3.6KB
  • eval.ts
    4.5KB
  • random.ts
    3.5KB
  • assert.ts
    11.4KB
  • real.ts
    7.1KB
  • list.ts
    6.4KB
  • int.ts
    1.6KB
  • listsort.ts
    3KB
  • string.ts
    4.7KB
  • math.ts
    9.6KB
  • array.ts
    11.2KB
  • state.ts
    46.3KB
  • main.ts
    9.1KB
  • declarations.ts
    62KB
  • modules.ts
    64.4KB
  • values.ts
    28.6KB
  • tokens.ts
    6.4KB
  • cli.ts
    2.6KB
  • webpack.dev.js
    533B
  • webpack.prod.js
    618B
  • webpack.config.js
    78B
  • package-lock.json
    560.7KB
内容介绍
# SOSML: The Online Interpreter for Standard ML SOSML is the online interpreter for the functional programming language Standard ML (SML), written in TypeScript. SOSML is used in a freshman class at Saarland University; you can check it out at https://sosml.org. ## Features Correctly lexing, parsing, elaborating and interpreting any SML core language program, i.e. a program that may contain the following constructs: * Supported declarations (_partially supported declarations in italics_) * [x] value declarations (`val x = 42;`) * [x] function declarations (`fun f 0 = 42 | f x = f (x-1);`) * [x] type alias declarations (`type t = 'a -> (int * int)`) * [x] datatype declarations (`datatype tree = T of tree list;`) * `withtype` will not be supported. * [x] abstract datatype declarations (`abstype tree = T of tree list with val empty = T [];`) Note that `abstype` is implemented as a derived form as proposed by Successor ML. * `withtype` will not be supported. * [x] exception declarations (`exception E of int;`) * [x] local declarations (`local val x = 42; in val y = x + 2; end;`) * [x] declaring operators as infix, nonfix, left, and right associative via `infix`, `infixr`, and `nonfix` * [x] `open` declarations * [x] structure declarations (`structure S = struct end;`) * [x] signature declarations (`signature S = sig end;`) * [x] functor declarations (experimental, `functor F = struct end;`) * Supported expressions (This list is non-exhaustive) * [x] tuple (`(1, 2, 3)`), records (`{a = 1, b = 2}`), and lists (`[1, 2, 3]`) * [x] application expressions (`f x`) * [x] infix expressions (`3 + 4 - 5 * 6`) * [x] `andalso` and `orelse` expressions * [x] `raise` and `handle` expressions * [x] conditionals (`if true then 2 else 3`) * [x] case analyses (`case x of 0 => 0 | _ => 1`) * [x] abstractions (`fn 0 => 0 | _ => 1`) * [x] `while` loops * [x] `print` * [x] `ref`, `!`, and `:=` * [x] structures * [x] signatures * [x] functors (experimental) * Supported standard library constructs (Note that all available libraries are loaded per default, currently SOSML has not implemented any user-space loading of modules.) * Math library * Char library `ord`, `chr`, `Char.isLower`, `Char.isUpper`, `Char.isDigit`, `Char.isAlpha` * Int library `Int.minInt`, `Int.maxInt`, and `Int.compare` * Real library `Real.compare`, `Real.fromInt`, `Real.round`, `Real.floor`, and `Real.ceil` * Option library * List and Listsort libraries * Vector library `fromList`, `tabulate`, `length`, `sub`, `update`, `app`, `map`, `foldl`, `foldr` * Array library `fromList`, `tabulate`, `length`, `sub`, `update`, `vector`, `foldl`, `foldr` * String library ## Using SOSML as an Interpreter for Standard ML (SML) If you just want to test SOSML, just head to https://sosml.org/editor and enter your code. Adding a `;` will then start the evaluation. If you don't like web browsers, but still want to test SOSML, you can install the experimental CLI via `npm` ```bash npm install -g @sosml/interpreter@latest ``` This makes the command `sosml` available, which behaves like any other run-of-the-mill interpreter for SML. Note that due to its experimental state, the CLI currently does not take any options or parameters. ## Using SOSML as a Component in Your Project ### The `node` Way You may use the interpreter bundled in SOSML or parts of it to build your own fancy SML interpreter: First, install SOSML via ```bash npm install --save @sosml/interpreter@latest ``` Now, to get your SML code interpreted by SOSML, import `interpret` and `getFirstState` from the package you just installed and you are good to go: ```js import { interpret, getFirstState, State } from '@sosml/interpreter'; // Obtain an initial state for the interpretation let initialState: State = getFirstState(); // Let's interpret some code let interpretationResult = interpret('val x = "Hello World!";', initialState); console.log(interpretationResult.state.toString({stopId: initialState.id + 1})); // Prints "val x = "Hello World!": string;" // Let's interpret some more code; note how we use the state obtained from the last step interpretationResult = interpret('fun f y = x | f 10 = "???";', interpretationResult.state); // Note that the last code produced a warning: console.log(interpretationResult.warnings); // Something like "Rules after "y" unused in pattern matching." // Similarly, interpretationResult.evaluationErrored may contain an Error if the interpretation of your code failed // Lastly, SML exceptions raised by your code that are not handled end up in interpretationResult.error. ``` Check out the `src/cli.ts` file for an example SML interpreter using SOSML. ### The “But I Hate `node.js`” Way Starting with version `1.5.0`, you can directly run SOSML in a `<script>` tag in HTML: ```HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="https://unpkg.com/@sosml/interpreter@^1.5.0/build/interpreter.min.js"></script> </head> <body> <script> let initialState = Interpreter.getFirstState(); let interpretationResult = Interpreter.interpret('val x = "Hello World!";', initialState); console.log(interpretationResult.state.toString({stopId: initialState.id + 1})); interpretationResult = Interpreter.interpret('fun f y = x | f 10 = "???";', interpretationResult.state); console.log(interpretationResult.warnings); </script> </body> </html> ``` ## Contributing to SOSML We welcome you to open an Issue for any error or squid you may find, and we will try to fix it ASAP. Further, if you want additional parts of the Standard Library or other features in general implemented, feel free to open a new Issue. If you want to contribute via writing code, you may check the Issues page for any unresolved problems or unimplemented features and then submit a pull request after solving that problem or implementing that feature. ### Cloning and Building To get started on writing code for SOSML, clone the repository and install the dependencies: ```bash git clone https://github.com/SOSML/SOSML npm install ``` To build the interpreter and pack it into one file using [Webpack](https://webpack.js.org/) run: ```bash npm run build ``` This will create a file in the directory `build` called `interpreter.js`. To also minify the result run: ```bash npm run dist ``` This will create a file in the directory `build` called `interpreter.min.js`. To build the CLI, run ```bash npm run cli npm link ``` ### Testing Your Changes SOSML comes with an extensive set of tests which can be run via ```bash npm test ``` This runs all tests located in the `test` directory. When contributing new code, please make sure that you add the appropriate tests and that no old tests begin to fail.
评论
    相关推荐