The DDA Domain Specific Language¶
The DDA domain specific language, also refered to as “traditional dda”, is the C-like language invented by Bernd for his Perl’ish dda code.
It basically reads as the following snippet:
# Single-line comments are written like this
dt = const(0.5) # constants are defined like this
y0 = const(1)
z = mult(y, y)
y = int(y, dt, y0)
As you see, variables do not even have to be introduced and can be used in any order. There is only one data type, the analog line signal which is basically a real number within a fixed interval.
Note
Interestingly, traditional DDA files are a python subset and thus can be easily parsed and generated by python syntax. That’s why the code of this PyDDA module is so short. That’s also a primary reason why DDA was rewritten in Python.
Demonstration usage of this module:
>>> traditional_dda_document='''
... # Single-line comments are written like this
...
... dt = const(0.5) # constants are defined like this
... y0 = const(1)
...
... z = mult(y, y)
... y = int(y, dt, y0)
... '''
>>> state = read_traditional_dda(traditional_dda_document)
>>> state
State({'dt': const(0.5), 'y': int(y, dt, y0), 'y0': const(1), 'z': mult(y, y)})
>>> print(to_traditional_dda(state))
# Canonical DDA file generated by PyDDA
dt = const(0.5)
y = int(y, dt, y0)
y0 = const(1)
z = mult(y, y)
-
dda.dsl.to_traditional_dda(state, cleanup=True, prefix='# Canonical DDA file generated by PyDDA\n', suffix='\n')[source]¶ Export state to canonical dda file format (i.e. without all the python).
Returns the generated DDA file as string
-
dda.dsl.read_traditional_dda(content, return_ordered_dict=False)[source]¶ Read some traditional dda file. We use the Python parser (
astbuiltin) for this job. This is possible because the DDA syntax is a python subset and the parser doesn’t care about semantics, only syntax.Thanks to the
astbuiltin package, we can just transform the python AST to the Symbolic/State class data structures used in this module.Note
If some of the assertions fail, you can debug your DDA file by inspecting the output of ast.parse(content) on iPython. You can also run the Python debugger (pdb) on this function, for instance in iPython:
>>> %pdb >>> read_traditional_dda(file("foo.dda").read())
Returns a state instance or OrderedDict, on preference.
-
dda.dsl.read_traditional_dda_file(filename, **kwargs)[source]¶ Syntactic sugar for
read_traditional_dda(), so users can directly pass a filename if the have their DDA code in a file.
-
dda.dsl.cli_exporter()[source]¶ A Command Line Interface (CLI) for PyDDA.
This CLI API does mainly what the old dda2c.pl script did, i.e. translating a (traditional) DDA file to C code. There are fewer options, because –iterations, –modulus and –variables are now runtime options for the generated C program.
However, we can generate much more then C. Output is always text.
Invocation is either
python -m dda --helporpython -m dda.dsl --helpanywhere from the system.setup.pyprobably also installed apyddabinary somewhere calling the same. You can also just call./dsl.py --help.