darobin / webidl.js Goto Github PK
View Code? Open in Web Editor NEWDEPRECATED — Use https://github.com/darobin/webidl2.js instead
Home Page: http://berjon.com/
DEPRECATED — Use https://github.com/darobin/webidl2.js instead
Home Page: http://berjon.com/
[DEPRECATED] Use https://github.com/darobin/webidl2.js instead. WebIDLParser.js is, shockingly enough, a Javascript parser for WebIDL (http://dev.w3.org/2006/webapi/WebIDL/). All the content of this repository is distributed under the MIT License. In order to use it in a Web context, simply include web/WebIDLParser.js. Note that this file has not been minified and is quite large. I tested reducing its size here, and easily got it down to 44K minified and 6.4K gzipped (being generated, it is rather repetitive code). A "WebIDLParser" object will become available. Using it from Node.js or a CommonJS environment is equally simple: just put node/WebIDLParser.js in your library path and require it. It exports a "Parser" object. The interface is simple: the only method you need to worry about is parse(str, [start]). It takes a string containing WebIDL, and returns an AST expressed as a simple JS structure (utilities to traverse it more easily are forthcoming). Optionally a second argument can specify which rule of the grammar to start with. This is useful when parsing a small WebIDL fragment that may be incomplete. The names of the rules can be found in lib/grammar.peg. Just so that you don't have to look, the most common start parameters are: - definitions (the default) - interface - Operation - Attribute - type - implements - typedef - exception The grammar isn't exactly the one in the WebIDL draft. In some places it is slightly more permissive (not by that much though), and its handling of extended attributes is simpler. It also adds support for WebIDL arrays, even though they are not described in the current draft's grammar. The parser code is created with the pegjs parser generator from the grammar in lib/grammar.peg. To modify the grammar: - read up on PEG.js at http://pegjs.majda.cz/ - install node and npm - install pegjs with npm install -g pegjs - run 'make parsers' in the top-level directory. (This assumes that you're in a Unix-like environment with make and sed installed.)
To be consistant with webIDL, please use ". identifier" instead of ".name" for object identifiers.
interface foo {
void bar(DOMString? baz = null);
};
throws a SyntaxError
The parser seems to support "static" declarations on interface members, but not quite correctly... Statics show up on a member as:
member[0] === "static"
Test case:
interface SomeFoo {
static void test();
};
The parser can't parse the type DOMSringList, or, in general any type name that has one of the primitive WebIDL types as a prefix. So longStringList would also not parse. I don't know if this is a problem with the grammar or the parser generator. But consider this line from node/WebIDLParser.js:
if (input.substr(pos, 9) === "DOMString") {
var result4 = "DOMString"
pos += 9;
It looks ahead for known type names, but doesn't verify that they are at token boundaries.
When extAttrs are missing, the object.extAttrs should return an empty array (for consistency ... note that object.members behaves correctly by returning an empty array).
Dealing with multiple types is annoying.
It should be possible to extend exceptions.
Test case:
exception NumberError : Wee { };
Expected to be able to extend.
This also fails:
exception Wee { };
exception NumberError : Wee { };
When parsing https://www.khronos.org/registry/webgl/specs/1.0/webgl.idl I get two issues which are easily to fix.
First in Line 33. WebIDLParser can't handle the line "typedef long long GLintptr;". Changin it to "typedef long GLintptr;" works however.
Second issue in Line 507: WebGLParser doesn't like the space in "DOMString[ ]". Changing it to "DOMString[]" (No space between the brackets) helps.
Thank you and have a nice day.
The code now needs to be updated to add a few things from WebIDL that are missing, but the question of what to do with old constructs needs to be handled.
My proposal is this: keep them around, but for each of those when they are processed make a call to checkCompatMode(). If compatibility has been set, then accept the old constructs, otherwise die with a syntax error.
This is useful because it will make it possible to parse older specifications, warn, etc.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.