wain-syntax-text

Crates.iowain-syntax-text
lib.rswain-syntax-text
version0.2.1
sourcesrc
created_at2020-03-29 12:25:06.186925
updated_at2023-11-18 04:57:31.101217
descriptionWebAssembly text format parser for wain project
homepagehttps://github.com/rhysd/wain/tree/master/wain-syntax-text
repositoryhttps://github.com/rhysd/wain
max_upload_size
id224048
size303,606
Linda_pp (rhysd)

documentation

README

wain-syntax-text

crates.io CI

wain-syntax-text is a crate to parse WebAssembly text format files.

This crate is part of larger wain project.

Installation

[dependencies]
wain-syntax-text = "0"

Usage

Using wain_syntax_text::parse() is the easiest way.

extern crate wain_syntax_text;

use wain_syntax_text::parse;

let source = "(module
  (memory 0 2)
  (table 0 1 1 funcref)
  (export "_start" (func $_start))
  (func $_start)
)";

match parse(source) {
    Ok(tree) => { /* `tree` is a parsed syntax tree */ }
    Err(err) => eprintln!("Error! {}", err),
}

For the syntax tree structure parsed by this library, please see wain-ast crate.

wain_syntax_text::lexer::Lexer lexes a text format source.

extern crate wain_syntax_text;

use wain_syntax_text::lexer::Lexer;

let source = "(module
  (memory 0 2)
  (table 0 1 1 funcref)
  (export "_start" (func $_start))
  (func $_start)
)";

// Lexer implements Iterator which traverses tokens in the given source
let mut lexer = Lexer::new(source);
for lexed in lexer {
    let (token, offset) = lexed.unwrap();
    // `token` is a lexed token
    // `offset` is a byte offset in the source
    if let Token::Symbol(sym) = token {
        println!("Symbol found: {}", sym);
    }
}

APIs are provided for each logic:

  • Lexer and parser for WAT syntax tree
  • WAT to WASM translation
  • Composing multiple WASM modules into single WASM module

Working examples can be seen at examples/api/ directory

Please read documentation (not yet) for details.

Implementation

Sequence to parse Wasm

  1. Lex and parse .wat file into WAT sytnax tree which is dedicated for text format resolving many syntax sugars. Since multiple modules can be put in .wat file, it can be parsed into multiple trees

  2. Translate the WAT syntax trees into common Wasm syntax trees (wain_ast::Root) resolving identifiers. Identifiers may refer things not defined yet (forward references) so .wat file cannot be parsed into common Wasm syntax trees directly

  3. Compose a single module from the multiple Wasm syntax trees following spec

License

the MIT license

Commit count: 539

cargo fmt