Several rules/productions are missed in your specification. Try this one:
%{
#include <stdio.h>
#include <string.h>
int yydebug = 0;
%}
%token NUMBER ST STR COURSE ASN MT ID
%%
program : program stmt
| stmt
;
stmt : func
| coursedef
| student_info
;
coursedef : COURSE ':' '{' st_list '}' { printf("COURSE-DEF\n"); }
;
st_list : st_list ',' ST
| ST
;
student_info : ST ':' '{' course_list '}' { printf("STUDENT-INFO\n"); }
;
course_def : COURSE ':' '{' ASN ':' NUMBER ',' MT ':' NUMBER '}'
;
course_list : course_list ',' course_def
| course_def
;
func : ID '(' param_list ')' { printf("FUNC-CALL\n"); }
;
param_list : param_list ',' param
| param
;
param : COURSE
| ASN
| STR
| MT
| NUMBER
| func
| course_add
| course_sub
;
course_add : COURSE '+' COURSE { printf("COURSE-ADD\n"); }
;
course_sub : COURSE '-' COURSE { printf("COURSE-SUB\n"); }
;
%%
void yyerror(const char *str) { fprintf(stderr,"error: %s\n",str); }
int yywrap() { return 1; }
int main() { yyparse(); return 0; }