shulkerscript-lang/grammar.md

5.6 KiB

Grammar of the Shulkerscript language

Program

Program:
  Namespace
  Declaration*
  ;

Declaration

Declaration:
    Function
    | Import
    | TagDeclaration
    | ('pub'? VariableDeclaration ';')
  ;

Namespace

Namespace:
   'namespace' StringLiteral ';' ;

Function

Function:
    Annotation* 'pub'? 'fn' Identifier '(' FunctionParameterList? ')' Block
    ;

Import

Import:
    'from' StringLiteral 'import' ('*' | Identifier (',' Identifier)*) ';'
    ;

TagDeclaration

TagDeclaration:
    'tag' ('<' StringLiteral '>')? StringLiteral 'replace'? '[' (StringLiteral (',' StringLiteral)*)? ']'
    ;

VariableDeclaration

VariableDeclaration:
   SingleVariableDeclaration
   | ArrayVariableDeclaration
   | ScoreVariableDeclaration
   | TagVariableDeclaration
   | ComptimeValueDeclaration
   ;

StringLiteral

StringLiteral:
  '"' TEXT '"';

Annotation

Annotation:
    '#[' AnnotationAssignment ']'
    ;

Block

Block:
    '{' Statement* '}'
    ;

FunctionParameterList

FunctionParameterList:
    FunctionArgument (',' FunctionArgument)* ','?  
    ;

ArrayVariableDeclaration

ArrayVariableDeclaration:
    ('int' | 'bool') '[' integer ']' identifier VariableDeclarationAssignment?

ComptimeValueDeclaration

ComptimeValueDeclaration:
    'val' identifier VariableDeclarationAssignment?

ScoreVariableDeclaration

ScoreVariableDeclaration:
    'int' ('<' StringLiteral '>')? identifier '[' AnyStringLiteral? ']' VariableDeclarationAssignment?

SingleVariableDeclaration

SingleVariableDeclaration:
    ('int' | 'bool') identifier VariableDeclarationAssignment?

TagVariableDeclaration

TagVariableDeclaration:
    'bool' identifier '[' AnyStringLiteral? ']' VariableDeclarationAssignment?

AnnotationAssignment

AnnotationAssignment:
    Identifier AnnotationValue
    ;

Statement

Statement:
    Block
    | LiteralCommand
    | Conditional
    | Grouping
    | DocComment
    | ExecuteBlock
    | Semicolon
    ;

FunctionArgument

FunctionArgument:
    FunctionVariableType Identifier
    ;

VariableDeclarationAssignment

VariableDeclarationAssignment:
    '=' Expression

AnyStringLiteral

AnyStringLiteral: StringLiteral | MacroStringLiteral ;

AnnotationValue

AnnotationValue:
    '=' Expression
    | '(' AnnotationAssignment ( ',' AnnotationAssignment )* ')'
    ;

Conditional

Conditional:
'if' Parenthized
;

ExecuteBlock

ExecuteBlock:
   (ExecuteBlockHead ExecuteBlockTail)
  | (Conditional Block Else)
  ;

Grouping

Grouping:
  'group' Block
;

Semicolon

Semicolon:
  SemicolonStatement ';'
  ;

FunctionVariableType

FunctionVariableType:
    'macro' | 'int' | 'bool' | 'val'
    ;

Expression

Expression:
    Primary | Binary ;

Else

Else:
    'else' Block
    ;

ExecuteBlockHead

ExecuteBlockHead:
  Conditional
 | Align
 | Anchored
 | As
 | AsAt
 | At
 | Facing
 | In
 | On
 | Positioned
 | Rotated
 | Store
 | Summon
;

ExecuteBlockTail

ExecuteBlockTail:
 ExecuteBlock
| Block
;

SemicolonStatement

SemicolonStatement:
  (Expression | VariableDeclaration | Assignment | ReturnStatement)
  ';'
  ;

Binary

Binary:
    Expression BinaryOperator Expression
    ;

Primary

Primary:
    Identifier
    | Prefix
    | Parenthesized
    | Indexed
    | Integer
    | Boolean
    | StringLiteral
    | FunctionCall
    | MemberAccess
    | TemplateStringLiteral
    | LuaCode

Align

Align:
  'align' '(' AnyStringLiteral ')' ;

Anchored

Anchored:
  'anchored' '(' AnyStringLiteral ')' ;

As

As:
  'as' '(' AnyStringLiteral ')' ;

AsAt

AsAt:
  'asat' '(' AnyStringLiteral ')' ;

At

At:
  'at' '(' AnyStringLiteral ')' ;

Facing

Facing:
  'facing' '(' AnyStringLiteral ')' ;

In

In:
  'in' '(' AnyStringLiteral ')' ;

On

On:
  'on' '(' AnyStringLiteral ')' ;

Positioned

Positioned:
  'positioned' '(' AnyStringLiteral ')' ;

Rotated

Rotated:
  'rotated' '(' AnyStringLiteral ')' ;

Store

Store:
  'store' '(' AnyStringLiteral ')' ;

Summon

Summon:
  'summon' '(' AnyStringLiteral ')' ;

Assignment

Assignment:
   AssignmentDestination '=' Expression

ReturnStatement

ReturnStatement:
    `return` Expression ;

BinaryOperator

BinaryOperator:
    '+'
    | '-'
    | '*'
    | '/'
    | '%'
    | '=='
    | '!='
    | '<'
    | '<='
    | '>'
    | '>='
    | '&&'
    | '||'
    ;

FunctionCall

FunctionCall:
    Identifier '(' (Expression (',' Expression)*)? ')'
    ;

Indexed

Indexed:
    PrimaryExpression '[' Expression ']'
    ;

LuaCode

LuaCode:
    'lua' '(' (Expression (',' Expression)*)? ')' '{' (.*?)* '}'

MemberAccess

MemberAccess:
    Primary '.' Identifier

Parenthesized

Parenthesized:
    '(' Expression ')'
    ;

Prefix

Prefix:
    PrefixOperator Primary
    ;

TemplateStringLiteral

TemplateStringLiteral:
  '`' ( TEXT | '$(' Expression ')' )* '`';

AssignmentDestination

AssignmentDestination:
    Identifier
    | Identifier '[' Expression ']'
    ;

PrefixOperator

PrefixOperator:
    '!' | '-' | 'run'
    ;