Coder Social home page Coder Social logo

flytrap-py's Introduction

flytrap-py

parser

Install

pip install flytrap-py

How to use

from typing import Dict, Union
from flytrap import IParser, attempt, choice, digit, lazy, many1, spaces, split_by, string, token, until

type Json =  Union[str, int, bool, None, list[Json], Dict[str, Json]]

def ignore_spaces[O](p: IParser[str, O]) -> IParser[str, O]:
    return attempt(spaces()).with_(p)

def jstring() -> IParser[str, Json]:
    """
    support only simple string
    """
    return ignore_spaces(token('"').with_(until(token('"'))).skip(token('"')).map(str))

def jnumber() -> IParser[str, Json]:
    """
    support only simple number
    """
    def _inner(values: list[str]):
        return int("".join(values))
    return ignore_spaces(many1(digit()).map(_inner))

def jboolean() -> IParser[str, Json]:
    return ignore_spaces(choice(
            string("true").map(lambda _: True),
            string("false").map(lambda _: False)
            ))

def jnull() -> IParser[str, Json]:
    return ignore_spaces(string("null").map(lambda _: None))

def jarray() -> IParser[str, Json]:
    def _inner(v: list[Json] | None)->Json:
        if v is None: return list([])
        else:         return list(v)

    return ignore_spaces(token("[")).with_(
                attempt(split_by(jvalue(), ignore_spaces(token(","))))
            ).skip(ignore_spaces(token("]"))).map(_inner)

def jobject() -> IParser[str, Json]:
    def _inner(values: list[tuple[Json, Json]] | None)->Json:
        result = {}

        if values is None:
            return result
        else:
            for (key, value) in values:
                result[key] = value

        return result

    return ignore_spaces(token("{")).with_(
            attempt(split_by(
                jstring().skip(ignore_spaces(token(":"))).and_(jvalue()),
                ignore_spaces(token(","))
            ))
        ).skip(ignore_spaces(token("}"))).map(_inner)

def jvalue() -> IParser[str, Json]:
    return choice(
                                jstring(),
                                jnumber(),
                                jboolean(),
                                jnull(),
                                lazy(jarray),
                                lazy(jobject)
                                )

def parser(src: str) -> Json:
    (j, _) = jvalue().parse(src)
    return j

flytrap-py's People

Contributors

leafchage avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.