Skip to main content

Swiftlet provides Python bindings for Swiftlet, a high-performance parsing library built in Rust. It accepts an EBNF-style grammar and parses input text into a tree of Tree and Token nodes.

Project description

Swiftlet

Swiftlet provides Python bindings for Swiftlet, a high-performance parsing library built in Rust. It accepts an EBNF-style grammar and parses input text into a tree of Tree and Token nodes.

Features

  • Parse context-free grammars from a string or file.
  • Choose the parsing algorithm with earley or clr.
  • Control ambiguity handling with resolve or explicit.
  • Inspect the parse result as Tree and Token objects from Python.

Installation

Build and install the package from the swiftlet directory:

pip install swiftlet

Example

from swiftlet import Swiftlet, Transformer

class Calculate(Transformer):
    def start(self, child):
        return child[0]
    
    def expr(self, child):
        return child[0]
    
    def add(self, child):
        return child[0] + child[2]
    
    def sub(self, child):
        return child[0] - child[2]
    
    def mul(self, child):
        return child[0] * child[2]
    
    def div(self, child):
        return child[0] / child[1]
    
    def terms(self, child):
        return child[0]

def main():
    grammar = """
    start: expr
    expr: expr "+" terms -> add
        | expr "-" terms -> sub
        | terms
    terms: terms "*" INT -> mul
        | terms "/" INT -> div
        | INT
    %import (WS, INT)
    %ignore WS
    """

    text = "12 + 10 - 8 * 2 + 4"
    parser = Swiftlet(grammar)
    parsed_text = parser.parse(text)
    
    calculate = Calculate()
    result = calculate(parsed_text)

    parsed_text.pretty_print()
    print("\nResult: ", result)


if __name__ == "__main__":
    main()

Output

start
   add
     sub
       add
         expr
           terms   12
         +
         terms   10
       -
       mul
         terms   8
         *
         2
     +
     terms   4

Result:  10

Usage

Create a parser from grammar text:

from swiftlet import Swiftlet

parser = Swiftlet(
    grammar,
    start="start",
    algorithm="earley",
    ambiguity="resolve",
    debug=False,
)

Create a parser from a grammar file:

from swiftlet import Swiftlet

parser = Swiftlet.from_file("file_name")

Parse text and inspect the returned tree:

tree = parser.parse("42")
print(tree.get_name())
print(tree.get_children()[0].get_children()[0].get_word())

Notes

  • algorithm accepts earley or clr.
  • ambiguity accepts resolve or explicit.
  • parse() returns a Tree on success and raises ValueError or RuntimeError on failure.

For more examples, please check notebooks

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

swiftlet-0.1.5-cp310-abi3-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10+Windows x86-64

swiftlet-0.1.5-cp310-abi3-manylinux_2_34_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.34+ x86-64

swiftlet-0.1.5-cp310-abi3-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

Details for the file swiftlet-0.1.5-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: swiftlet-0.1.5-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for swiftlet-0.1.5-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 93e0310930545156b0121e5b031876e44ca414af932bcfb90ab8510b3e0c1a5d
MD5 bcc9b9ebd17141414487faa67192a223
BLAKE2b-256 aadfc37d1feed10b29f43312ef780eb1f2c04e192022bb185036186635d10891

See more details on using hashes here.

Provenance

The following attestation bundles were made for swiftlet-0.1.5-cp310-abi3-win_amd64.whl:

Publisher: python-publish.yml on jmishra01/Swiftlet

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file swiftlet-0.1.5-cp310-abi3-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for swiftlet-0.1.5-cp310-abi3-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 c709054a8c820a19c0846680f7a8f752e5f8fa745e78570ce5d01c9bf17a2560
MD5 e4fd2311f3c57cbbe086e1a7dc3b9d08
BLAKE2b-256 2854778bdc1313a6746edc8f91f28d184da22499230906007052242e71d669cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for swiftlet-0.1.5-cp310-abi3-manylinux_2_34_x86_64.whl:

Publisher: python-publish.yml on jmishra01/Swiftlet

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file swiftlet-0.1.5-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for swiftlet-0.1.5-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2a7778c599663210e23c23ff87b7e57811e8a763d8986d47354ceb3a90fa58a4
MD5 3a566698f81169f927ab6174938f0bae
BLAKE2b-256 dba68e330e6cec33ff97827962a0d52c1c0a08ae734fea150c649af401cabc1e

See more details on using hashes here.

Provenance

The following attestation bundles were made for swiftlet-0.1.5-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on jmishra01/Swiftlet

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page