UNPKG

walt-compiler

Version:

Alternative syntax for WebAssembly text format

125 lines (86 loc) 3.19 kB
# Walt Compiler This is the main walt compiler package. ### Install `npm install --save walt-compiler` ### API ```flow type Compile = (source: string, options?: Options) => Result ``` Compile and run Walt code in browser: ```js import { compile } from 'walt-compiler'; const buffer = compile(` let counter: i32 = 0; export function count(): i32 { counter += 1; return counter; } `).buffer(); WebAssembly.instantiate(buffer).then(result => { console.log(`First invocation: ${result.instance.exports.count()}`); console.log(`Second invocation: ${result.instance.exports.count()}`); }); ``` Compile and save a `.wasm` file via Node.js: ```js const { compile } = require('walt-compiler'); const fs = require('fs'); const buffer = compile(` let counter: i32 = 0; export function count(): i32 { counter += 1; return counter; } `).buffer(); fs.writeFileSync('bin.wasm', new Uint8Array(buffer)); ``` ### Result ```flow type Result = { buffer: () => ArrayBuffer, ast: NodeType, semanticAST: NodeType } ``` #### buffer() Unique (across function calls) `ArrayBuffer` instance. #### ast The `Program` root node containing the source program without any type information. This is the node passed to semantic parser. #### semanticAST The `Program` root node containing the source program including the final type information. This is the AST version used to generate the final binary. ### Options ```flow type Options = { version?: number, encodeNames?: boolean, filename?: string, extensions: Array<Plugin> } ``` #### version The target WebAssembly Standard (not to be confused with compiler version) version to which the source should be compiled to. Currently supported versions: `0x01` #### encodeNames Whether or not names section should be encoded into the binary output. This enables a certain level of extra debug output in supported browser DevTools. Increases the size of the final binary. Default: `false` #### filename Filename of the compiled source code. Used in error outputs. Default: `unknown.walt` #### extensions An array of functions which are compiler extensions. See the `Plugin` section for plugin details. Default: `[]` **note**: Plugins are applied from right to left with the core language features applied _last_. ### Plugin The compiler may be extended via extensions or plugins. Each plugin must be a function return an object with the following keys: `semantics`, `grammar`. Where each value is a function. ```flow type Plugin = (Options) => { semantics: ({ parser: Function, fragment: Function }) => { [string]: next => ([node: NodeType, context]) => NodeType }, grammar: Function } ``` Each plugin is capable of editing the following features of the compiler: * `grammar` - The syntax or grammar which is considered valid by the compiler. This enables features like new keywords for example. * `semantics` - The parsing of the `ast`. Each key in the object returned by this method is expected to be a middleware like parser function which may edit the node passed into it. For an example of how plugins work see the full list of [core language feature plugins](./src/core/).