55 lines
1.3 KiB
C
55 lines
1.3 KiB
C
#include <stdbool.h>
|
|
|
|
enum pattern_form {
|
|
pattern_var,
|
|
pattern_int_lit,
|
|
pattern_bool_lit,
|
|
pattern_string_lit,
|
|
pattern_list_lit,
|
|
pattern_tuple_lit,
|
|
pattern_constructor,
|
|
};
|
|
|
|
struct pattern;
|
|
|
|
struct pattern_list {
|
|
struct pattern *elem;
|
|
struct pattern_list *next;
|
|
};
|
|
|
|
struct pattern_list_builder {
|
|
struct pattern_list *head;
|
|
struct pattern_list *last;
|
|
};
|
|
|
|
void pattern_list_append(struct pattern_list_builder *b, struct pattern *p);
|
|
void free_pattern_list(struct pattern_list *l);
|
|
|
|
struct constructor_pattern {
|
|
char *name;
|
|
struct pattern_list *args;
|
|
};
|
|
|
|
struct pattern {
|
|
enum pattern_form form;
|
|
union {
|
|
/* Useful for vars, ints and strings */
|
|
char *lexeme;
|
|
bool b;
|
|
struct pattern_list *list;
|
|
struct pattern_list *tuple;
|
|
struct constructor_pattern ctor;
|
|
};
|
|
};
|
|
|
|
struct pattern *make_var_pattern(char *name);
|
|
struct pattern *make_int_pattern(char *lexeme);
|
|
struct pattern *make_bool_pattern(bool b);
|
|
struct pattern *make_string_pattern(char *lexeme);
|
|
struct pattern *make_list_pattern(struct pattern_list *l);
|
|
struct pattern *make_tuple_pattern(struct pattern_list *l);
|
|
struct pattern *make_constructor_pattern(char *name, struct pattern_list *args);
|
|
|
|
void free_pattern(struct pattern *p);
|
|
|