Skip to main content

very powerful and optional parser framework for python

Project description

Build Status GPLv3.0 License PyPI version

EBNFParser

Parse Many, Any, Every

HomePage

Multi-Language-Versions


Install

  • Python

    • pip

    pip installl -U EBNFParser

    • setup

      git clone https://github.com/thautwarm/EBNFParser
      cd EBNFParser/Python
      python setup.py install

An Introduce to EBNFParser

EBNFParser seems to be a parser framework for parsing EBNF syntaxes, however, the syntax of EBNF here is not the same as that standard one.
The name of current EBNFParser’s version is Ruikowa, so you can call this idiom as Ruikowa for convenience’ sake.

Here is an example for you to get a knowledge of Ruikowa for parsing Java switch syntax.

Token Token.Java # use the token definition at source file `./Token/Java`.

newline  ::= R'\n' # match by using regular expression

switch   ::= 'switch' '(' expression ')' newline*
             '{'
                (case | newline  )*
                [default newline*]
             '}' ;

case     ::= 'case' ':' body    ;

default  ::= 'default' ':' body ;

body     ::= block | statement  ;

block    ::= '{' (newline|statement)* '}' ;

...

Now I’m going to tell you how to use EBNFParser to write a parser for Lisp quickly.

  • Install

    pip install -U EBNFParser

  • Write a file and name it as lispGrammar with following content.

    Atom    := R'[^\(\)\s\`]+'; # use Regex
    # define a literal parser. `Atom::= R'[^\(\)\s\']+'` is ok, but the ast parsed from the two is a little different with each other.
    
    Expr  Throw ['\n']
        ::= Atom
            | Quote
            | C'(' (NEWLINE* Expr* NEWLINE*)* C')' ;
    # C-prefix announces a character parser.
    
    Quote ::=  C'`' Expr ;
    NEWLINE := C'\n' ;
    Stmt Throw ['\n'] ::= (NEWLINE* Expr* NEWLINE*)* ;
  • Generate your parser and tokenizer.

    ruiko ./lispGrammar ./lispParser.py -comment True

  • Test your parser.

    python testLang.py Stmt "(+ 1 2)" -o test
    Stmt[
        Expr[
            "("
            Expr[
                "+"
            ]
            Expr[
                "1"
            ]
            Expr[
                "2"
            ]
            ")"
        ]
    ]

    Moreover, here is a result in JSON format at test.json.

Usage

  • Command Line Tools

    • ruiko.

    ruiko <grammar File>
            <output Python File(endswith ".py")>
            [-comment <True/False>] # whether any comments in your grammar file.

    Use command ruiko to generate parser and token files, and then you can use testLang.py to test your parser.

    python testLang.py <AST Name> "<your codes>"
  • APIs

    I’ll write a documentation for EBNFParser’s APIs very sooner.

Source

Will support C# and Elixir sooner.

License

GPLv3.0

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 Distribution

EBNFParser-1.0.1-py3-none-any.whl (21.1 kB view hashes)

Uploaded Python 3

Supported by

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