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解析器实现

Download history 197/week @ 2024-03-13 240/week @ 2024-03-20 240/week @ 2024-03-27 245/week @ 2024-04-03 212/week @ 2024-04-10 255/week @ 2024-04-17 245/week @ 2024-04-24 232/week @ 2024-05-01 218/week @ 2024-05-08 218/week @ 2024-05-15 234/week @ 2024-05-22 255/week @ 2024-05-29 194/week @ 2024-06-05 158/week @ 2024-06-12 205/week @ 2024-06-19 174/week @ 2024-06-26

每月 766 次下载
11 颗粒(直接 3 个)中使用

MIT 许可证

170KB
3.5K SLoC

webidl-rs

LICENSE Build Status Crates.io Version

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 语法 方面是一致的,除了三点

  • 由于扩展属性在解析时没有语义意义,因此不支持扩展属性,如语法所述。相反,支持有限的形式(如 表格 中所示)。此解析器在解析形式为 A=B 的扩展属性时提供更多灵活性。规范指出 AB 必须是标识符,但此解析器接受 B 作为任何令牌。如果您希望解析任何扩展属性(基本上是任何令牌序列),请考虑查看 #8 以帮助解决此问题。
  • 此解析器支持不再包含在官方规范中的旧 implements 关键字。这是为了向后兼容。
  • 此解析器支持不再包含在官方规范中的旧 legacycaller 关键字。这是为了向后兼容。

依赖关系

~0–1.1MB
~22K SLoC