Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

sweetener

Package Overview
Dependencies
Maintainers
1
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

sweetener

A base library for writing compilers and interpreters

  • 0.2.1
  • Source
  • PyPI
  • Socket score

Maintainers
1

Sweetener

Python package Coverage Status PyPI version

Sweetener is a Python library for quickly prototyping compilers and interpreters. Extra care has been taken to make the algorithms as flexible as possible to fit as many use cases. If you're still missing something, do not hesitate to file an issue! In particular, this library contains the following goodies:

  • A typed record type that allows you to build PODs very quickly.
  • Base classes for an AST/CST, including reflection procedures.
  • A means for writing diagnostics that can print part of your source code alongside your error messages.
  • Generic procedures like clone, equal and lte that work on most types in the standard library and you can specialize for your own types.

Examples

Here's an example of using the Record type to define a record that holds two fields and visualizes tham using GraphViz:

from sweetener import Record, equal, visualize

class MySimpleRecord(Record):
    field_1: int
    field_2: str

r1 = MySimpleRecord('foo', 42)
r2 = MySimpleRecod(field_1='foo', field_2=42)

assert(equal(r1, r2))

visualize(r1)

Running this program will open a new window with the following content:

from sweetener import BaseNode, visualize

class CalcNode(BaseNode):
    pass

class Expr(CalcNode):
    pass

class Add(Expr):
    left: Expr
    right: Expr

class Sub(Expr):
    left: Expr
    right: Expr

class Var(Expr):
    name: str

class Lit(Expr):
    value: int

def eval(node: Expr, vars = {}) -> int:
    if isinstance(node, Add):
        return eval(node.left, vars) + eval(node.right, vars)
    if isinstance(node, Sub):
        return eval(node.left, vars) - eval(node.right, vars)
    if isinstance(node, Lit):
        return node.value
    if isinstance(node, Var):
        return vars[node.name]
    raise RuntimeError('Could not evaluate a node: unrecognised node type')

prog = Sub(
    Add(
        Lit(1),
        Lit(2)
    ),
    Var('x')
)

visualize(prog, format='png')

assert(eval(prog, { 'x': 3 }) == 0)

Running this example will open a new window with the following content:

License

Sweetener is generously licensed under the MIT license, in the hope that it inspires people to build new and cool software.

Keywords

FAQs


Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc