#include 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);