Index: compilers/imcc/imcc.l
===================================================================
--- compilers/imcc/imcc.l	(revision 11798)
+++ compilers/imcc/imcc.l	(working copy)
@@ -678,6 +678,33 @@
         return c;
 }
 
+static char*
+read_braced (YYSTYPE *valp, void *interp, const char *macro_name,
+    char *current)
+{
+    int c;
+    YYSTYPE val;
+    int len = strlen(current);
+    c = yylex(&val, interp);
+    int count = 0;
+    while (c != '}' || count > 0) {
+        if (c == '}')      count--;
+        else if (c == '{') count++;
+        if (c <= 0)
+            IMCC_fataly(interp, E_SyntaxError,
+                    "End of file reached while reading arguments in '%s'",
+                    macro_name);
+        len += strlen(val.s);
+        current = realloc(current, len + 1);
+        strcat(current,val.s);
+        free(val.s);
+        c = yylex(&val,interp);
+    }
+    if (valp) *valp = val;
+    else free(val.s);
+    return current;
+}
+
 static int
 read_params (YYSTYPE *valp, void *interp, struct params_t *params,
          const char *macro_name, int need_id)
@@ -714,6 +741,10 @@
                     "Parameter definition in '%s' must be IDENTIFIER",
                     macro_name);
         }
+        else if (c == '{') {
+            current = read_braced (&val, interp, macro_name, current);
+            c = yylex_skip(&val, interp, " \n");
+        }
         else {
             if (!need_id || c != ' ') {
                 len += strlen(val.s);
Index: compilers/imcc/imclexer.c
===================================================================
--- compilers/imcc/imclexer.c	(revision 11798)
+++ compilers/imcc/imclexer.c	(working copy)
@@ -2,7 +2,7 @@
 /* A lexical scanner generated by flex */
 
 /* Scanner skeleton version:
- * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $
+ * $Header: /cvs/root/flex/flex/skel.c,v 1.1.1.1 1999/04/23 00:46:30 wsanchez Exp $
  */
 
 #define FLEX_SCANNER
@@ -5211,6 +5211,33 @@
         return c;
 }
 
+static char*
+read_braced (YYSTYPE *valp, void *interp, const char *macro_name,
+    char *current)
+{
+    int c;
+    YYSTYPE val;
+    int len = strlen(current);
+    c = yylex(&val, interp);
+    int count = 0;
+    while (c != '}' || count > 0) {
+        if (c == '}')      count--;
+        else if (c == '{') count++;
+        if (c <= 0)
+            IMCC_fataly(interp, E_SyntaxError,
+                    "End of file reached while reading arguments in '%s'",
+                    macro_name);
+        len += strlen(val.s);
+        current = realloc(current, len + 1);
+        strcat(current,val.s);
+        free(val.s);
+        c = yylex(&val,interp);
+    }
+    if (valp) *valp = val;
+    else free(val.s);
+    return current;
+}
+
 static int
 read_params (YYSTYPE *valp, void *interp, struct params_t *params,
          const char *macro_name, int need_id)
@@ -5247,6 +5274,10 @@
                     "Parameter definition in '%s' must be IDENTIFIER",
                     macro_name);
         }
+        else if (c == '{') {
+            current = read_braced (&val, interp, macro_name, current);
+            c = yylex_skip(&val, interp, " \n");
+        }
         else {
             if (!need_id || c != ' ') {
                 len += strlen(val.s);
