+
+enumcode: ENUM TOKEN '{' enumvals '}' TYPETOKEN ';' {
+ Node *node = node_new (ENUMDEF_NODE,
+ "etype:steal", $<id>6,
+ "prefix:steal", $<id>2,
+ "values:steal", enum_vals,
+ NULL);
+ enum_vals = NULL;
+ nodes = g_list_append (nodes, node);
+ }
+ | ENUM TOKEN '{' enumvals ',' '}' TYPETOKEN ';' {
+ Node *node = node_new (ENUMDEF_NODE,
+ "etype:steal", $<id>7,
+ "prefix:steal", $<id>2,
+ "values:steal", enum_vals,
+ NULL);
+ enum_vals = NULL;
+ nodes = g_list_append (nodes, node);
+ }
+ ;
+
+enumvals: enumvals ',' enumval {;}
+ | enumval {;}
+ ;
+
+enumval: TOKEN '=' numtok {
+ Node *node;
+ char *num = $<id>3;
+
+ /* A float value, that's a bad enum */
+ if (num[0] >= '0' &&
+ num[0] <= '9' &&
+ strchr (num, '.') != NULL) {
+ g_free ($<id>1);
+ g_free (num);
+ yyerror(_("parse error (enumerator value not integer constant)"));
+ YYERROR;
+ }
+
+ node = node_new (ENUMVALUE_NODE,
+ "name:steal", $<id>1,
+ "value:steal", num,
+ NULL);
+ enum_vals = g_list_append (enum_vals, node);
+ }
+ | TOKEN {
+ Node *node;
+
+ node = node_new (ENUMVALUE_NODE,
+ "name:steal", $<id>1,
+ NULL);
+ enum_vals = g_list_append (enum_vals, node);
+ }
+ ;
+
+flagcode: FLAGS TOKEN '{' flagvals '}' TYPETOKEN ';' {
+ Node *node = node_new (FLAGS_NODE,
+ "ftype:steal", $<id>6,
+ "prefix:steal", $<id>2,
+ "values:steal", flag_vals,
+ NULL);
+ flag_vals = NULL;
+ nodes = g_list_append (nodes, node);
+ }
+ | FLAGS TOKEN '{' flagvals ',' '}' TYPETOKEN ';' {
+ Node *node = node_new (FLAGS_NODE,
+ "ftype:steal", $<id>7,
+ "prefix:steal", $<id>2,
+ "values:steal", flag_vals,
+ NULL);
+ flag_vals = NULL;
+ nodes = g_list_append (nodes, node);
+ }
+ ;
+
+flagvals: flagvals ',' TOKEN {
+ flag_vals = g_list_append (flag_vals, $<id>3);
+ }
+ | TOKEN {
+ flag_vals = g_list_append (flag_vals, $<id>1);
+ }
+ ;
+
+errorcode: ERROR TOKEN '{' errorvals '}' TYPETOKEN ';' {
+ Node *node = node_new (ERROR_NODE,
+ "etype:steal", $<id>6,
+ "prefix:steal", $<id>2,
+ "values:steal", error_vals,
+ NULL);
+ error_vals = NULL;
+ nodes = g_list_append (nodes, node);
+ }
+ | ERROR TOKEN '{' errorvals ',' '}' TYPETOKEN ';' {
+ Node *node = node_new (ERROR_NODE,
+ "etype:steal", $<id>7,
+ "prefix:steal", $<id>2,
+ "values:steal", error_vals,
+ NULL);
+ error_vals = NULL;
+ nodes = g_list_append (nodes, node);
+ }
+ ;
+
+errorvals: errorvals ',' TOKEN {
+ error_vals = g_list_append (error_vals, $<id>3);
+ }
+ | TOKEN {
+ error_vals = g_list_append (error_vals, $<id>1);
+ }
+ ;
+
+