Skip to main content

Lauterbach TRACE32® script language grammar for Tree-sitter

Project description

tree-sitter-t32

CI Status status-badge

Lauterbach TRACE32® script language grammar for tree-sitter. Support for HLL expressions was adapted from tree-sitter-c.

A demo is available here.

Features

  • Full coverage of the PRACTICE script language including TRACE32® commands & functions
  • Extended support for HLL expressions

Quick Start

Dependencies

Commands

Generate parser

Create and build the tree-sitter parser for the TRACE32® grammar.

tree-sitter generate

Parse TRACE32® Script

Use tree-sitter to parse a TRACE32® script.

Example:

; --------------------------------------------------------------------------------
; @Title: Beautify an existing PRACTICE script
; @Description:
;   Beautifies the script, fixing the CamelCasing and indentation.
; @Keywords: PRACTICE, EDIT.FORMAT, CamelCasing, indent, beautify
; @Author: MOB
; @Copyright: (C) 1989-2020 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: beautify.cmm 19661 2022-07-29 15:43:03Z rweiss $

PARAMETERS &script

IF "&script"==""
(
  DIALOG.File.open *.cmm
  ENTRY %LINE &script
)

IF FILE.EXIST("&script")
(
  ECHO %COLOR.GRAY "beautifying: &script"
  SETUP.EDITOR.TYPE PowerView ; required for EDIT.FORMAT
  PEDIT "&script"
  EDIT.FORMAT /Beautify
  EDIT.SAVE "&script"
  EDIT.CLOSE "&script"
  ECHO %COLOR.GREEN "beautified: &script"
)
ELSE
(
  ECHO %ERROR "Error: no such file: &script"
)

ENDDO
tree-sitter parse <path>
Prints the syntax tree
(script [0, 0] - [34, 0]
  (comment [0, 0] - [1, 0])
  (comment [1, 0] - [2, 0])
  (comment [2, 0] - [3, 0])
  (comment [3, 0] - [4, 0])
  (comment [4, 0] - [5, 0])
  (comment [5, 0] - [6, 0])
  (comment [6, 0] - [7, 0])
  (comment [7, 0] - [8, 0])
  (comment [8, 0] - [9, 0])
  (parameter_declaration [10, 0] - [11, 0]
    command: (identifier [10, 0] - [10, 10])
    macro: (macro [10, 11] - [10, 18]))
  (if_block [12, 0] - [18, 0]
    command: (identifier [12, 0] - [12, 2])
    condition: (binary_expression [12, 3] - [12, 16]
      left: (string [12, 3] - [12, 12]
        (macro [12, 4] - [12, 11]))
      right: (string [12, 14] - [12, 16]))
    (block [13, 0] - [17, 0]
      (command_expression [14, 2] - [15, 0]
        command: (identifier [14, 2] - [14, 18])
        arguments: (argument_list [14, 18] - [14, 24]
          (path [14, 19] - [14, 24])))
      (parameter_declaration [15, 2] - [16, 0]
        command: (identifier [15, 2] - [15, 7])
        (identifier [15, 8] - [15, 13])
        macro: (macro [15, 14] - [15, 21]))))
  (if_block [18, 0] - [32, 0]
    command: (identifier [18, 0] - [18, 2])
    condition: (call_expression [18, 3] - [18, 24]
      function: (identifier [18, 3] - [18, 13])
      arguments: (argument_list [18, 13] - [18, 24]
        (string [18, 14] - [18, 23]
          (macro [18, 15] - [18, 22]))))
    (block [19, 0] - [28, 0]
      (command_expression [20, 2] - [21, 0]
        command: (identifier [20, 2] - [20, 6])
        arguments: (argument_list [20, 6] - [20, 41]
          (format_expression [20, 7] - [20, 18]
            value: (identifier [20, 8] - [20, 13])
            value: (identifier [20, 14] - [20, 18]))
          (string [20, 19] - [20, 41]
            (macro [20, 33] - [20, 40]))))
      (command_expression [21, 2] - [22, 0]
        command: (identifier [21, 2] - [21, 19])
        arguments: (argument_list [21, 19] - [21, 29]
          (identifier [21, 20] - [21, 29]))
        (comment [21, 29] - [22, 0]))
      (command_expression [22, 2] - [23, 0]
        command: (identifier [22, 2] - [22, 7])
        arguments: (argument_list [22, 7] - [22, 17]
          (string [22, 8] - [22, 17]
            (macro [22, 9] - [22, 16]))))
      (command_expression [23, 2] - [24, 0]
        command: (identifier [23, 2] - [23, 13])
        arguments: (argument_list [23, 13] - [23, 23]
          (option_expression [23, 14] - [23, 23]
            option: (identifier [23, 15] - [23, 23]))))
      (command_expression [24, 2] - [25, 0]
        command: (identifier [24, 2] - [24, 11])
        arguments: (argument_list [24, 11] - [24, 21]
          (string [24, 12] - [24, 21]
            (macro [24, 13] - [24, 20]))))
      (command_expression [25, 2] - [26, 0]
        command: (identifier [25, 2] - [25, 12])
        arguments: (argument_list [25, 12] - [25, 22]
          (string [25, 13] - [25, 22]
            (macro [25, 14] - [25, 21]))))
      (command_expression [26, 2] - [27, 0]
        command: (identifier [26, 2] - [26, 6])
        arguments: (argument_list [26, 6] - [26, 41]
          (format_expression [26, 7] - [26, 19]
            value: (identifier [26, 8] - [26, 13])
            value: (identifier [26, 14] - [26, 19]))
          (string [26, 20] - [26, 41]
            (macro [26, 33] - [26, 40])))))
    (else_block [28, 0] - [32, 0]
      command: (identifier [28, 0] - [28, 4])
      (block [29, 0] - [32, 0]
        (command_expression [30, 2] - [31, 0]
          command: (identifier [30, 2] - [30, 6])
          arguments: (argument_list [30, 6] - [30, 44]
            (format_expression [30, 7] - [30, 13]
              value: (identifier [30, 8] - [30, 13]))
            (string [30, 14] - [30, 44]
              (macro [30, 36] - [30, 43])))))))
  (command_expression [33, 0] - [34, 0]
    command: (identifier [33, 0] - [33, 5])))

