12 个版本 (7 个破坏性更新)
使用旧的 Rust 2015
0.9.0 | 2019 年 5 月 8 日 |
---|---|
0.8.0 | 2018 年 10 月 10 日 |
0.7.0 | 2018 年 7 月 14 日 |
0.5.0 | 2018 年 3 月 9 日 |
0.3.2 | 2017 年 7 月 3 日 |
#2395 在 解析器实现
每月 766 次下载
在 11 个 颗粒(直接 3 个)中使用
170KB
3.5K SLoC
webidl-rs
Rust 中用于 WebIDL 的解析器。
示例
词法分析
use webidl::*;
let lexer = Lexer::new("/* Example taken from emscripten site */\n\
enum EnumClass_EnumWithinClass {\n\
\"EnumClass::e_val\"\n\
};");
assert_eq!(lexer.collect::<Vec<_>>(),
vec![Ok((41, Token::Enum, 45)),
Ok((46, Token::Identifier("EnumClass_EnumWithinClass".to_string()), 71)),
Ok((72, Token::LeftBrace, 73)),
Ok((74, Token::StringLiteral("EnumClass::e_val".to_string()), 92)),
Ok((93, Token::RightBrace, 94)),
Ok((94, Token::Semicolon, 95))]);
解析
use webidl::*;
use webidl::ast::*;
let result = parse_string("[Attribute] interface Node { };");
assert_eq!(result,
Ok(vec![Definition::Interface(Interface::NonPartial(NonPartialInterface {
extended_attributes: vec![
Box::new(ExtendedAttribute::NoArguments(
Other::Identifier("Attribute".to_string())))],
inherits: None,
members: vec![],
name: "Node".to_string()
}))]));
格式化打印 AST
示例的访问者实现可以在这里找到 here。以下是如何使用它的示例
use webidl::ast::*;
use webidl::visitor::*;
let ast = vec![Definition::Interface(Interface::NonPartial(NonPartialInterface {
extended_attributes: vec![
Box::new(ExtendedAttribute::NoArguments(
Other::Identifier("Attribute".to_string())))],
inherits: None,
members: vec![InterfaceMember::Attribute(Attribute::Regular(RegularAttribute {
extended_attributes: vec![],
inherits: false,
name: "attr".to_string(),
read_only: true,
type_: Box::new(Type {
extended_attributes: vec![],
kind: TypeKind::SignedLong,
nullable: true
})
}))],
name: "Node".to_string()
}))];
let mut visitor = PrettyPrintVisitor::new();
visitor.visit(&ast);
assert_eq!(visitor.get_output(),
"[Attribute]\ninterface Node {\n readonly attribute long? attr;\n};\n\n");
一致性
解析器在 WebIDL 语法 方面是一致的,除了三点
依赖关系
~0–1.1MB
~22K SLoC