Git Product home page Git Product logo

rbnf's Introduction

RBNF: Parser Generator for Context Sensitive Grammars

Build Status PyPI version MIT License

Tutorials

See Jupyter Notebook.

Preview

  • rbnf.zero: solution to processing complex texts. Similar to re.

    See source file Poly.rbnf.

    # parse polynomials from text.
    import rbnf.zero as ze
    ze_exp = ze.compile("import poly.[*]", use='Poly')
    print(ze_exp.match("2x^2 + 3 + 4 - 7 x^5 + 4 x + 5 x ^2 - x + 7 x ^ 11").result)

    Then we got output [(0, 7), (1, 3), (2, 7), (5, -7), (11, 7)].

  • CLI tool chains:

    λ rbnf.exe --help
    Available commands:
     cc
         rbnf source code compiler.
    
     - filename(positional or keyword arg)        : input source file
     - output(positional or keyword arg) = None   : output file name. default to be ...
     - name(positional or keyword arg) = 'unname' : name of language
    
     run
         You can apply immediate tests on your parser.
         P.S: use `--opt` option takes longer starting time.
    
     - filename(positional or keyword arg)    : python file generated by `rbnf` command, or rbnf sour file
     - opt(positional or keyword arg) = False : optimize switch
    
    
    
    λ printf "ignore [space]\nspace := R'\s+'\nterm := R'[^\s\(\)]+'\nsexpr ::= '(' sexpr* ')' | term" > lisp.rbnf
    λ rbnf run lisp
    
    type `:i` to switch between python mode and parsing mode.
    The last result of parsing is stored as symbol `res`.
    
    runbnf> (add 1 (add 2))
    
    sexpr[
          Tokenizer(name='auto_const', value='(', lineno=0, colno=0)
          sexpr[
                Tokenizer(name='term', value='add', lineno=0, colno=1)
          ]
          sexpr[
                Tokenizer(name='term', value='1', lineno=0, colno=5)
          ]
          sexpr[
                 Tokenizer(name='auto_const', value='(', lineno=0, colno=7)
                 sexpr[
                       Tokenizer(name='term', value='add', lineno=0, colno=8)
                 ]
                 sexpr[
                       Tokenizer(name='term', value='2', lineno=0, colno=12)
                 ]
                 Tokenizer(name='auto_const', value=')', lineno=0, colno=13)
          ]
          Tokenizer(name='auto_const', value=')', lineno=0, colno=14)
    ]
    
    runbnf> exit
    
    λ rbnf cc lisp.bnf -output lisp.py
    ...

Related

RBNF is leveraged to handle parsing tasks in some projects. Feel free to check them to get a better knowledge:

  • Yet Another Python Python:

    A Python bytecode compiler to provide custom extended syntaxes and optimization passes.
    This provides a parser for extended Python(compatible to Python 3.6.x-3.8.0).

    {"a" : a, "b": {"c": c}} = {"a": 1, "b": {"c": 2, **other2}, **others1}
    assert a == 1 and c == 2
  • Reley

    A haskell-like language implemented in Python. This provides a parser for a part of haskell.

      import operator (add, eq)
      import functools (reduce)
      import toolz (curry)
      import reley.prelude ((+))
    
      infix 5 (==)
      infix 0 ($)
      (==) = curry eq
      ($) a b = a b
      (+) = curry add
    
    
      m_sum lst = if lst == [] then 0
              else destruct lst
              where
                  destruct (a, b) = a + m_sum(b)
  • ReFining:

    A type checker.

    python cli.py
    
    reF> let x: 'a = 1 in
          fn x: 'a -> x ;;
    =>  (int`2 => int`2)
    
  • RMalt:

    A concise demo of intepreter implementation.

    python test.py
    
    malt> let (%+) = (l, r) -> (l + r) % r;;
    malt> let f = (a, b) -> a  + b;;
    malt> f 1 2;;
    =>  3
    malt> f 1
          ;;
    =>  Fn(b)<id=3061211909288>
    malt> infix %+ 5;;
    =>  5
    malt> let (%+) = (l, r) -> (l % r) + r;;
    malt> 5 %+ 6;;
    =>  11
    
    

EDSL in Python

To be continue.

RBNF's compiler(rbnf -> python or others) relies on bootstrap.

Actually, in current version, bootstrap of RBNF is implemented in EDSL.

See rbnf bootstrap in Python.

A snippet could be previewed here.

rbnf = Language("RBNF")

...

@rbnf
class Primitive(Parser):

    @classmethod
    def bnf(cls):
        # @formatter:off
        return optimize(
                 C('(') + Or @ "or_" + C(')')
               | C('[') + Or @ "optional" + C(']')
               | Name @ "name"
               | Str  @ "str")
        # @formatter:on

     @classmethod
    def rewrite(cls, state: State):
        get = state.ctx.get
        or_: Parser = get('or_')
        optional: Parser = get('optional')
        ...

...

Other backend

To be continue.

rbnf's People

Contributors

thautwarm avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

aguai fosmjo

rbnf's Issues

jvm support planning

I want to make some JVM languages which suit me better, so I can write some interesting codes on JVM.

Although I think Scala with only a few special syntax sugars is okay, it must be a general demand to have a ML language for JVM.

Oh, and I need some package manager like that of Python's or Ruby's or JS's... I want xxx install xxx...

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.