#wasm-text #wat #文本格式 #解析器

wain-syntax-text

为wain项目提供的WebAssembly文本格式解析器

5个版本

0.2.1 2023年11月18日
0.2.0 2020年6月11日
0.1.2 2020年5月24日
0.1.1 2020年4月14日
0.1.0 2020年3月29日

#290 in WebAssembly


2 包中使用

MIT许可证

325KB
7.5K SLoC

wain-syntax-text

crates.io CI

wain-syntax-text 是一个用于解析WebAssembly文本格式文件的crate。

该crate是更大的wain项目的一部分。

安装

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

使用方法

使用 wain_syntax_text::parse() 是最简单的方法。

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),
}

有关此库解析的语法树结构,请参阅wain-ast crate。

wain_syntax_text::lexer::Lexer 逐行解析文本格式源。

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);
    }
}

为每个逻辑提供了API

  • WAT语法树的解析器和词法分析器
  • WAT到WASM的转换
  • 将多个WASM模块组合成单个WASM模块

可以在examples/api/ 目录中看到工作示例

请阅读文档(尚未提供)以获取详细信息。

实现

Sequence to parse Wasm

  1. 解析.wat文件到WAT语法树,该语法树专门用于解决许多语法糖。由于多个模块可以放在.wat文件中,因此它可以解析成多个树
  2. 将WAT语法树转换为通用的Wasm语法树(wain_ast::Root),解决标识符。标识符可能引用尚未定义的内容(前向引用),因此.wat文件不能直接解析成通用的Wasm语法树
  3. 根据规范将多个Wasm语法树组合成一个单个模块

许可证

MIT许可证

依赖项