A parser for WebIDL in Rust.
```rust use webidl::*;
let lexer = Lexer::new("/* Example taken from emscripten site */\n\
enum EnumClassEnumWithinClass {\n\
\"EnumClass::eval\"\n\
};");
asserteq!(lexer.collect::
```rust use webidl::; use webidl::ast::;
let result = parse_string("[Attribute] interface Node { };");
asserteq!(result, Ok(vec![Definition::Interface(Interface::NonPartial(NonPartialInterface { extendedattributes: vec![ Box::new(ExtendedAttribute::NoArguments( Other::Identifier("Attribute".tostring())))], inherits: None, members: vec![], name: "Node".tostring() }))])); ```
An example of a visitor implementation can be found here. Below is an example of how it is used:
```rust use webidl::ast::; use webidl::visitor::;
let ast = vec![Definition::Interface(Interface::NonPartial(NonPartialInterface { extendedattributes: vec![ Box::new(ExtendedAttribute::NoArguments( Other::Identifier("Attribute".tostring())))], inherits: None, members: vec![InterfaceMember::Attribute(Attribute::Regular(RegularAttribute { extendedattributes: vec![], inherits: false, name: "attr".tostring(), readonly: true, type: Box::new(Type { extendedattributes: vec![], kind: TypeKind::SignedLong, nullable: true }) }))], name: "Node".tostring() }))]; let mut visitor = PrettyPrintVisitor::new(); visitor.visit(&ast); asserteq!(visitor.getoutput(), "[Attribute]\ninterface Node {\n readonly attribute long? attr;\n};\n\n"); ```
The parser is conformant with regards to the WebIDL grammar except for three points:
A=B
. The specification states that A
and B
must be identifiers, but this parser accepts B
as any token. If you would like for any extended attributes to be parsed (essentially any sequences of tokens), please consider looking at #8 to help resolve the problem with doing so.implements
keyword that is no longer a part of the official specification. This is for backwards compatibility. legacycaller
keyword that is no longer a part of the official specification. This is for backwards compatibility.