Meld Grammar Reference
This document provides a comprehensive reference for the Meld syntax.
Core Tokens
Directives
Directives must appear at start of line (no indentation):
@embed - Include content from files
@run - Execute shell commands
@import - Import variables and commands from other Meld files
@define - Create reusable commands
@text - Define text variables
@path - Define filesystem path variables
@data - Define structured data variables
Comments
Lines that begin with >> (two greater-than signs followed by a space) are treated as comments:
>> This is a comment
>> Comments must start at beginning of line (no indentation)
@text message = "Hello" >> Invalid - comments must be on their own line
- Must appear at start of line (no indentation)
- Everything after
>>on that line is ignored - Cannot be added to the end of directive lines
- Preserves comments exactly as written
Delimiters
[ ] Command/path boundaries
[[ ]] Multi-line command boundaries
{ } Function embed boundaries
{{ }} Multi-line object boundaries
# Section marker
= Assignment (requires spaces on both sides)
. Metadata/field accessor
, List separator
>> Format operator
() Command parameter list
: Schema reference operator (optional)
++ String concatenation operator (requires spaces on both sides)
String Values
- Must be quoted with ', ", or `
- Quotes must match (no mixing)
- Backslashes and quotes within strings are treated as literal characters
- Single-line strings (', ") cannot contain newlines
- Template literals (
) can interpolate variables:Hello {{name}}` - Multi-line strings use [[
and]] delimiters
Identifiers
- Must start with letter or underscore
- Can contain letters, numbers, underscore
- Case-sensitive
- Cannot be empty
Variable Types
Path Variables
Syntax: $identifier
$path # Reference a path variable
$HOMEPATH or $~ # Special path variable for home directory
$PROJECTPATH or $. # Special path variable for project root
Text Variables
Syntax: {{identifier}}
{{textvar}} # Text variable reference
{{textvar>>(format)}} # Formatted text variable
Data Variables
Syntax: {{identifier}}
{{datavar}} # Data variable reference
{{datavar.field}} # Data variable field access
{{datavar.0}} # Array element access (use dot notation)
{{datavar.field>>(format)}} # Formatted data field access
Code Fences
Triple backticks that:
- Must appear at start of line
- Can optionally be followed by a language identifier
- Must be closed with exactly the same number of backticks
- Content inside is treated as literal text
- Support nesting with different numbers of backticks
Example:
```python
def hello():
print("Hi") # @text directives here are preserved as-is
```
Directive Patterns
@embed
@embed [path]
@embed [path # section_text]
@embed [path] as ### # ### parsed as count of # chars
@embed [path # section_text] as ###
@embed [path] under header_text
@run
@run [command_text]
@run [command_text] under header_text
@run [$command({{textvar1}}, {{textvar2}})]
@import
@import [path]
@define
@define identifier = @run [content]
@define command(param1, param2) = @run [content {{param1}} {{param2}}]
@define command.risk = "description"
@define command.about = "description"
@define command.meta = "description"
@text
@text identifier = "value"
@text identifier = @embed [content]
@text identifier = @run [command]
@path
@path identifier = "$HOMEPATH/path"
@path identifier = "$~/path"
@path identifier = "$PROJECTPATH/path"
@path identifier = "$./path"
@data
@data identifier = value
@data identifier : schema = value
String Concatenation
Uses the ++ operator with required spaces on both sides:
@text greeting = "Hello" ++ " " ++ "World"
@text message = {{intro}} ++ {{body}}
Template Literals
Delimited by backticks (`):
`Hello {{name}}!` # Text variable
`Config: {{config.name}}` # Data variable with field
`{{greeting}}, your ID is {{user.id}}` # Mixed variables
Multi-line template literals:
@text prompt = [[`
System: {{role}}
Context:
{{context.data}}
User: {{username}}
`]]
Variable Interpolation Rules
Variable references are allowed in:
- Inside square brackets [...] for paths and commands
- Inside object literals {{...}} and single-line objects
- Inside template literals (backtick strings) for string interpolation
- Inside directive values after = (including object literals and template literals)
They are NOT allowed in:
- Plain text lines
- Regular string literals (use template literals instead)
- Outside of the contexts listed above
Rules for specific variable types:
- Path variables ($path) only allowed in path contexts
- Text variables ({{text}}) allowed in all interpolation contexts
- Data variables ({{data}}) allowed in all interpolation contexts except command parameters