wast

Module parser

Source
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 from buf and requires that all tokens in buf are consume.

Type Aliases§

  • A convenience type definition for Result where the error is hardwired to Error.