Skip to main content

Grako (for "grammar compiler") takes a grammar in a variation of EBNF as input, and outputs a memoizing PEG/Packrat parser in Python.

Project description

https://badge.fury.io/py/grako.svg https://img.shields.io/badge/license-BSD-blue.svg https://img.shields.io/pypi/pyversions/grako.svg https://secure.travis-ci.org/apalala/grako.svg https://landscape.io/github/apalala/grako/release/landscape.png
At least for the people who send me mail about a new language that they’re designing, the general advice is: do it to learn about how to write a compiler. Don’t have any expectations that anyone will use it, unless you hook up with some sort of organization in a position to push it hard. It’s a lottery, and some can buy a lot of the tickets. There are plenty of beautiful languages (more beautiful than C) that didn’t catch on. But someone does win the lottery, and doing a language at least teaches you something.
Dennis Ritchie (1941-2011)

Creator of the C programming language and of Unix

Grako

Grako (for grammar compiler) is a tool that takes grammars in a variation of EBNF as input, and outputs memoizing (Packrat) PEG parsers in Python.

Grako is different from other PEG parser generators:

  • Generated parsers use Python’s very efficient exception-handling system to backtrack. Grako generated parsers simply assert what must be parsed. There are no complicated if-then-else sequences for decision making or backtracking. Memoization allows going over the same input sequence several times in linear time.

  • Positive and negative lookaheads, and the cut element (with its cleaning of the memoization cache) allow for additional, hand-crafted optimizations at the grammar level.

  • Delegation to Python’s re module for lexemes allows for (Perl-like) powerful and efficient lexical analysis.

  • The use of Python’s context managers considerably reduces the size of the generated parsers for code clarity, and enhanced CPU-cache hits.

  • Include files, rule inheritance, and rule inclusion give Grako grammars considerable expressive power.

  • Automatic generation of Abstract Syntax Trees and Object Models, along with Model Walkers and Code Generators make analysis and translation approachable

The parser generator, the run-time support, and the generated parsers have measurably low Cyclomatic complexity. At around 5 KLOC of Python, it is possible to study all its source code in a single session.

The only dependencies are on the Python standard library, yet the regex library will be used if installed, and colorama will be used on trace output if available. pygraphviz is required for generating diagrams.

Grako is feature-complete and currently being used with complex grammars to parse, analyze, and translate hundreds of thousands of lines of input text, including source code in several programming languages.

Rationale

Grako was created to address some recurring problems encountered over decades of working with parser generation tools:

  • Some programming languages allow the use of keywords as identifiers, or have different meanings for symbols depending on context (Ruby). A parser needs control of lexical analysis to be able to handle those languages.

  • LL and LR grammars become contaminated with myriads of lookahead statements to deal with ambiguous constructs in the source language. PEG parsers address ambiguity from the onset.

  • Separating the grammar from the code that implements the semantics, and using a variation of a well-known grammar syntax (EBNF) allows for full declarative power in language descriptions. General-purpose programming languages are not up to the task.

  • Semantic actions do not belong in a grammar. They create yet another programming language to deal with when doing parsing and translation: the source language, the grammar language, the semantics language, the generated parser’s language, and the translation’s target language. Most grammar parsers do not check the syntax of embedded semantic actions, so errors get reported at awkward moments, and against the generated code, not against the grammar.

  • Preprocessing (like dealing with includes, fixed column formats, or structure-through-indentation) belongs in well-designed program code; not in the grammar.

  • It is easy to recruit help with knowledge about a mainstream programming language like Python, but help is hard to find for working with complex grammar-description languages. Grako grammars are in the spirit of a Translators and Interpreters 101 course (if something is hard to explain to a college student, it’s probably too complicated, or not well understood).

  • Generated parsers should be easy to read and debug by humans. Looking at the generated source code is sometimes the only way to find problems in a grammar, the semantic actions, or in the parser generator itself. It’s inconvenient to trust generated code that one cannot understand.

  • Python is a great language for working with language parsing and translation.

Documentation

The complete documentation is available at Grako’s home page.

License

Grako is Copyright (C) 2012-2016 by Thomas Bragg and Juancarlo Añez

You may use the tool under the terms of the BSD-style license described in the enclosed LICENSE.txt file. If your project requires different licensing please email.

Changes

See the CHANGELOG for details.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

grako-3.16.5.zip (222.6 kB view details)

Uploaded Source

grako-3.16.5.tar.gz (170.8 kB view details)

Uploaded Source

Built Distribution

grako-3.16.5-py2.py3-none-any.whl (76.4 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file grako-3.16.5.zip.

File metadata

  • Download URL: grako-3.16.5.zip
  • Upload date:
  • Size: 222.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for grako-3.16.5.zip
Algorithm Hash digest
SHA256 f9e30bd72c8b382f49168a1901d5aa4b5be102f6730915c14c6b4803a7260634
MD5 437e1ebffef9a7c40e61cbd3e150c06a
BLAKE2b-256 0a7c4bf3c51ac4ac0248e72aa0bdedf0d89f3c353236155ddfd14d75630b90b3

See more details on using hashes here.

File details

Details for the file grako-3.16.5.tar.gz.

File metadata

  • Download URL: grako-3.16.5.tar.gz
  • Upload date:
  • Size: 170.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for grako-3.16.5.tar.gz
Algorithm Hash digest
SHA256 76889329f092380fcf076e6d35c10cfed8999db958e514bed028eba4c929861c
MD5 48827d481489c1814674d3a11c3cf16d
BLAKE2b-256 677427e8ab8b7c401714492e77b5a9b5d92a8795f7aa99bf5f43b820cc71072b

See more details on using hashes here.

File details

Details for the file grako-3.16.5-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for grako-3.16.5-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 02fa6861ebe36a286229672f6b5a1a0b0dbc1e340a02ed07b9fc1c4a327d27d5
MD5 4528201d68b8c0d0829c9c1224c5a13d
BLAKE2b-256 0a2ce1ecc7ee2593e662f989ee5bd3fecb72216ddc8f28f0e74e0c6377ee05f7

See more details on using hashes here.

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