Dvě drobnosti pro JavaScript
Implementace LLk parseru a LRU cache v JavaScriptu.
Zeraweb Cruiser Parser
je LLk parser, napsaný v JavaScriptu. Jeho autor, Dan Yoder, říká: „Jakmile dosáhnete limitu regulárních výrazů v JavaScriptu, máte dvě možnosti. Zaprvé - uvědomit si, že to, co se okoušíte udělat, asi není moc dobrý nápad. Zadruhé - napsat si parser a pokračovat dál.“
Na hranice regulárních výrazů narazil Dan při psaní parseru CSS3 pro Behaviors
. Vytvořil proto Cruiser Parser. Na rozdíl od nástrojů jako je YACC není z nějakých pravidel vytvořen JavaScriptový kód, ale parser je napsán přímo jako funkce v JavaScriptu. Parsování není tak rychlé jako jednoúčelový kód, ale je prý rychlejší než parser postavený na regulárních výrazech.
Takto vypadá konkrétní implementace pro parsování CSS3:
with ( Parser.Operators ) {
var g = Behaviors.Stylesheet.Grammar;
var t = Behaviors.Stylesheet.Translator;
// basic tokens
g.lbrace = token('{'); g.rbrace = token('}');
g.lparen = token(/\(/); g.rparen = token(/\)/);
g.colon = token(':'); g.semicolon = token(';');
// attributes
g.attrName = token(/[\w\-\d]+/);
g.attrValue = token(/[^;\}]+/);
g.attr = pair(g.attrName,g.attrValue,g.colon);
g.attrList = list(g.attr,g.semicolon,true);
g.style = process(between(g.lbrace,g.attrList,g.rbrace),t.style);
// style rules
g.selector = token(/[^\{]+/);
g.rule = each(g.selector,g.style);
g.rules = process(many(g.rule),t.rules);
// comments
g.inlineComment = token(/\x2F\x2F[^\n]\n/);
g.multilineComment = token(/\x2F\x2A.*?\x2A\x2F/);
g.comments = ignore(any(g.inlineComment,g.multilineComment));
// parser
Behaviors.Stylesheet._parse = process(
many(any(g.comments,g.rules)),t.parse);
}
Download: Parser
. Knihovna vyžaduje Prototype 1.5.1
a Cruiser JS Library
.
—
Monsur Hossain se inspiroval ve světě ASP.NET a vytvořil implementaci LRU cache pro JavaScript
. Dle slov autora může být použita pro lokální cachování dat a šetřit tak přenosovou kapacitu u náročných AJAXových aplikací.
- Chcete-li přidat komentář, přihlašte se nebo se zaregistrujte.
