Expand description
Traits for parsing the WebAssembly Text format
This module contains the traits, abstractions, and utilities needed to
define custom parsers for WebAssembly text format items. This module exposes
a recursive descent parsing strategy and centers around the
Parse
trait for defining new fragments of
WebAssembly text syntax.
The top-level parse
function can be used to fully parse AST fragments:
use wast::Wat;
use wast::parser::{self, ParseBuffer};
let wat = "(module (func))";
let buf = ParseBuffer::new(wat)?;
let module = parser::parse::<Wat>(&buf)?;
and you can also define your own new syntax with the
Parse
trait:
use wast::kw;
use wast::core::{Import, Func};
use wast::parser::{Parser, Parse, Result};
// Fields of a WebAssembly which only allow imports and functions, and all
// imports must come before all the functions
struct OnlyImportsAndFunctions<'a> {
imports: Vec<Import<'a>>,
functions: Vec<Func<'a>>,
}
impl<'a> Parse<'a> for OnlyImportsAndFunctions<'a> {
fn parse(parser: Parser<'a>) -> Result<Self> {
// While the second token is `import` (the first is `(`, so we care
// about the second) we parse an `ast::ModuleImport` inside of
// parentheses. The `parens` function here ensures that what we
// parse inside of it is surrounded by `(` and `)`.
let mut imports = Vec::new();
while parser.peek2::<kw::import>()? {
let import = parser.parens(|p| p.parse())?;
imports.push(import);
}
// Afterwards we assume everything else is a function. Note that
// `parse` here is a generic function and type inference figures out
// that we're parsing functions here and imports above.
let mut functions = Vec::new();
while !parser.is_empty() {
let func = parser.parens(|p| p.parse())?;
functions.push(func);
}
Ok(OnlyImportsAndFunctions { imports, functions })
}
}
This module is heavily inspired by syn
so you can
likely also draw inspiration from the excellent examples in the syn
crate.
Structs
- An immutable cursor into a list of tokens.
- A helpful structure to perform a lookahead of one token to determine what to parse.
- A low-level buffer of tokens which represents a completely lexed file.
- An in-progress parser for the tokens of a WebAssembly text file.
Traits
- A trait for parsing a fragment of syntax in a recursive descent fashion.
- A trait for types which be used to “peek” to see if they’re the next token in an input stream of
Parser
.
Functions
- A top-level convenience parsing function that parses a
T
frombuf
and requires that all tokens inbuf
are consume.
Type Aliases
- A convenience type definition for
Result
where the error is hardwired toError
.