npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

dslap

v0.0.9

Published

Domain specific languages and parsers (d-slap for short as I'm very immature)

Downloads

6

Readme

D-SLAP

Domain-specific languages and parsers

This README contains brief summaries. For more information, look at the documentation in the source files for the parsers, or see the unit tests.

Simple parser

Parses expressions consisting of:

  • Entities - an entity is a single character

  • Groups - a group is contained within a start character and an end character. The contents of a group may include other entities and groups.

The comprehension parser uses the simple parser. Syntax specifications for comprehensions are given as expressions in the comprehension language.

Comprehension language and parser

The comprehension language defines a way to specify comprehension syntaxes. A comprehension syntax is parsed against this specification using the simple parser. The comprehension parser is a factory which returns a generated parser, given a language specification. The parser uses a regular expression, so should perform very well as the actual string parsing is done by native code.

Comprehensions may consist of keywords and named capture groups. They may be nested within subgroups to provide choices or to make them optional.

The associated unit test demonstrates using this engine to parse AngularJS-like ngOptions comprehension expressions.

Recursive parser

Specialised for parsing languages that permit recursive nesting. Group start and end markers, and entities may consist of multiple characters.

This parser is capable of backtracking if the "backtrack" option is set.

This parser is used by the arithmetic evaluator

Arithmetic parser, language, and evaluator

The arithmetic language is a JavaScript-like language which supports members, subscripts, function calls, and most other JavaScript operators that do not cause side effects (so no =/++/--).

The arithmetic parser parses an expression that conforms to the arithmetic language. It transforms the parse tree to an expression tree and returns a function which (when given a context) will apply the expression to the context and return the result. If the expression identifies a variable, then it is also possible to assign to the variable that the expression refers to.

The expression tree provides a chain of functions that evaluate each part of the expression, feeding their result to functions higher in the chain. Hence, while parsing an expression may be slow, subsequently evaluating the expression in a given context is fast (as is assignment).

Assigning directly to properties of the context will not work unless the "rawScope" option is set. Attempts to access a non-existant context-level variable will result in an exception unless the "notStrict" option is set.