Meta-language for DSL implementation inspired by Xtext
Project description
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.metamodel import metamodel_from_str
from textx.model import 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 = 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 http://igordejanovic.net/textX/
License
MIT
Python versions
Tested for 2.7, 3.3+
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 Distribution
Built Distribution
File details
Details for the file textX-1.6.tar.gz
.
File metadata
- Download URL: textX-1.6.tar.gz
- Upload date:
- Size: 41.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 88175b8e5e6a0eceb7a288dddd95461ddeddf5e6fe21a68febbeaa8328e89fdf |
|
MD5 | 3e46a45f795e5799fe7372c425ba3a85 |
|
BLAKE2b-256 | 1e5348a02f6aa44f4944e468c78c78e31b5fdbbe1e20c95a9fdea9d91aa6e291 |
Provenance
File details
Details for the file textX-1.6-py2.py3-none-any.whl
.
File metadata
- Download URL: textX-1.6-py2.py3-none-any.whl
- Upload date:
- Size: 55.0 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 92827fa05027b14c50d7b390e0a8f62d9404ade2dd7fac445a9813fcff838f83 |
|
MD5 | edd68274b3ab368dd1daef69b65574d1 |
|
BLAKE2b-256 | 19fb268f4bbfdcabcb2cc8fc652e2e286d5a5a019ededce455bac6b983692656 |