Skip to content

ChaosInventor/parse-ebnf

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Parse EBNF

PyPI - Version PyPI - Python Version


Table of Contents

Introduction

A simple and hacky parser for EBNF as defined by ISO. Give it an EBNF string and it'll generate a parse tree. Note that this package does not parse the described grammar.

Installation

pip install parse-ebnf

Quick start

from parse_ebnf import AST

#Your EBNF file goes here
ebnf = open('grammar.ebnf', 'r')

ast = AST()

try:
    #Will raise SyntaxError on error with an error message describing what went wrong
    ast.parse(ebnf.read) #You need to pass in a function that returns n characters where n is given as the first parameter.
finally:
    #Even after an error a partial tree will be generated.
    #str gives a text version of the parse tree(meant for debugging), while repr gives the text that it was produced from.
    print(str(ast))

print(f'Parsed the file creating a tree with {ast.count} nodes, height of {ast.height}. Each node has at MOST {ast.maxDegree} children.')

def DepthFirst(node, func):
    func(node)
    for child in node.children:
        DepthFirst(child, func)

#This will visit each node in the parse tree and print the line where its text begins
DepthFirst(ast.root, lambda node: print(node.startLine))

from parse_ebnf import ASTCommentNode

#Finds each comment in the file and prints its text content
for child in ast.root.children:
    if isinstance(child, ASTCommentNode):
        print(child.data)

Documentation

Check the github page that holds the documentation.

License

parse-ebnf is distributed under the terms of the MIT license.