cvsuser 03/10/13 00:54:46
Modified: languages/imcc ChangeLog debug.c debug.h imcc.l imcc.y
main.c
Log:
proper error reporting in macros; allow macro def at file level
Revision Changes Path
1.37 +4 -0 parrot/languages/imcc/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/ChangeLog,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -w -r1.36 -r1.37
--- ChangeLog 29 Sep 2003 15:01:09 -0000 1.36
+++ ChangeLog 13 Oct 2003 07:54:46 -0000 1.37
@@ -1,3 +1,7 @@
+- 2003-10-13 leo
+ * report error location inside macros too
+ * allow macro defintions outsied of subs
+
- 2003-09-29 leo
* new .nci_call directive
1.26 +1 -2 parrot/languages/imcc/debug.c
Index: debug.c
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/debug.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -w -r1.25 -r1.26
--- debug.c 1 Oct 2003 10:49:39 -0000 1.25
+++ debug.c 13 Oct 2003 07:54:46 -0000 1.26
@@ -27,8 +27,7 @@
fprintf(stderr, "error:imcc:");
imcc_vfprintf(stderr, fmt, ap);
va_end(ap);
- fprintf(stderr, "\nin file '%s' line %d\n", file, lin);
- print_inc();
+ print_inc(file, lin);
/* TODO through compiler exception */
exit(code);
}
1.12 +1 -1 parrot/languages/imcc/debug.h
Index: debug.h
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/debug.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -w -r1.11 -r1.12
--- debug.h 4 Sep 2003 13:53:12 -0000 1.11
+++ debug.h 13 Oct 2003 07:54:46 -0000 1.12
@@ -15,7 +15,7 @@
void fatal(int code, const char *func, const char *fmt, ...);
void fataly(int code, const char *func, int line, const char *fmt, ...);
-void print_inc(void);
+void print_inc(const char *file, int lin);
void warning(Parrot_Interp interpreter, const char *func, const char *fmt, ...);
void debug(Parrot_Interp interpreter, int level, const char *fmt, ...);
void info(Parrot_Interp interpreter, int level, const char *fmt, ...);
1.65 +11 -1 parrot/languages/imcc/imcc.l
Index: imcc.l
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.l,v
retrieving revision 1.64
retrieving revision 1.65
diff -u -w -r1.64 -r1.65
--- imcc.l 5 Oct 2003 10:26:42 -0000 1.64
+++ imcc.l 13 Oct 2003 07:54:46 -0000 1.65
@@ -45,6 +45,7 @@
char *file;
int line;
int pasm_file; /* pasm_file mode of previous frame */
+ int is_macro;
};
struct macro_frame_t *frames = NULL;
@@ -668,6 +669,11 @@
m = find_macro(name);
frame->params = &m->params;
if (m) {
+ /* remember macro name for error reporting
+ * properly
+ */
+ sourcefile = name;
+ frame->is_macro = 1;
/* whitespace can be savely ignored */
do {
c = input();
@@ -784,10 +790,14 @@
}
void
-print_inc(void)
+print_inc(const char *file, int lin)
{
struct macro_frame_t *f;
+ if (frames->is_macro)
+ fprintf(stderr, "\nin macro '.%s' line %d\n", file, lin);
+ else
+ fprintf(stderr, "\nin file '%s' line %d\n", file, lin);
for (f = frames; f; f = f->next) {
if (f->file && strcmp(f->file, sourcefile))
f->next ?
1.95 +1 -0 parrot/languages/imcc/imcc.y
Index: imcc.y
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.y,v
retrieving revision 1.94
retrieving revision 1.95
diff -u -w -r1.94 -r1.95
--- imcc.y 30 Sep 2003 16:03:51 -0000 1.94
+++ imcc.y 13 Oct 2003 07:54:46 -0000 1.95
@@ -246,6 +246,7 @@
compilation_unit: sub
| pcc_sub
| emit
+ | MACRO '\n' { $$ = 0; }
| '\n' { $$ = 0; }
;
1.54 +2 -1 parrot/languages/imcc/main.c
Index: main.c
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/main.c,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -w -r1.53 -r1.54
--- main.c 12 Oct 2003 10:53:32 -0000 1.53
+++ main.c 13 Oct 2003 07:54:46 -0000 1.54
@@ -316,7 +316,8 @@
case ENDNAMESPACE: printf(".endnamespace"); break;
case CONST: printf(".const "); break;
case PARAM: printf(".param "); break;
- case MACRO: break;
+ case MACRO: yylex(&val, interpreter);
+ break; /* swallow nl */
case END: printf("end");break;
case GOTO: printf("goto ");break;