Skip to main content
Join the official Python Developers Survey 2018 and win valuable prizes: Start the survey!

Meta-language for DSL implementation inspired by Xtext

Project description

PyPI Version license build-status Documentation Status

textX is a meta-language for building Domain-Specific Languages (DSLs) in Python. It is inspired by Xtext.

In a nutshell, textX will help you build your textual language in an easy way. You can invent your own language or build a support for already existing textual language or file format.

From a single language description (grammar), textX will build a parser and a meta-model (a.k.a. abstract syntax) for the language. See the docs for the details.

textX follows the syntax and semantics of Xtext but differs in some places and is implemented 100% in Python using Arpeggio PEG parser - no grammar ambiguities, unlimited lookahead, interpreter style of work.

Quick intro

from textx import metamodel_from_str, get_children_of_type

grammar = """
Model: shapes*=Shape;
Shape: Circle | Line;
Circle: 'circle' center=Point '/' radius=INT;
Line: 'line' start=Point '/' end=Point;
Point: x=INT ',' y=INT;

mm = metamodel_from_str(grammar)

# Meta-model knows how to parse and instantiate models.
model = mm.model_from_str("""
    line 10, 10 / 20, 20
    line 14, 78 / 89, 33
    circle 14, 20/10
    line 18, 89 / 78, 65

# At this point model is plain Python object graph with instances of
# dynamically created classes and attributes following the grammar.

def _(p):
    "returns coordinate of the given Point as string"
    return "{},{}".format(p.x, p.y)

for shape in model.shapes:
    if shape.__class__.__name__ == 'Circle':
        print('Circle: center={}, radius={}'
              .format(_(, shape.radius))
        print('Line: from={} to={}'.format(_(shape.start), _(shape.end)))

# Output:
# Line: from=10,10 to=20,20
# Line: from=14,78 to=89,33
# Circle: center=14,20, radius=10
# Line: from=18,89 to=78,65

# Collect all points starting from the root of the model
points = get_children_of_type("Point", model)
for point in points:
    print('Point: {}'.format(_(point)))

# Output:
# Point: 10,10
# Point: 20,20
# Point: 14,78
# Point: 89,33
# Point: 14,20
# Point: 18,89
# Point: 78,65

Video tutorials

Introduction to textX

Implementing Martin Fowler’s State Machine DSL in textX

Docs and tutorials

The full documentation with tutorials is available at

Support in IDE/editors

Discussion and help

For bug report, general discussion and help please use GitHub issue tracker.



Python versions

Tested for 2.7, 3.3+

Project details

Download files

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

Filename, size & hash SHA256 hash help File type Python version Upload date
textX-1.8.0-py2.py3-none-any.whl (51.2 kB) Copy SHA256 hash SHA256 Wheel py2.py3 Oct 6, 2018
textX-1.8.0.tar.gz (44.3 kB) Copy SHA256 hash SHA256 Source None Oct 6, 2018

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page