summaryrefslogtreecommitdiff
path: root/yacc
diff options
context:
space:
mode:
Diffstat (limited to 'yacc')
-rw-r--r--yacc/defs.h20
-rw-r--r--yacc/error.c56
-rw-r--r--yacc/main.c1
-rw-r--r--yacc/reader.c70
4 files changed, 93 insertions, 54 deletions
diff --git a/yacc/defs.h b/yacc/defs.h
index a65e543232..6c368fbd6d 100644
--- a/yacc/defs.h
+++ b/yacc/defs.h
@@ -22,10 +22,6 @@
#include <stdlib.h>
#include "../config/s.h"
-#if macintosh
-#include "../byterun/rotatecursor.h"
-#endif
-
/* machine-dependent definitions */
/* the following definitions are for the Tahoe */
/* they might have to be changed for other machines */
@@ -120,19 +116,6 @@
/* storage allocation macros */
-#if macintosh
-
-#define INTERACT() ROTATECURSOR_MAGIC ()
-
-#define CALLOC(k,n) (INTERACT (), calloc((unsigned)(k),(unsigned)(n)))
-#define FREE(x) (INTERACT (), free((char*)(x)))
-#define MALLOC(n) (INTERACT (), malloc((unsigned)(n)))
-#define NEW(t) (INTERACT (), (t*)allocate(sizeof(t)))
-#define NEW2(n,t) (INTERACT (), (t*)allocate((unsigned)((n)*sizeof(t))))
-#define REALLOC(p,n) (INTERACT (), realloc((char*)(p),(unsigned)(n)))
-
-#else
-
#define CALLOC(k,n) (calloc((unsigned)(k),(unsigned)(n)))
#define FREE(x) (free((char*)(x)))
#define MALLOC(n) (malloc((unsigned)(n)))
@@ -140,8 +123,6 @@
#define NEW2(n,t) ((t*)allocate((unsigned)((n)*sizeof(t))))
#define REALLOC(p,n) (realloc((char*)(p),(unsigned)(n)))
-#endif /* macintosh */
-
/* the structure of a symbol table entry */
@@ -234,6 +215,7 @@ extern char *myname;
extern char *cptr;
extern char *line;
extern int lineno;
+extern char *virtual_input_file_name;
extern int outline;
extern char *action_file_name;
diff --git a/yacc/error.c b/yacc/error.c
index 81218b026d..6e01a34388 100644
--- a/yacc/error.c
+++ b/yacc/error.c
@@ -42,7 +42,7 @@ void open_error(char *filename)
void unexpected_EOF(void)
{
fprintf(stderr, "%s: e - line %d of \"%s\", unexpected end-of-file\n",
- myname, lineno, input_file_name);
+ myname, lineno, virtual_input_file_name);
done(1);
}
@@ -54,7 +54,7 @@ void print_pos(char *st_line, char *st_cptr)
if (st_line == 0) return;
for (s = st_line; *s != '\n'; ++s)
{
- if (isprint(*s) || *s == '\t')
+ if (isprint((unsigned char) *s) || *s == '\t')
putc(*s, stderr);
else
putc('?', stderr);
@@ -75,7 +75,7 @@ void print_pos(char *st_line, char *st_cptr)
void syntax_error(int st_lineno, char *st_line, char *st_cptr)
{
fprintf(stderr, "%s: e - line %d of \"%s\", syntax error\n",
- myname, st_lineno, input_file_name);
+ myname, st_lineno, virtual_input_file_name);
print_pos(st_line, st_cptr);
done(1);
}
@@ -84,7 +84,7 @@ void syntax_error(int st_lineno, char *st_line, char *st_cptr)
void unterminated_comment(int c_lineno, char *c_line, char *c_cptr)
{
fprintf(stderr, "%s: e - line %d of \"%s\", unmatched /*\n",
- myname, c_lineno, input_file_name);
+ myname, c_lineno, virtual_input_file_name);
print_pos(c_line, c_cptr);
done(1);
}
@@ -93,7 +93,7 @@ void unterminated_comment(int c_lineno, char *c_line, char *c_cptr)
void unterminated_string(int s_lineno, char *s_line, char *s_cptr)
{
fprintf(stderr, "%s: e - line %d of \"%s\", unterminated string\n",
- myname, s_lineno, input_file_name);
+ myname, s_lineno, virtual_input_file_name);
print_pos(s_line, s_cptr);
done(1);
}
@@ -102,7 +102,7 @@ void unterminated_string(int s_lineno, char *s_line, char *s_cptr)
void unterminated_text(int t_lineno, char *t_line, char *t_cptr)
{
fprintf(stderr, "%s: e - line %d of \"%s\", unmatched %%{\n",
- myname, t_lineno, input_file_name);
+ myname, t_lineno, virtual_input_file_name);
print_pos(t_line, t_cptr);
done(1);
}
@@ -111,7 +111,7 @@ void unterminated_text(int t_lineno, char *t_line, char *t_cptr)
void unterminated_union(int u_lineno, char *u_line, char *u_cptr)
{
fprintf(stderr, "%s: e - line %d of \"%s\", unterminated %%union \
-declaration\n", myname, u_lineno, input_file_name);
+declaration\n", myname, u_lineno, virtual_input_file_name);
print_pos(u_line, u_cptr);
done(1);
}
@@ -120,7 +120,7 @@ declaration\n", myname, u_lineno, input_file_name);
void over_unionized(char *u_cptr)
{
fprintf(stderr, "%s: e - line %d of \"%s\", too many %%union \
-declarations\n", myname, lineno, input_file_name);
+declarations\n", myname, lineno, virtual_input_file_name);
print_pos(line, u_cptr);
done(1);
}
@@ -129,7 +129,7 @@ declarations\n", myname, lineno, input_file_name);
void illegal_tag(int t_lineno, char *t_line, char *t_cptr)
{
fprintf(stderr, "%s: e - line %d of \"%s\", illegal tag\n",
- myname, t_lineno, input_file_name);
+ myname, t_lineno, virtual_input_file_name);
print_pos(t_line, t_cptr);
done(1);
}
@@ -138,7 +138,7 @@ void illegal_tag(int t_lineno, char *t_line, char *t_cptr)
void illegal_character(char *c_cptr)
{
fprintf(stderr, "%s: e - line %d of \"%s\", illegal character\n",
- myname, lineno, input_file_name);
+ myname, lineno, virtual_input_file_name);
print_pos(line, c_cptr);
done(1);
}
@@ -147,7 +147,7 @@ void illegal_character(char *c_cptr)
void used_reserved(char *s)
{
fprintf(stderr, "%s: e - line %d of \"%s\", illegal use of reserved symbol \
-%s\n", myname, lineno, input_file_name, s);
+%s\n", myname, lineno, virtual_input_file_name, s);
done(1);
}
@@ -155,7 +155,7 @@ void used_reserved(char *s)
void tokenized_start(char *s)
{
fprintf(stderr, "%s: e - line %d of \"%s\", the start symbol %s cannot be \
-declared to be a token\n", myname, lineno, input_file_name, s);
+declared to be a token\n", myname, lineno, virtual_input_file_name, s);
done(1);
}
@@ -163,35 +163,35 @@ declared to be a token\n", myname, lineno, input_file_name, s);
void retyped_warning(char *s)
{
fprintf(stderr, "%s: w - line %d of \"%s\", the type of %s has been \
-redeclared\n", myname, lineno, input_file_name, s);
+redeclared\n", myname, lineno, virtual_input_file_name, s);
}
void reprec_warning(char *s)
{
fprintf(stderr, "%s: w - line %d of \"%s\", the precedence of %s has been \
-redeclared\n", myname, lineno, input_file_name, s);
+redeclared\n", myname, lineno, virtual_input_file_name, s);
}
void revalued_warning(char *s)
{
fprintf(stderr, "%s: w - line %d of \"%s\", the value of %s has been \
-redeclared\n", myname, lineno, input_file_name, s);
+redeclared\n", myname, lineno, virtual_input_file_name, s);
}
void terminal_start(char *s)
{
fprintf(stderr, "%s: e - line %d of \"%s\", the entry point %s is a \
-token\n", myname, lineno, input_file_name, s);
+token\n", myname, lineno, virtual_input_file_name, s);
done(1);
}
void too_many_entries(void)
{
fprintf(stderr, "%s: e - line %d of \"%s\", more than 256 entry points\n",
- myname, lineno, input_file_name);
+ myname, lineno, virtual_input_file_name);
done(1);
}
@@ -199,7 +199,7 @@ void too_many_entries(void)
void no_grammar(void)
{
fprintf(stderr, "%s: e - line %d of \"%s\", no grammar has been \
-specified\n", myname, lineno, input_file_name);
+specified\n", myname, lineno, virtual_input_file_name);
done(1);
}
@@ -207,7 +207,7 @@ specified\n", myname, lineno, input_file_name);
void terminal_lhs(int s_lineno)
{
fprintf(stderr, "%s: e - line %d of \"%s\", a token appears on the lhs \
-of a production\n", myname, s_lineno, input_file_name);
+of a production\n", myname, s_lineno, virtual_input_file_name);
done(1);
}
@@ -215,14 +215,14 @@ of a production\n", myname, s_lineno, input_file_name);
void prec_redeclared(void)
{
fprintf(stderr, "%s: w - line %d of \"%s\", conflicting %%prec \
-specifiers\n", myname, lineno, input_file_name);
+specifiers\n", myname, lineno, virtual_input_file_name);
}
void unterminated_action(int a_lineno, char *a_line, char *a_cptr)
{
fprintf(stderr, "%s: e - line %d of \"%s\", unterminated action\n",
- myname, a_lineno, input_file_name);
+ myname, a_lineno, virtual_input_file_name);
print_pos(a_line, a_cptr);
done(1);
}
@@ -231,14 +231,14 @@ void unterminated_action(int a_lineno, char *a_line, char *a_cptr)
void dollar_warning(int a_lineno, int i)
{
fprintf(stderr, "%s: w - line %d of \"%s\", $%d references beyond the \
-end of the current rule\n", myname, a_lineno, input_file_name, i);
+end of the current rule\n", myname, a_lineno, virtual_input_file_name, i);
}
void dollar_error(int a_lineno, char *a_line, char *a_cptr)
{
fprintf(stderr, "%s: e - line %d of \"%s\", illegal $-name\n",
- myname, a_lineno, input_file_name);
+ myname, a_lineno, virtual_input_file_name);
print_pos(a_line, a_cptr);
done(1);
}
@@ -247,7 +247,7 @@ void dollar_error(int a_lineno, char *a_line, char *a_cptr)
void untyped_lhs(void)
{
fprintf(stderr, "%s: e - line %d of \"%s\", $$ is untyped\n",
- myname, lineno, input_file_name);
+ myname, lineno, virtual_input_file_name);
done(1);
}
@@ -255,7 +255,7 @@ void untyped_lhs(void)
void untyped_rhs(int i, char *s)
{
fprintf(stderr, "%s: e - line %d of \"%s\", $%d (%s) is untyped\n",
- myname, lineno, input_file_name, i, s);
+ myname, lineno, virtual_input_file_name, i, s);
done(1);
}
@@ -263,21 +263,21 @@ void untyped_rhs(int i, char *s)
void unknown_rhs(int i)
{
fprintf(stderr, "%s: e - line %d of \"%s\", $%d is unbound\n",
- myname, lineno, input_file_name, i);
+ myname, lineno, virtual_input_file_name, i);
done(1);
}
void illegal_token_ref(int i, char *name)
{
fprintf(stderr, "%s: e - line %d of \"%s\", $%d refers to terminal `%s', which has no argument\n",
- myname, lineno, input_file_name, i, name);
+ myname, lineno, virtual_input_file_name, i, name);
done(1);
}
void default_action_error(void)
{
fprintf(stderr, "%s: e - line %d of \"%s\", no action specified for this production\n",
- myname, lineno, input_file_name);
+ myname, lineno, virtual_input_file_name);
done(1);
}
diff --git a/yacc/main.c b/yacc/main.c
index 3f2f9ef8e7..978aac0e0c 100644
--- a/yacc/main.c
+++ b/yacc/main.c
@@ -39,6 +39,7 @@ char temp_form[] = "yacc.XXXXXXX";
#endif
int lineno;
+char *virtual_input_file_name = NULL;
int outline;
char *action_file_name;
diff --git a/yacc/reader.c b/yacc/reader.c
index 5ab9997d63..07d1287e0b 100644
--- a/yacc/reader.c
+++ b/yacc/reader.c
@@ -155,6 +155,51 @@ void skip_comment(void)
}
}
+char *substring (char *str, int start, int len)
+{
+ int i;
+ char *buf = MALLOC (len+1);
+ if (buf == NULL) return NULL;
+ for (i = 0; i < len; i++){
+ buf[i] = str[start+i];
+ }
+ return buf;
+}
+
+void parse_line_directive (void)
+{
+ int i = 0, j = 0;
+ int line_number = 0;
+ char *file_name = NULL;
+
+ again:
+ if (line == 0) return;
+ if (line[i] != '#') return;
+ ++ i;
+ while (line[i] == ' ' || line[i] == '\t') ++ i;
+ if (line[i] < '0' || line[i] > '9') return;
+ while (line[i] >= '0' && line[i] <= '9'){
+ line_number = line_number * 10 + line[i] - '0';
+ ++ i;
+ }
+ while (line[i] == ' ' || line[i] == '\t') ++ i;
+ if (line[i] == '"'){
+ ++ i;
+ j = i;
+ while (line[j] != '"' && line[j] != '\0') ++j;
+ if (line[j] == '"'){
+ file_name = substring (line, i, j - i);
+ if (file_name == NULL) no_space ();
+ }
+ }
+ lineno = line_number - 1;
+ if (file_name != NULL){
+ if (virtual_input_file_name != NULL) FREE (virtual_input_file_name);
+ virtual_input_file_name = file_name;
+ }
+ get_line ();
+ goto again;
+}
int
nextc(void)
@@ -164,6 +209,7 @@ nextc(void)
if (line == 0)
{
get_line();
+ parse_line_directive ();
if (line == 0)
return (EOF);
}
@@ -175,6 +221,7 @@ nextc(void)
{
case '\n':
get_line();
+ parse_line_directive ();
if (line == 0) return (EOF);
s = cptr;
break;
@@ -204,6 +251,7 @@ nextc(void)
else if (s[1] == '/')
{
get_line();
+ parse_line_directive ();
if (line == 0) return (EOF);
s = cptr;
break;
@@ -380,8 +428,11 @@ loop:
fwrite(cptr, 1, 2, f);
cptr += 2;
} else
- if (cptr[0] == '\\' && isdigit(cptr[1]) && isdigit(cptr[2]) &&
- isdigit(cptr[3]) && cptr[4] == '\'') {
+ if (cptr[0] == '\\'
+ && isdigit((unsigned char) cptr[1])
+ && isdigit((unsigned char) cptr[2])
+ && isdigit((unsigned char) cptr[3])
+ && cptr[4] == '\'') {
fwrite(cptr, 1, 5, f);
cptr += 5;
} else
@@ -726,10 +777,10 @@ is_reserved(char *name)
strcmp(name, "$end") == 0)
return (1);
- if (name[0] == '$' && name[1] == '$' && isdigit(name[2]))
+ if (name[0] == '$' && name[1] == '$' && isdigit((unsigned char) name[2]))
{
s = name + 3;
- while (isdigit(*s)) ++s;
+ while (isdigit((unsigned char) *s)) ++s;
if (*s == NUL) return (1);
}
@@ -1245,7 +1296,7 @@ loop:
c = *cptr;
if (c == '$')
{
- if (isdigit(cptr[1]))
+ if (isdigit((unsigned char) cptr[1]))
{
++cptr;
i = get_number();
@@ -1336,8 +1387,11 @@ loop:
fwrite(cptr, 1, 2, f);
cptr += 2;
} else
- if (cptr[0] == '\\' && isdigit(cptr[1]) && isdigit(cptr[2]) &&
- isdigit(cptr[3]) && cptr[4] == '\'') {
+ if (cptr[0] == '\\'
+ && isdigit((unsigned char) cptr[1])
+ && isdigit((unsigned char) cptr[2])
+ && isdigit((unsigned char) cptr[3])
+ && cptr[4] == '\'') {
fwrite(cptr, 1, 5, f);
cptr += 5;
} else
@@ -1823,6 +1877,8 @@ void print_grammar(void)
void reader(void)
{
+ virtual_input_file_name = substring (input_file_name, 0,
+ strlen (input_file_name));
create_symbol_table();
read_declarations();
output_token_type();