5.6 KiB
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 ;
MacroStringLiteral
MacroStringLiteral:
'`' ( TEXT | '$(' [a-zA-Z0-9_]+ ')' )* '`';
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
| MacroStringLiteral
| 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
;
AssignmentDestination
AssignmentDestination:
Identifier
| Identifier '[' Expression ']'
;
PrefixOperator
PrefixOperator:
'!' | '-' | 'run'
;