Highlight TRACE32® Script

Use tree-sitter to highlight a TRACE32® script.

tree-sitter highlight <path>
Prints the highlighted file

asciicast

Create Code Navigation Tags

Use tree-sitter to create a tags file from a TRACE32® script.
; --------------------------------------------------------------------------------
; @Title: Example test case for Unittests
; @Description:
;   This is an example for a test case which can be executed with lbunit.cmm.
; @Keywords: lbtest test case
; @Author: MOB
; @Copyright: (C) 1989-2015 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: test_example.cmm 8648 2015-09-03 17:04:05Z mobermeir $

; the following block must be present in the beginning of every test case
PRIVATE &func &args &result
ENTRY &func %LINE &args
GOSUB &func &args // call subroutine and return result
ENTRY %LINE &result
ENDDO &result
; end of mandatory block

; SetupTestCase will be called once at the beginning of the test case
; It can be removed if it is not needed.
SetupTestCase:
(
  PRIVATE &date
  &date=DATE.DATE()+" "+DATE.TIME()
  PUTS "test case started at: &date"
  RETURN
)

; SetupTest will be called just before every test
; It can be removed if it is not needed.
SetupTest:
(
  ; here can be some setup
  Data.Set VM:0x0--0xFF 0xA
  RETURN
)

; All tests must start with "Test_"
Test_MyFirstTest:
(
  ; Assertions can be used:
  A_FALSE FALSE()
  A_TRUE (1.+1.==2.)
  RETURN
)

Test_MySecondTest:
(
  A_NUM_EQ 0xA Data.Byte(VM:0x0)
  A_X_PASS Data.Set VM:0x0 0xB
  A_NUM_EQ 0xB Data.Byte(VM:0x0)
  RETURN
)

Test_MyThirdTest:
(
  ; Tests can return "PASS", "FAIL" or "NOT_EXEC"
  ; (alternatively or in addition to assertions)
  IF (0xA!=Data.Byte(VM:0x0))
  (
    RETURN "FAIL"
  )
  ELSE IF (0xB==Data.Byte(VM:0x0))
  (
    RETURN "NOT_EXEC"
  )
  ELSE
  (
    RETURN "PASS"
  )
  RETURN // same as "PASS"
)

MyHelper:
(
  A_NUM_EQ 0xA Data.Byte(VM:0x10)
  RETURN
)

Test_MyFourthTest:
(
  ; tests can call helper functions
  RePeaT 2.
  (
    GOSUB MyHelper
  )
  RETURN
)

DisabledTest_MyFifthTest:
(
  ; this routine will not be executed since it doesn't start with "Test_"
  RETURN
)

