diff options
Diffstat (limited to 'yacc')
-rw-r--r-- | yacc/defs.h | 20 | ||||
-rw-r--r-- | yacc/error.c | 56 | ||||
-rw-r--r-- | yacc/main.c | 1 | ||||
-rw-r--r-- | yacc/reader.c | 70 |
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(); |