class_definition: KW_CLASS class_name op_extends { clr_variable(); lastlineno=yylineno; A4GL_clr_extra_warnings(); clr_function_constants (); clr_call_list(); } op_private_define_section { if ($5) { set_uses_constants($5); } $5=set_class_variables($5,$<str>2,$<str>3); set_local_variables(NULL); } class_entries END_CLASS { struct module_entry *c; c=new_module_entry(E_MET_CLASS_DEFINITION); $$=c; c->module_entry_u.class_definition.expression_list.list.list_len=0; c->module_entry_u.class_definition.expression_list.list.list_val=0; c->module_entry_u.class_definition.private_variables.variables.variables_len=0; c->module_entry_u.class_definition.private_variables.variables.variables_val=NULL; c->module_entry_u.class_definition.private_variables.sorted_list=0; merge_variable_list(&$<module_entry>$->module_entry_u.class_definition.private_variables, $5); sort_variables_v(&$<module_entry>$->module_entry_u.class_definition.private_variables); c->module_entry_u.class_definition.classname=strdup($<str>2); c->module_entry_u.class_definition.parentname=strdup($<str>3); c->module_entry_u.class_definition.class_entries.class_entries_val=$<module_entry_list>7->module_entry_ptr_list.module_entry_ptr_list_val; c->module_entry_u.class_definition.class_entries.class_entries_len=$<module_entry_list>7->module_entry_ptr_list.module_entry_ptr_list_len; set_class_variables(NULL,NULL,NULL); } ; class_name: identifier { strcpy($<str>$,downshift($<str>1)); } | class_name KW_DOT identifier { sprintf($<str>$,"%s.%s",$<str>1,downshift($<str>3)); } ; op_extends: { strcpy($<str>$,""); } | KW_EXTENDS identifier { A4GL_used_object_type(&this_module, downshift($<str>2)); /* Should probably read the parent definition here... */ strcpy($<str>$,$<str>2); } ; op_private_define_section: /* All variables are private for a class atm.... */ /* We may eventually allow public ones - so lets ensure they use the PRIVATE keyword for now */ {$$=NULL;} | KW_PRIVATE define_multiple { $$=$2;} ; class_entries : class_entry { $<module_entry_list>$=new_module_entry_list($1); } | class_entries class_entry { $<module_entry_list>$=append_module_entry_list($1,$2); } ; class_entry: func_def {$$=$<module_entry>1;} | module_code {$$=$<module_entry>1;} | whenever_cmd {$$=$<module_entry>1;} ;