; TearDownTest will be called just after every test
; It can be removed if it is not needed.
TearDownTest:
(
  ; here could be some cleanup
  Break.RESet
  RETURN
)

; TearDownTestCase will be called once at the end of the test case
; It can be removed if it is not needed.
TearDownTestCase:
(
  PRIVATE &date
  &date=DATE.DATE()+" "+DATE.TIME()
  PUTS "test case ended at: &date"
  RETURN
)
tree-sitter tags <path>
Prints a list of tags
func      	 | call    	ref (13, 7) - (13, 11) `GOSUB &func &args // call subroutine and return result`
SetupTestCase	 | function	def (20, 0) - (20, 13) `SetupTestCase:`
SetupTest 	 | function	def (30, 0) - (30, 9) `SetupTest:`
Test_MyFirstTest	 | function	def (38, 0) - (38, 16) `Test_MyFirstTest:`
Test_MySecondTest	 | function	def (46, 0) - (46, 17) `Test_MySecondTest:`
Test_MyThirdTest	 | function	def (54, 0) - (54, 16) `Test_MyThirdTest:`
MyHelper  	 | function	def (73, 0) - (73, 8) `MyHelper:`
Test_MyFourthTest	 | function	def (79, 0) - (79, 17) `Test_MyFourthTest:`
MyHelper  	 | call    	ref (84, 10) - (84, 18) `GOSUB MyHelper`
DisabledTest_MyFifthTest	 | function	def (89, 0) - (89, 24) `DisabledTest_MyFifthTest:`
TearDownTest	 | function	def (97, 0) - (97, 12) `TearDownTest:`
TearDownTestCase	 | function	def (106, 0) - (106, 16) `TearDownTestCase:`

Development

There is a makefile to simplify the most common activities. The makefile expects you to have Yarn installed and set up.

To build the parser from the grammar:

make build

To run all tests:

make test-all

Editor Support

Editor Plugin Syntax Highlighting Local Variables Folds Indents
Neovim nvim-treesitter
Helix

nvim-treesitter

Run

:TSInstall t32

to automatically install the supported grammar.

Limitations

  • (symbol) nodes that represent an unquoted module, like \module, cannot be differentiated from user-defined TRACE32 internal HLL variables, e.g. \x.
  • (symbol) nodes that depend on the hex radix mode cannot always be kept apart from (address) nodes, e.g. P:A::B:0x800. To avoid conflicts always add the radix mode to the number.
  • Commands from the Var command group that contain multiple chained (format_expression) (_hll_expression) blocks
  • Unquoted (path) nodes are not clearly distinguishable from other literal types in command argument lists.
  • For HLL expressions used at the top level of commands, the use of spaces is more restricted than for nested expressions inside parentheses. The grammar only models the strict behavior.
  • (recursive_macro_expansion) nodes are restricted to the left-hand side of assignment expressions. In other contexts, recursive PRACTICE macro expansions cannot be distinguished from && operators.

Packages

Language Package Download
Node.js npm
Python PyPI 📦
Rust crates.io

Mirrors

This repository is mirrored to https://gitlab.com/xasc/tree-sitter-t32 and https://github.com/xasc/tree-sitter-t32. The main repository is https://codeberg.org/xasc/tree-sitter-t32.

Contributing

For the time being, we are not accepting pull requests. However, please feel free to open issues for changes you would like to see.

License

Distributed under the MIT license. REUSE is used for managing licensing information throughout the project. For more accurate licensing information, please check the individual files.

References

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

