wain-syntax-text
================
[![crates.io][crates-io-badge]][crates-io]
[![CI][ci-badge]][ci]
[`wain-syntax-text`][gh] is a crate to parse [WebAssembly text format][wasm-spec-text] files.
This crate is part of larger [wain][proj] project.
## Installation
```toml
[dependencies]
wain-syntax-text = "0"
```
## Usage
Using `wain_syntax_text::parse()` is the easiest way.
```rust
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][ast] crate.
`wain_syntax_text::lexer::Lexer` lexes a text format source.
```rust
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][examples]
Please read documentation (not yet) for details.
## Implementation
![Sequence to parse Wasm](https://github.com/rhysd/ss/blob/master/wain/parsing-diagram.png?raw=true)
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](https://webassembly.github.io/spec/core/text/modules.html#text-module)
## License
[the MIT license](./LICENSE.txt)
[ci-badge]: https://github.com/rhysd/wain/workflows/CI/badge.svg?branch=master&event=push
[ci]: https://github.com/rhysd/wain/actions?query=workflow%3ACI+branch%3Amaster+event%3Apush
[crates-io-badge]: https://img.shields.io/crates/v/wain-syntax-text.svg
[crates-io]: https://crates.io/crates/wain-syntax-text
[gh]: https://github.com/rhysd/wain/tree/master/wain-syntax-text
[wasm-spec-text]: https://webassembly.github.io/spec/core/text/index.html
[proj]: https://github.com/rhysd/wain
[ast]: https://crates.io/crates/wain-ast
[examples]: https://github.com/rhysd/wain/tree/master/examples/api