int maxrules;
bucket **plhs;
+int maxmethods;
+
int name_pool_size;
char *name_pool;
pitem[2] = 0;
pitem[3] = 0;
+ nmethods = 0;
nrules = 3;
maxrules = 100;
plhs = (bucket **) MALLOC(maxrules*sizeof(bucket *));
int depth;
int quote;
char *tag;
- register FILE *f = action_file;
+ FILE *f = action_file;
int a_lineno = lineno;
char *a_line = dup_line();
char *a_cptr = a_line + (cptr - line);
+ char buffer [10000];
+ int len = 0;
+ int comment_lines = 0;
+ char *mbody;
+ memset (buffer, 0, 10000);
if (last_was_action)
insert_empty_rule();
last_was_action = 1;
fprintf(f, "case %d:\n", nrules - 2);
- fprintf(f, line_format, lineno, input_file_name);
- putc(' ', f); putc(' ', f);
if (*cptr == '=') ++cptr;
n = 0;
+
for (i = nitems - 1; pitem[i]; --i) ++n;
depth = 0;
tag = get_tag(1);
c = *cptr;
if (c == '$')
- { if (tag && strcmp(tag, "Object"))
- fprintf(f, "((%s)yyVal)", tag);
- else fprintf(f, "yyVal");
+ {
+ if (tag && strcmp(tag, "Object")) {
+ len += sprintf(buffer + len, "((%s)yyVal)", tag);
+ } else {
+ strcat (buffer + len, "yyVal");
+ len += 5;
+ }
++cptr;
FREE(d_line);
goto loop;
i = get_number();
if (i > n) dollar_warning(d_lineno, i);
if (tag && strcmp(tag, "Object"))
- fprintf(f, "((%s)yyVals[%d+yyTop])", tag, i - n);
- else fprintf(f, "yyVals[%d+yyTop]", i - n);
+ len += sprintf(buffer + len, "((%s)yyVals[%d+yyTop])", tag, i - n);
+ else
+ len += sprintf(buffer + len, "yyVals[%d+yyTop]", i - n);
FREE(d_line);
goto loop;
}
++cptr;
i = -get_number() - n;
if (tag && strcmp(tag, "Object"))
- fprintf(f, "((%s)yyVals[%d+yyTop])", tag, i);
- else fprintf(f, "yyVals[%d+yyTop]", tag, i);
+ len += sprintf(buffer + len, "((%s)yyVals[%d+yyTop])", tag, i);
+ else
+ len += sprintf(buffer + len, "yyVals[%d+yyTop]", i);
FREE(d_line);
goto loop;
}
{
if (ntags && plhs[nrules]->tag == 0)
untyped_lhs();
- fprintf(f, "yyVal");
+ strcat (buffer, "yyVal");
+ len += 5;
cptr += 2;
goto loop;
}
tag = pitem[nitems + i - n - 1]->tag;
if (tag == 0)
untyped_rhs(i, pitem[nitems + i - n - 1]->name),
- fprintf(f, "yyVals[%d+yyTop]", i - n);
+ len += sprintf(buffer + len, "yyVals[%d+yyTop]", i - n);
else if (strcmp(tag, "Object"))
- fprintf(f, "((%s)yyVals[%d+yyTop])", tag, i - n);
+ len += sprintf(buffer + len, "((%s)yyVals[%d+yyTop])", tag, i - n);
else
- fprintf(f, "yyVals[%d+yyTop]", i - n);
+ len += sprintf(buffer + len, "yyVals[%d+yyTop]", i - n);
}
else
{
if (i > n)
dollar_warning(lineno, i);
- fprintf(f, "yyVals[%d+yyTop]", i - n);
+
+ len += sprintf(buffer + len,"yyVals[%d+yyTop]", i - n);
}
goto loop;
}
i = get_number();
if (ntags)
unknown_rhs(-i);
- fprintf(f, "yyVals[%d+yyTop]", -i - n);
+ len += sprintf(buffer + len, "yyVals[%d+yyTop]", -i - n);
goto loop;
}
}
{
do
{
- putc(c, f);
+ buffer[len++] = c;
c = *++cptr;
} while (isalnum(c) || c == '_' || c == '$');
goto loop;
}
- putc(c, f);
+ buffer[len++] = c;
++cptr;
switch (c)
{
case ';':
if (depth > 0) goto loop;
- fprintf(f, "\nbreak;\n");
- return;
+ break;
case '{':
++depth;
case '}':
if (--depth > 0) goto loop;
- fprintf(f, "\n break;\n");
- return;
+ break;
case '\'':
case '"':
for (;;)
{
c = *cptr++;
- putc(c, f);
+ buffer[len++] = c;
if (c == quote)
{
FREE(s_line);
if (c == '\\')
{
c = *cptr++;
- putc(c, f);
+ buffer[len++] = c;
if (c == '\n')
{
get_line();
c = *cptr;
if (c == '/')
{
- putc('*', f);
+ buffer[len++] = '*';
while ((c = *++cptr) != '\n')
{
- if (c == '*' && cptr[1] == '/')
- fprintf(f, "* ");
- else
- putc(c, f);
- }
- fprintf(f, "*/\n");
+ if (c == '*' && cptr[1] == '/'){
+ buffer[len++] = '*';
+ buffer[len++] = ' ';
+ } else {
+ buffer[len++] = c;
+ }
+ }
+ buffer[len++] = '*';
+ buffer[len++] = '/';
+ buffer[len++] = '\n';
goto next_line;
}
if (c == '*')
char *c_line = dup_line();
char *c_cptr = c_line + (cptr - line - 1);
- putc('*', f);
+ buffer[len++] = '*';
++cptr;
for (;;)
{
c = *cptr++;
- putc(c, f);
+ buffer[len++] = c;
if (c == '*' && *cptr == '/')
{
- putc('/', f);
+ buffer[len++] = '/';
++cptr;
FREE(c_line);
goto loop;
}
if (c == '\n')
{
+ ++comment_lines;
get_line();
if (line == 0)
unterminated_comment(c_lineno, c_line, c_cptr);
default:
goto loop;
}
+
+ if (comment_lines > 0)
+ comment_lines++;
+
+ if ((lineno - (a_lineno + comment_lines)) > 2)
+ {
+ char mname[20];
+ char line_define[256];
+
+ sprintf(mname, "case_%d()", nrules - 2);
+
+ putc(' ', f); putc(' ', f);
+ fputs(mname, f);
+ fprintf(f, ";");
+ if (nmethods == 0)
+ {
+ maxmethods = 100;
+ methods = NEW2(maxmethods, char *);
+ }
+ else if (nmethods == maxmethods)
+ {
+ maxmethods += 500;
+ methods = REALLOC (methods, maxmethods*sizeof(char *));
+ }
+
+ sprintf(line_define, line_format, a_lineno, input_file_name);
+
+ mbody = NEW2(5+strlen(line_define)+1+strlen(mname)+strlen(buffer)+1, char);
+ strcpy(mbody, "void ");
+ strcat(mbody, mname);
+ strcat(mbody, "\n");
+ strcat(mbody, line_define);
+ strcat(mbody, buffer);
+ methods[nmethods++] = mbody;
+ }
+ else
+ {
+ fprintf(f, line_format, lineno, input_file_name);
+ putc(' ', f); putc(' ', f);
+ fwrite(buffer, 1, len, f);
+ }
+
+ fprintf(f, "\n break;\n");
}