90 lines
2.2 KiB
Text
90 lines
2.2 KiB
Text
oscript {
|
|
%whitespace "[ \t\r\n]*";
|
|
%none error;
|
|
%none integer;
|
|
%left '(' ')';
|
|
%left '+' '-';
|
|
%left '*' '/';
|
|
%left '.' '=';
|
|
%left '==' '>' '<' '>=' '<=' '!=' '!';
|
|
%left ';';
|
|
|
|
script : stmts [tmp] | ;
|
|
|
|
scope:
|
|
'{' stmts '}' [scope]
|
|
| '{' '}' [scope_empty];
|
|
|
|
stmts:
|
|
stmts stmt [stm_list_append]
|
|
| stmt [stm_list_create];
|
|
|
|
stmt:
|
|
stm_var_def_new_type ';' [tmp]
|
|
| stm_var_def_assign ';' [tmp]
|
|
| stm_log ';' [tmp]
|
|
| stm_assign ';' [tmp]
|
|
| stm_while [tmp]
|
|
| stm_return ';' [tmp]
|
|
| stm_break ';' [tmp]
|
|
| stm_if [tmp]
|
|
| stm_def_class [tmp]
|
|
| stm_def_method [tmp]
|
|
| stm_ignore ';' [tmp]
|
|
;
|
|
|
|
stm_def_method: 'method' id '(' id_list ')' scope [stm_def_method];
|
|
stm_def_class: 'class' id scope [stm_def_class];
|
|
|
|
stm_if:
|
|
'if' '(' expr ')' scope [stm_if]
|
|
| 'if' '(' expr ')' scope 'else' scope [stm_if];
|
|
|
|
stm_break: 'break' [stm_break];
|
|
stm_return: 'return' expr [stm_return] | 'return' [stm_return];
|
|
stm_while: 'while' '(' expr ')' scope [stm_while_loop];
|
|
stm_var_def_new_type: 'var' id ':' id [stm_var_def_new_type];
|
|
stm_var_def_assign: 'var' id '=' expr [stm_var_def_assign];
|
|
stm_log: 'print' expr [stm_log];
|
|
stm_assign : expr '=' expr [stm_assign];
|
|
stm_ignore : expr [stm_ignore];
|
|
|
|
expr_list:
|
|
expr_list ',' expr ',' [expr_list_append]
|
|
| expr [expr_list_create]
|
|
| ;
|
|
|
|
id_list:
|
|
id_list ',' id ',' [id_list_append]
|
|
| id [id_list_create]
|
|
| ;
|
|
|
|
expr:
|
|
id '(' expr_list ')' [expr_function]
|
|
| expr '.' id '(' expr_list ')' [expr_method]
|
|
| expr '.' id [expr_child]
|
|
| expr '==' expr [expr_bool_eq]
|
|
| '!' expr [expr_bool_negate]
|
|
| expr '!=' expr [expr_bool_neq]
|
|
| expr '>' expr [expr_bool_grater]
|
|
| expr '<' expr [expr_bool_lesser]
|
|
| expr '>=' expr [expr_bool_grater_eq]
|
|
| expr '<=' expr [expr_bool_lesser_eq]
|
|
| expr '+' expr [expr_add]
|
|
| expr '-' expr [expr_subtract]
|
|
| expr '*' expr [expr_multiply]
|
|
| expr '/' expr [expr_divide]
|
|
| '(' expr ')' [expr_compound]
|
|
| boolean [expr_bool]
|
|
| integer [expr_int]
|
|
| real [expr_float]
|
|
| string [expr_string]
|
|
| id [expr_id]
|
|
;
|
|
|
|
id: "[a-z]";
|
|
boolean: "true|false";
|
|
integer: "(\+|\-)?[0-9]+";
|
|
real: "(\+|\-)?[0-9]+(\.[0-9]+)?((e|E)(\+|\-)?[0-9]+)?";
|
|
string: "[\"']:string:";
|
|
}
|