- int c;
- int n;
- int count;
- char *type_name;
- int brace_flag = 0;
-
- /* offset is always 0 if parser has already popped the stack pointer */
- if (semantic_parser)
- stack_offset = 0;
-
- fprintf (fguard, "\ncase %d:\n", nrules);
- if (!no_lines_flag)
- fprintf (fguard, "#line %d \"%s\"\n", lineno, infile);
- putc ('{', fguard);
-
- count = 0;
- c = getc (finput);
-
- while (brace_flag ? (count > 0) : (c != ';'))
- {
- switch (c)
- {
- case '\n':
- putc (c, fguard);
- lineno++;
- break;
-
- case '{':
- putc (c, fguard);
- brace_flag = 1;
- count++;
- break;
-
- case '}':
- putc (c, fguard);
- if (count > 0)
- count--;
- else
- {
- complain (_("unmatched %s"), "`}'");
- c = getc (finput); /* skip it */
- }
- break;
-
- case '\'':
- case '"':
- copy_string (finput, fguard, c);
- break;
-
- case '/':
- putc (c, fguard);
- c = getc (finput);
- if (c != '*' && c != '/')
- continue;
- copy_comment (finput, fguard, c);
- break;
-
- case '$':
- c = getc (finput);
- type_name = NULL;
-
- if (c == '<')
- {
- char *cp = token_buffer;
-
- while ((c = getc (finput)) != '>' && c > 0)
- {
- if (cp == token_buffer + maxtoken)
- cp = grow_token_buffer (cp);
-
- *cp++ = c;
- }
- *cp = 0;
- type_name = token_buffer;
-
- c = getc (finput);
- }
-
- if (c == '$')
- {
- fprintf (fguard, "yyval");
- if (!type_name)
- type_name = rule->sym->type_name;
- if (type_name)
- fprintf (fguard, ".%s", type_name);
- if (!type_name && typed)
- complain (_("$$ of `%s' has no declared type"),
- rule->sym->tag);
- }
- else if (isdigit (c) || c == '-')
- {
- ungetc (c, finput);
- n = read_signed_integer (finput);
- c = getc (finput);
-
- if (!type_name && n > 0)
- type_name = get_type_name (n, rule);
-
- fprintf (fguard, "yyvsp[%d]", n - stack_offset);
- if (type_name)
- fprintf (fguard, ".%s", type_name);
- if (!type_name && typed)
- complain (_("$%d of `%s' has no declared type"),
- n, rule->sym->tag);
- continue;
- }
- else
- complain (_("$%s is invalid"), printable_version (c));
- break;
-
- case '@':
- copy_at (finput, fguard, stack_offset);
- break;
-
- case EOF:
- fatal ("%s", _("unterminated %guard clause"));
-
- default:
- putc (c, fguard);
- }
-
- if (c != '}' || count != 0)
- c = getc (finput);
- }
-
- c = skip_white_space ();
-
- fprintf (fguard, ";\n break;}");
- if (c == '{')
- copy_action (rule, stack_offset);
- else if (c == '=')
- {
- c = getc (finput); /* why not skip_white_space -wjh */
- if (c == '{')
- copy_action (rule, stack_offset);
- }
- else
- ungetc (c, finput);