aboutsummaryrefslogtreecommitdiff
path: root/src/parser.y
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2025-03-23 22:29:11 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2025-03-23 22:29:11 +0200
commitc87f5a8871edf6880b894a00b180c554ffd46d0a (patch)
tree8f4ac966d1ca37884bf55078b8318d0ba198af9e /src/parser.y
parent350f6c40fa18c35bde9489225175c82de44ba709 (diff)
downloadfwd-c87f5a8871edf6880b894a00b180c554ffd46d0a.tar.gz
fwd-c87f5a8871edf6880b894a00b180c554ffd46d0a.zip
start sketching out type system
Diffstat (limited to 'src/parser.y')
-rw-r--r--src/parser.y88
1 files changed, 85 insertions, 3 deletions
diff --git a/src/parser.y b/src/parser.y
index 68725a8..7b2c651 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -74,7 +74,10 @@
%token ELSE "else"
%token NIL "nil"
%token OWN "own"
+%token PUB "pub"
%token MUT "mut"
+%token CONTINUE "continue"
+%token IMPORT "import"
%token ERROR "error"
%token DOT "."
%token SCOPE "::"
@@ -97,11 +100,16 @@
%left "." "=>" "(" ")"
%left "::"
-%nterm <node> top unit proc call closure var expr statement body
+%nterm <node> top unit proc proc_decl call closure var expr statement body
%nterm <node> vars exprs statements closures err trailing_closure
%nterm <node> opt_vars opt_exprs opt_statements opt_trailing_closure opt_err opt_error
%nterm <node> rev_vars rev_exprs rev_closures rev_statements
-%nterm <node> let if nil own unop binop construct
+%nterm <node> let if nil own unop binop construct import
+
+%nterm <node> struct struct_cont trait
+%nterm <node> type_param type_params opt_type_params
+%nterm <node> behaviour behaviours opt_behaviours
+%nterm <node> member members opt_members
%nterm <type> type rev_types types opt_types
@@ -203,7 +211,9 @@ proc
: ID "(" opt_vars ")" body {
$$ = gen_proc($[ID], $[opt_vars], NULL, $[body], src_loc(@$));
}
- | ID "(" opt_vars ")" ";" {
+
+proc_decl
+ : ID "(" opt_vars ")" ";" {
$$ = gen_proc($[ID], $[opt_vars], NULL, NULL, src_loc(@$));
}
@@ -413,8 +423,80 @@ body
$$ = gen_block($2, $3, src_loc(@$));
}
+behaviour
+ : APPLY ";" { $$ = gen_trait_apply($1, src_loc(@$)); }
+ | proc_decl ";"
+ | proc
+
+behaviours
+ : behaviours behaviour { $$ = $1; $1->n = $2; }
+ | behaviour
+
+opt_behaviours
+ : behaviours
+ | { $$ = NULL; }
+
+member
+ : var ";"
+ | behaviour
+
+members
+ : members member { $$ = $1; $1->n = $2; }
+ | member
+
+opt_members
+ : members
+ | { $$ = NULL; }
+
+type_param
+ : ID ID {
+ struct type *t = tgen_id($1, src_loc(@1));
+ $$ = gen_var($2, t, src_loc(@$));
+ }
+
+type_params
+ : type_param "," type_params {
+ $$ = $1; $1->n = $3;
+ }
+ | type_param
+
+opt_type_params
+ : type_params
+ | { $$ = NULL; }
+
+struct
+ : ID "[" opt_type_params "]" "{" opt_members "}" {
+ $$ = gen_struct($1, $3, $6, src_loc(@$));
+ }
+
+struct_cont
+ : "continue" ID "[" opt_type_params "]" "{" opt_behaviours "}" {
+ $$ = gen_struct_cont($2, $4, $7, src_loc(@$));
+ }
+
+trait
+ : ID "{" opt_behaviours "}" {
+ $$ = gen_trait($1, $3, src_loc(@$));
+ }
+
+import
+ : "import" STRING {
+ $$ = gen_import($2, src_loc(@$));
+ }
+
top
: proc
+ | proc_decl
+ | struct
+ | struct_cont
+ | import
+ | trait
+ | "pub" proc { $$ = $2; ast_set_flags($$, AST_FLAG_PUBLIC); }
+ | "pub" proc_decl { $$ = $2; ast_set_flags($$, AST_FLAG_PUBLIC); }
+ | "pub" struct { $$ = $2; ast_set_flags($$, AST_FLAG_PUBLIC); }
+ | "pub" struct_cont { $$ = $2; ast_set_flags($$, AST_FLAG_PUBLIC); }
+ | "pub" import { $$ = $2; ast_set_flags($$, AST_FLAG_PUBLIC); }
+ | "pub" trait { $$ = $2; ast_set_flags($$, AST_FLAG_PUBLIC); }
| error {
$$ = gen_empty(src_loc(@$));
parser->failed = true;