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>
;