---
name: "dte-syntax"
section: "5"
platform: "linux"
package: "dte"
version: "1.10-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/dte-syntax"
---

# dte-syntax(5)

Format of syntax highlighting files used by dte(1)

## NAME

dte-syntax - Format of syntax highlighting files used by [**dte**(1)](/dte/1.md)

## SYNOPSIS

Commands:\

Main commands:\
\
    **syntax** *name*\
\
    **state** *name* \[*emit-color*\]\
\
    **default** *color* *name*...\
\
    **list** \[**-i**\] *name* *string*...\

Conditionals:\
\
    **bufis** \[**-i**\] *string* *destination* \[*emit-name*\]\
\
    **char** \[**-bn**\] *characters* *destination* \[*emit-name*\]\
\
    **heredocend** *destination*\
\
    **inlist** *list* *destination* \[*emit-name*\]\
\
    **str** \[**-i**\] *string* *destination* \[*emit-name*\]\

Default actions:\
\
    **eat** *destination* \[*emit-name*\]\
\
    **heredocbegin** *subsyntax* *return-state*\
\
    **noeat** \[**-b**\] *destination*\

Other commands:\
\
    **recolor** *color* \[*count*\]\

## DESCRIPTION

A dte syntax file consists of multiple states. A state consists of optional conditionals and one default action. The best way understand the syntax is to read through some of the built-in syntax files, which can be printed with **dte -b**, for example:

-

  ```
  dte -b syntax/dte
  ```

The basic syntax used is the same as in [**dterc**(5)](/dterc/5.md) files, but the available commands are different.

Conditionals and default actions have a destination state. The special destination state **this** can be used to jump to the current state.

## COMMANDS

### Main commands

**syntax** *name*

Begin a new syntax. One syntax file can contain multiple syntax definitions, but you should only define one real syntax in one syntax file.

See also: sub-syntaxes.

**state** *name* \[*emit-color*\]

Add new state. Conditionals (if any) and one default action must follow. The first state is the **start** state.

**default** *color* *name*...

Set default *color* for emitted *name*.

Example:

-

  ```
  default numeric oct dec hex
  ```

If there is no color defined for *oct*, *dec* or *hex* then color *numeric* is used instead.

**list** \[**-i**\] *name* *string*...

Define a list of strings.

Example:

-

  ```
  list keyword if else for while do continue switch case
  ```

Use the **inlist** command to test if a buffered string is in a list.

- **-i**

  Make list case-insensitive.

### Conditionals

**bufis** \[**-i**\] *string* *destination* \[*emit-name*\]

Test if buffered bytes are same as *string*. If they are, emit *emit-name* and jump to *destination* state.

- **-i**

  Case-insensitive.

**char** \[**-bn**\] *characters* *destination* \[*emit-name*\]

Test if current byte is in the *characters* list. If it is then emit *emit-color* and jump to *destination* state. If *emit-name* is not given then the *destination* state's emit name is used.

*characters* is a list of strings. Ranges are supported (**a-d** is the same as **abcd**).

- **-b**

  Add byte to buffer.

- **-n**

  Invert character bitmap.

**heredocend** *destination*

Compare following characters to heredoc end delimiter and go to destination state if comparison is true.

**inlist** *list* *destination* \[*emit-name*\]

Test if buffered bytes are found in *list*. If found, emit *emit-name* and jump to *destination* state.

**str** \[**-i**\] *string* *destination* \[*emit-name*\]

See if following bytes are same as *string*. If they are, emit *emit-name* and jump to *destination* state.

- **-i**

  Case-insensitive.

NOTE: This conditional can be slow, especially if *string* is longer than two bytes.

### Default actions

The last command of every state must be a default action. It is an unconditional jump.

**eat** *destination* \[*emit-name*\]

Consume byte, emit *emit-name* color and continue to *destination* state.

**heredocbegin** *subsyntax* *return-state*

Store buffered bytes as heredoc end delimiter and go to *subsyntax*. Sub-syntax is like any other sub-syntax but it must contain a *heredocend* conditional.

**noeat** \[**-b**\] *destination*

Continue to *destination* state without emitting color or consuming byte.

- **-b**

  Don't stop buffering.

### Other commands

**recolor** *color* \[*count*\]

If *count* is given, recolor *count* previous bytes, otherwise recolor buffered bytes.

## SUB-SYNTAXES

Sub-syntaxes are useful when the same states are needed in many contexts.

Sub-syntax names must be prefixed with **.**. It's recommended to also use the main syntax name in the prefix. For example **.c-comment** if **c** is the main syntax.

A sub-syntax is a syntax in which some destination state's name is **END**. **END** is a special state name that is replaced by the state specified in another syntax.

Example:

-

  ```
  # Sub-syntax
  syntax .c-comment
  state comment
      char "*" star
      eat comment
  state star comment
      # END is a special state name
      char / END comment
      noeat comment
  # Main syntax
  syntax c
  state c code
      char " \t\n" c
      char -b a-zA-Z_ ident
      char "\"" string
      char "'" char
      # Call sub-syntax
      str "/*" .c-comment:c
      eat c
  # Other states removed
  ```

In this example the destination state **.c-comment:c** is a special syntax for calling a sub-syntax. **.c-comment** is the name of the sub-syntax and **c** is the return state defined in the main syntax. The whole sub-syntax tree is copied into the main syntax and all destination states in the sub-syntax whose name is **END** are replaced with **c**.

## SEE ALSO

[**dte**(1)](/dte/1.md), [**dterc**(5)](/dterc/5.md)

## AUTHORS

Craig Barnes\
 Timo Hirvonen
