Appendix

BNF Syntax

This is the full grammar of the LSP language.

expression
    : ternary_expression
    | lambda_expression
    | table_expression
    ;

ternary_expression
    : or_expression
    | or_expression '?' ternary_expression ':' ternary_expression
    ;

or_expression
    : and_expression
    | or_expression '||' and_expression
    ;

and_expression
    : equality_expression
    | and_expression '&&' equality_expression
    ;

equality_expression
    : relational_expression
    | equality_expression '==' relational_expression
    | equality_expression '!=' relational_expression
    ;

relational_expression
    : range_expression
    | relational_expression 'is' range_expression
    | relational_expression 'is' 'nil'
    | relational_expression 'is' 'bool'
    | relational_expression 'is' 'int'
    | relational_expression 'is' 'double'
    | relational_expression '<' range_expression
    | relational_expression '>' range_expression
    | relational_expression '<=' range_expression
    | relational_expression '>=' range_expression
    ;

range_expression
    : additive_expression
    | additive_expression '..' additive_expression
    | additive_expression '...' additive_expression
    ;

additive_expression
    : multiplicative_expression
    | additive_expression '+' multiplicative_expression
    | additive_expression '-' multiplicative_expression
    ;

multiplicative_expression
    : unary_expression
    | multiplicative_expression '*' unary_expression
    | multiplicative_expression '/' unary_expression
    | multiplicative_expression '%' unary_expression
    ;

unary_expression
    : primary_expression
    | '+' unary_expression
    | '-' unary_expression
    | '!' unary_expression
    | 'typeof' unary_expression
    ;

primary_expression
    : identifier
    | 'true'
    | 'false'
    | 'nan'
    | 'inf'
    | 'nil'
    | string
    | integer
    | double
    | primary_expression '[' expression ']'
    | primary_expression '.' identifier
    | function_call
    | '(' expression ')'
    ;

lambda_expression
    : identifier '=>' block_statement
    | '(' function_identifier_list ')' '=>' block_statement
    | '(' ')' '=>' block_statement
    |  identifier '=>' lambda_body_expression
    | '(' function_identifier_list ')' '=>' lambda_body_expression
    | '(' ')' '=>' lambda_body_expression
    | 'function' '(' function_identifier_list ')' block_statement
    | 'function' '(' ')' block_statement
    ;

lambda_body_expression
    : ternary_expression
    | lambda_expression
    ;

table_expression
    : '{' '}'
    | '{' table_list '}'
    ;

table_list
    : expression
    | table_key '=' expression
    | table_key ':' expression
    | table_list ',' expression
    | table_list ',' table_key '=' expression
    | table_list ',' table_key ':' expression
    ;

table_key
    : string
    | identifier
    | integer
    | '-' integer
    ;

function_call
    : primary_expression '(' ')'
    | primary_expression '(' function_argument_list ')'
    | primary_expression variadic_compositor_list '(' function_variadic_list ')'
    ;

function_argument_list
    : expression
    | function_argument_list ',' expression
    ;

function_variadic_list
    : expression
    | function_variadic_list ',' expression
    ;

variadic_compositor_list
    : '[' filter_iterator ']'
    | variadic_compositor_list '[' filter_iterator ']'
    ;

filter_iterator
    : identifier 'in' expression ':' expression
    | identifier ',' identifier 'in' expression ':' expression
    | identifier 'in' expression
    | identifier ',' identifier 'in' expression
    ;

statement
    : block_statement
    | assignment_statement
    | local_assignment_statement
    | local_statement
    | if_else_statement
    | for_statement
    | while_statement
    | dowhile_statement
    | continue_statement
    | break_statement
    | modifier_statement
    | throw_statement
    | trycatch_statement
    | with_statement
    | function_call_statement
    | return_statement
    | ';'
    ;

block_statement
    : '{' '}'
    | '{' statement_list '}'
    ;

statement_list
    : statement
    | statement_list statement
    ;

assignment_statement
    : identifier assignment_operator expression ';'
    | identifier assignment_compositor_list assignment_operator expression ';'
    ;

assignment_operator
    : '='
    | '<-'
    | '+='
    | '-='
    | '/='
    | '*='
    | '%='
    ;

assignment_compositor_list
    : assignment_compositor
    | assignment_compositor_list assignment_compositor
    ;

assignment_compositor
    : '[' filter_iterator ']'
    | '[' expression ']'
    | '.' identifier
    ;

local_assignment_statement
    : 'local' identifier local_assignment_operator expression ';'
    | 'local' identifier assignment_compositor_list local_assignment_operator expression ';'
    ;

local_assignment_operator
    : '='
    | '<-'
    ;

local_statement
    : 'local' identifier ';'
    ;

if_else_statement
    : if_condition statement
    | if_condition statement 'else' statement
    ;

if_condition
    : 'if' '(' expression ')'
    ;

for_statement
    : 'for' for_compositor_list statement
    ;

for_compositor_list
    : '[' filter_iterator ']'
    | for_compositor_list '[' filter_iterator ']'
    ;

while_statement
    : 'while' '(' expression ')' statement
    ;

dowhile_statement
    : 'do' statement 'while' '(' expression ')' ';'
    ;

continue_statement
    : 'continue' ';'
    ;

break_statement
    : 'break' ';'
    ;

modifier_statement
    : modifier expression ';'
    ;

modifier
    : 'minimize'
    | 'maximize'
    | 'constraint'
    ;

throw_statement
    : 'throw' expression ';'
    | 'throw' ';'
    ;

trycatch_statement
    : 'try' statement 'catch' '(' identifier ')' statement
    ;

with_statement
    : 'with' '(' with_resource ')' statement
    ;

with_resource
    : identifier
    | identifier '=' expression

function_call_statement
    : function_call ';'
    ;

return_statement
    : 'return' ';'
    | 'return' expression ';'
    ;

function_list
    : function
    | function_list function
    ;

function
    : 'function' identifier '(' function_identifier_list ')' block_statement
    | 'function' identifier '(' ')' block_statement
    ;

function_identifier_list
    : identifier
    | function_identifier_list ',' identifier
    ;

pragma_list
    : pragma_statement
    | pragma_list pragma_statement
    ;

pragma_statement
    : 'pragma' identifier ';'
    | 'pragma' identifier identifier ';'
    | 'pragma' identifier integer ';'
    | 'pragma' identifier double ';'
    ;

use_list
    : use_statement
    | use_list use_statement
    ;

use_statement
    : 'use' identifier ';'
    ;

header_section
    : pragma_list
    | pragma_list use_list
    | use_list
    ;

program
    : <EOF>
    | function_list <EOF>
    | header_section <EOF>
    | header_section function_list <EOF>
    ;