Skip to main content

Meta-language for DSL implementation inspired by Xtext

Project description

https://raw.githubusercontent.com/igordejanovic/textX/master/art/textX-logo.png

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.center), shape.radius))
    else:
        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

https://img.youtube.com/vi/CN2IVtInapo/0.jpg

Implementing Martin Fowler’s State Machine DSL in textX

https://img.youtube.com/vi/HI14jk0JIR0/0.jpg

Docs and tutorials

The full documentation with tutorials is available at http://igordejanovic.net/textX/

Discussion and help

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

License

MIT

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.

Source Distribution

textX-1.7.0.tar.gz (44.4 kB view details)

Uploaded Source

Built Distribution

textX-1.7.0-py2.py3-none-any.whl (50.8 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file textX-1.7.0.tar.gz.

File metadata

  • Download URL: textX-1.7.0.tar.gz
  • Upload date:
  • Size: 44.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for textX-1.7.0.tar.gz
Algorithm Hash digest
SHA256 c6b6a91bd82a8727afbfa040a36fa8597fc925a71ea906ec480317aec9e29d71
MD5 6f6ecd36e8d80228993040efb119ea45
BLAKE2b-256 9f8a02a7d23f8e7fb603baf5f8c5a38cf3a66f08928d5f35dae84bc75d5ba921

See more details on using hashes here.

Provenance

File details

Details for the file textX-1.7.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for textX-1.7.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 4c8388ad91bdc7d14d6c1c2a12c9e1cd29f3d8a6cf084aba6a26546b863ec3b0
MD5 e0ad687f9e0165524276fcbb9e72cdc2
BLAKE2b-256 692b17c7cc82e3921535a5f044307582364fe33017ced22f066dd62b01283885

See more details on using hashes here.

Provenance

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