Introduction ############ The Grammar ----------- The `grammar `__ uses Lark’s Earley parser algorithm. The grammar itself is not perfect. It may not reliably parse your source code or produce useful Python instances just yet. See `issues `__ for further details. As a fun side project, blark isn’t at the top of my priority list. For an idea of where the project is going, see the issues list. Requirements ------------ - `lark `__ (for grammar-based parsing) - `lxml `__ (for parsing TwinCAT projects) Capabilities ------------ - TwinCAT source code file parsing (``*.TcPOU`` and others) - TwinCAT project and solution loading - ``lark.Tree`` generation of any supported source code - Python dataclasses of supported source code, with introspection and code refactoring Works-in-progress ~~~~~~~~~~~~~~~~~ - Sphinx API documentation generation (a new Sphinx domain) - Code reformatting - “Dependency store” - recursively parse and inspect project dependencies - Summary generation - a layer on top of dataclasses to summarize source code details - Rewriting source code directly in TwinCAT source code files Installation ------------ Installation is quick with Pip. .. code:: bash pip install --upgrade blark Quickstart (pip / virtualenv with venv) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. Set up an environment using venv: .. code:: bash $ python -m venv blark_venv $ source blark_venv/bin/activate 2. Install the library with pip: .. code:: bash $ python -m pip install blark Quickstart (Conda) ~~~~~~~~~~~~~~~~~~ 1. Set up an environment using conda: .. code:: bash $ conda create -n blark-env -c conda-forge python=3.10 pip blark $ conda activate blark-env 2. Install the library from conda: .. code:: bash $ conda install blark Development install ~~~~~~~~~~~~~~~~~~~ If you run into issues or wish to run an unreleased version of blark, you may install directly from this repository like so: .. code:: bash $ python -m pip install git+https://github.com/klauer/blark Sample runs ----------- Run the parser or experimental formatter utility. Current supported file types include those from TwinCAT3 projects ( ``.tsproj``, ``.sln``, ``.TcPOU``, ``.TcGVL``) and plain-text ``.st`` files. .. code:: bash $ blark parse --print-tree blark/tests/POUs/F_SetStateParams.TcPOU function_declaration None F_SetStateParams indirect_simple_specification None simple_specification BOOL input_declarations None var1_init_decl var1_list ... (clipped) ... To interact with the Python dataclasses directly, make sure IPython is installed first and then try: :: $ blark parse --interactive blark/tests/POUs/F_SetStateParams.TcPOU # Assuming IPython is installed, the following prompt will come up: In [1]: results[0].identifier Out[1]: 'F_SetStateParams/declaration' In [2]: results[1].identifier Out[2]: 'F_SetStateParams/implementation' Dump out a parsed and reformatted set of source code: .. code:: bash $ blark format blark/tests/source/array_of_objects.st {attribute 'hide'} METHOD prv_Detection : BOOL VAR_IN_OUT currentChannel : ARRAY [APhase..CPhase] OF class_baseVector(SIZEOF(vector_t), 0); END_VAR END_METHOD blark supports rewriting TwinCAT source code files directly as well: .. code:: bash $ blark format blark/tests/POUs/F_SetStateParams.TcPOU `__ (GitHub fork `here `__) and `A Syntactic Specification for the Programming Languages of theIEC 61131-3 Standard `__ by Flor Narciso et al. Many aspects of the grammar have been added to, modified, and in cases entirely rewritten to better support lark grammars and transformers. Special thanks to the blark contributors: - @engineerjoe440 Related, Similar, or Alternative Projects ----------------------------------------- There are a number of similar, or related projects that are available. - `“MATIEC” `__ - another IEC 61131-3 Structured Text parser which supports IEC 61131-3 second edition, without classes, namespaces and other fancy features. An updated version is also `available on Github `__ - `OpenPLC Runtime Version 3 `__ - As stated by the project: > OpenPLC is an open-source Programmable Logic Controller that is based on easy to use software. Our focus is to provide a low cost industrial solution for automation and research. OpenPLC has been used in many research papers as a framework for industrial cyber security research, given that it is the only controller to provide the entire source code. - `RuSTy `__ `documentation `__ - Structured text compiler written in Rust. As stated by the project: > RuSTy is a structured text (ST) compiler written in Rust. RuSTy utilizes the LLVM framework to compile eventually to native code. - `IEC Checker `__ - Static analysis tool for IEC 61131-3 logic. As described by the maintainer: > iec-checker has the ability to parse ST source code and dump AST and CFG to JSON format, so you can process it with your language of choice. - `TcBlack `__ - Python black-like code formatter for TwinCAT code.