- 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
- fatal("unmatched right brace ('}')");
- break;
-
- case '\'':
- case '"':
- match = c;
- putc(c, fguard);
- c = getc(finput);
-
- while (c != match)
- {
- if (c == EOF || c == '\n')
- fatal("unterminated string");
-
- putc(c, fguard);
-
- if (c == '\\')
- {
- c = getc(finput);
- if (c == EOF)
- fatal("unterminated string");
- putc(c, fguard);
- if (c == '\n')
- lineno++;
- }
-
- c = getc(finput);
- }
-
- putc(c, fguard);
- break;
-
- case '/':
- putc(c, fguard);
- c = getc(finput);
- if (c != '*' && c != '/')
- continue;
-
- cplus_comment = (c == '/');
- putc(c, fguard);
- c = getc(finput);
-
- ended = 0;
- while (!ended)
- {
- if (!cplus_comment && c == '*')
- {
- while (c == '*')
- {
- putc(c, fguard);
- c = getc(finput);
- }
-
- if (c == '/')
- {
- putc(c, fguard);
- ended = 1;
- }
- }
- else if (c == '\n')
- {
- lineno++;
- putc(c, fguard);
- if (cplus_comment)
- ended = 1;
- else
- c = getc(finput);
- }
- else if (c == EOF)
- fatal("unterminated comment");
- else
- {
- putc(c, fguard);
- c = getc(finput);
- }
- }
-
- break;
-
- case '$':
- c = getc(finput);
- type_name = NULL;
-
- if (c == '<')
- {
- register char *cp = token_buffer;
-
- while ((c = getc(finput)) != '>' && c > 0)
- *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) /* JF */
- fprintf(stderr,"%s:%d: warning: $$ of '%s' has no declared type.\n",infile,lineno,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) /* JF */
- fprintf(stderr,"%s:%d: warning: $%d of '%s' has no declared type.\n",infile,lineno,n,rule->sym->tag);
- continue;
- }
- else
- fatals("$%c is invalid",c); /* JF changed style */
-
- break;
-
- case '@':
- c = getc(finput);
- if (isdigit(c) || c == '-')
- {
- ungetc (c, finput);
- n = read_signed_integer(finput);
- c = getc(finput);
- }
- else
- fatals("@%c is invalid",c); /* JF changed style */
-
- fprintf(fguard, "yylsp[%d]", n - stack_offset);
- yylsp_needed = 1;
-
- continue;
-
- case EOF:
- fatal("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);
- if (c == '{')
- copy_action(rule, stack_offset);
- }
- else
- ungetc(c, finput);
-}
-
-
-
-/* Assuming that a { has just been seen, copy everything up to the matching }
-into the actions file.
-stack_offset is the number of values in the current rule so far,
-which says where to find $0 with respect to the top of the stack. */
-
-void
-copy_action(rule, stack_offset)
-symbol_list *rule;
-int stack_offset;
-{
- register int c;
- register int n;
- register int count;
- register int match;
- register int ended;
- register char *type_name;
- int cplus_comment;
-
- /* offset is always 0 if parser has already popped the stack pointer */
- if (semantic_parser) stack_offset = 0;
-
- fprintf(faction, "\ncase %d:\n", nrules);
- if (!nolinesflag)
- fprintf(faction, "#line %d \"%s\"\n", lineno, infile);
- putc('{', faction);