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

@dashkite/parse

v0.4.3

Published

Parser combinator library for JavaScript

Downloads

16

Readme

Parse

A parser combinator library for JavaScript, written in CoffeeScript

A simple expression grammer written using Parse:

import * as p from "@dashkite/parse"

parse = p.parser p.pipe [

  # match all of the following in sequence...

  p.all [
    # match a regexp for a digit
    p.re /^\d+/, "digit"

    # allow whitespace but don't save it
    p.trim p.ws

    # match an operator
    p.re /^(\+|-)/, "operator"

    # allow whitespace
    p.trim p.ws

    # second digit
    p.re /^\d+/, "digit"
  ]

  # take the results and do something
  p.map ([x, op, y]) ->
  
    # convert the text digits to actual numbers
    x = Number.parseInt x, 10
    y = Number.parseInt y, 10

    # process the given operation
    switch op
      when "+" then x + y
      when "-" then x - y
  ]
]

# check to see if it works
assert.equal 8, parse "5 + 3"
assert.equal 2, parse "5 - 3"

assert.throws (-> parse "7 + a"),
  message: "parse error: expected digit, got 'a'"

Features

  • Fully-featured stateful recursive descent parser
  • Backtracking with lookahead and memoization
  • Customizable error handling
  • Approximately 2kb compressed

Install

npm i @dashkite/parse

Use with your preferred bundler or loader.

Reference

Almost all functions in Parse take and return a parsing context. A parsing context contains the current parse state, which includes the original input, the remaining input, custom data, and either a value or error.

There are two main types of functions: pattern and action. Pattern functions, referred to simply as patterns when parameterized, consume input and produce value or errors. Action functions don’t consumer input, but modify the parsing context in other ways. For example, the test function takes a predicate and applies it to the parsing context value. If the predicate returns true, the context is returned unchanged. Otherwise, it adds an error object to the context, which will short-circuit functions like all.

The main exception is parser which accepts a parsing context and returns its value if there’s no error and no remaining input.

Pattern Functions

Use to consume input and produce values or errors. Typically used within higher-level pattern functions like all, any, or list.

| Name | Arguments | Description | | --------- | -------------------- | ------------------------------------------------------------ | | re | expression, name | Matches the given regular expression. The expression should almost always be anchored to the start of the input with the ^ operator. Provide an optional name to produce more meaningful error messages. | | word | - | Matches a word. Convenience function for re /^\w+/, "word" | | ws | - | Matches whitespace, not including newlines. Convenience function for re /^[ \t]+/s, "whitespace" | | text | text string | Matches the given text string. | | skip | pattern | Matches the given pattern, but discards the matched value. | | eof | - | Matches the end of the input. | | eol | - | Matches the end of the line or input. | | all | array | Matches all of the patterns in the given array. The resulting values are placed into an array. | | any | array | Attempts to match each of the patterns in the given array until a match is found. | | many | pattern | Keeps matching the given pattern until it fails, return the matched values as an array. | | optional | pattern | Attempts to match the given pattern, but on failure, returns the original parsing context unchanged. | | lookahead | pattern | Attempts to match the given pattern. If successful, returns the original context unchanged. Use to short-circuit parsing to avoid backtracking. | | list | delimiter, item | Attempts to match a list of the given item pattern, delimited by the delimiter pattern. | | between | open, close, pattern | Attempts to match the given pattern after matching open and then matching close. If no close pattern is provided, uses open again. | | trim | pattern | Matches the given string, discarding the matched value. On failure, returns the original context unchanged. Equivalent to skip optional pattern. | | forward | function | Matches the pattern returned by the given function. Use to avoid circular dependencies by forward-referencing patterns that haven’t yet been defined. | | apply | pattern function | Parameterizes the given pattern function using the value of the current context and attempts a match. |

Action Functions

Use to manipulate the parsing context to manage custom state or transform the value. Typically used within pipe.

| Name | Arguments | Description | | -------- | ------------------- | ------------------------------------------------------------ | | map | transform | Passes the context value into the given transform function and returning a new context with the returned value. | | flatten | - | Does a shallow (depth of one) array flatten on the context value. | | first | - | Returns the first element of the context value. | | last | - | Returns the last element of the context value. | | test | name, predicate | Passes the context value into the given predicate function. If the predicate returns true, the context is returned unchanged. Otherwise, a new context is produced with an error using the given name. | | tag | key | Return the context value as an object with the given property key. Use with merge to build up objects during parsing. | | merge | - | Merge an array of objects as the context value into a single object. | | append | skey, pattern | Match the given pattern and append the resulting value to the context value, or to custom data using the optional skey. | | assign | skey, key, pattern | Match the given pattern and assign the resulting value to the context value property key, or to custom data using the optional skey. | | preserve | pattern | Match pattern but keep the original context value. Use with append or assign to build up a result using the context value rather than custom data. | | set | key, value | Set the custom state of the parser for a given property key to value. If value is not given, the property is set to the context value. | | get | key | Gets the given custom state property and sets it as the context value. | | push | key, value, pattern | Pushes the given value onto a stack defined by the custom state property key and attempts to match the pattern. Pops the stack and returns the result of the attempted match. | | pipe | array | Attempts to match all of the given patterns but short-circuits if any produce an error. Does not directly modify the context value (unlike all, which accumulates the matched patterns into an array). Use to build up a sequence of actions. |