tree_sitter_t32-9.0.0.tar.gz (263.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

tree_sitter_t32-9.0.0-cp310-abi3-win_arm64.whl (124.3 kB view details)

Uploaded CPython 3.10+Windows ARM64

tree_sitter_t32-9.0.0-cp310-abi3-win_amd64.whl (126.0 kB view details)

Uploaded CPython 3.10+Windows x86-64

tree_sitter_t32-9.0.0-cp310-abi3-musllinux_1_2_x86_64.whl (147.7 kB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ x86-64

tree_sitter_t32-9.0.0-cp310-abi3-musllinux_1_2_aarch64.whl (148.4 kB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

tree_sitter_t32-9.0.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (148.3 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

tree_sitter_t32-9.0.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (149.7 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

tree_sitter_t32-9.0.0-cp310-abi3-macosx_11_0_arm64.whl (129.6 kB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

tree_sitter_t32-9.0.0-cp310-abi3-macosx_10_9_x86_64.whl (122.9 kB view details)

Uploaded CPython 3.10+macOS 10.9+ x86-64

File details

Details for the file tree_sitter_t32-9.0.0.tar.gz.

File metadata

  • Download URL: tree_sitter_t32-9.0.0.tar.gz
  • Upload date:
  • Size: 263.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tree_sitter_t32-9.0.0.tar.gz
Algorithm Hash digest
SHA256 da6986750ac448cfc59654ea1be7b673e23e31a96e03407d6526bbbd33d6129f
MD5 1f79889a535ff4f72ec377ce6dc26822
BLAKE2b-256 16d78e3856b707a1804638801ebd5b2cebce9c6ffca2e5ada94b99c54b26e854

See more details on using hashes here.

File details

Details for the file tree_sitter_t32-9.0.0-cp310-abi3-win_arm64.whl.

File metadata

File hashes

Hashes for tree_sitter_t32-9.0.0-cp310-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 1a335d227631d657539ead7c6f74c83d0c542c80a13a5e0b3aa2ce14958c4ddb
MD5 166efae67b267e298148d986dd671cbf
BLAKE2b-256 45a7a635f6c425176ed99b0e305aba5f5f3eb1445a3e207a55c842c02b68215e

See more details on using hashes here.

File details

Details for the file tree_sitter_t32-9.0.0-cp310-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for tree_sitter_t32-9.0.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 b294efdc295f8b7bc5eac1eef88fa071dee7cef965b5ebf43d60ea10dab765aa
MD5 06af3f8e931ae0a04b9428a7b47348d6
BLAKE2b-256 c081a8ddd84b51a1541e55b7cb38edd4506678937aaec5b932c5777dce3c52e1

See more details on using hashes here.

File details

Details for the file tree_sitter_t32-9.0.0-cp310-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tree_sitter_t32-9.0.0-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c321157724f73eed0f9d6b49f9d745ac35927d96984a16a93479cf8c7bd518f8
MD5 88e45086b36f35d9442ec41e4d569b85
BLAKE2b-256 5befc149fb0e749dd36ee5b51dd8e1b36a98be4f60c500e9f92eb0089134e8cb

See more details on using hashes here.

File details

Details for the file tree_sitter_t32-9.0.0-cp310-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tree_sitter_t32-9.0.0-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 598aa2ba17568b5acf87e77389fd5f3e4a4e24e1a2a5b4e08aed38e5f84c00eb
MD5 6dd0d179bc9550b3eb89b3634951f980
BLAKE2b-256 1957fb5b990059db654df54103fe62c6a113ebb4839aa42e58eda5ac644c7982

See more details on using hashes here.

File details

Details for the file tree_sitter_t32-9.0.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for tree_sitter_t32-9.0.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a7830995e0b0da9cd4e44a781b4821604f192085d50bb3569c16cf68c14f656e
MD5 7032c94fd903d93794e5b51c289f7d2b
BLAKE2b-256 6522d0a814d7d064579e65d51d9880d1b7f5228c140ccc5675e3d4401c1286b0

See more details on using hashes here.

File details

Details for the file tree_sitter_t32-9.0.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for tree_sitter_t32-9.0.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8248c9926c0471997c0b2300dc6edf3aeb736dea930ce1733dd58e1e3ef62cb6
MD5 a1e139a9386f97826a96d07834b3d329
BLAKE2b-256 ec22450f795cd9ba3953c0b28072391282488673af9967987b32e473c7bf1dc0

See more details on using hashes here.

File details

Details for the file tree_sitter_t32-9.0.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tree_sitter_t32-9.0.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 544d29994c4c44cbfa293e18c89b12a486162bce381754937a8ec35235f2cdf6
MD5 817ab00289f4bc1d566d562c6f51d197
BLAKE2b-256 691f6c46e1d07ce36354937450618548465f3abfc4ed72fd1e888375950c6bf2

See more details on using hashes here.

File details

Details for the file tree_sitter_t32-9.0.0-cp310-abi3-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for tree_sitter_t32-9.0.0-cp310-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a5b8ef355541caec44225efeb59822ac8525ebecb29a20192fc6bbdf64455d54
MD5 4488e1cf6ea596ca90b72395792a1372
BLAKE2b-256 46c8318f76cd1de5b335b10a4ae773bb4f3f8ebf4b38630a99d4687cdcc07d7b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page