diff --git a/Common/Context.cpp b/Common/Context.cpp
index 023b6080a9a00f708db7e3811b5e3bcef147c09f..742f498851c535f74fa58ba0d4ae7dedc41c5acb 100644
--- a/Common/Context.cpp
+++ b/Common/Context.cpp
@@ -1,4 +1,4 @@
-/* $Id: Context.cpp,v 1.13 2000-12-06 18:28:30 remacle Exp $ */
+/* $Id: Context.cpp,v 1.14 2000-12-06 22:09:53 geuzaine Exp $ */
 
 #include "Gmsh.h"
 #include "Const.h"
@@ -37,6 +37,15 @@ extern StringXColor PrintOptions_Color[] ;
 
 // STRING OPTIONS
 
+StringXString * Get_StringOptionCategory(char * cat){
+  if     (!strcmp(cat,"General"))        return GeneralOptions_String ;
+  else if(!strcmp(cat,"Geometry"))       return GeometryOptions_String ;
+  else if(!strcmp(cat,"Mesh"))           return MeshOptions_String ;
+  else if(!strcmp(cat,"PostProcessing")) return PostProcessingOptions_String ;
+  else if(!strcmp(cat,"Print"))          return PrintOptions_String ;
+  else                                   return NULL ;
+}
+
 void Set_DefaultStringOptions(StringXString s[]){
   int i = 0;
   while(s[i].str){
@@ -45,32 +54,36 @@ void Set_DefaultStringOptions(StringXString s[]){
   }
 }
 
-int Set_StringOption(char *str, StringXString s[], char *val){
-  int  i = 0 ;
-
+char ** Get_StringOption(char *str, StringXString s[]){
+  int i = 0;
   while ((s[i].str != NULL) && (strcmp(s[i].str, str))) i++ ;
   if(!s[i].str)
-    return 0;
-  else{
-    *s[i].ptr = val ;
-    return 1;
-  }
+    return NULL;
+  else
+    return s[i].ptr;
 }
 
-void Print_StringOptions(StringXString s[], FILE *file){
+void Print_StringOptions(StringXString s[], char *prefix, FILE *file){
   int i = 0;
-
   while(s[i].str){
-    fprintf(file, "    %s = \"%s\";\n", s[i].str, *s[i].ptr) ;
+    fprintf(file, "%s%s = \"%s\";\n", prefix, s[i].str, *s[i].ptr) ;
     i++;
   }
 }
 
 // NUMBER OPTIONS
 
+StringXNumber * Get_NumberOptionCategory(char * cat){
+  if     (!strcmp(cat,"General"))        return GeneralOptions_Number ;
+  else if(!strcmp(cat,"Geometry"))       return GeometryOptions_Number ;
+  else if(!strcmp(cat,"Mesh"))           return MeshOptions_Number ;
+  else if(!strcmp(cat,"PostProcessing")) return PostProcessingOptions_Number ;
+  else if(!strcmp(cat,"Print"))          return PrintOptions_Number ;
+  else                                   return NULL ;
+}
+
 void Set_DefaultNumberOptions(StringXNumber s[]){
   int i = 0;
-  
   while(s[i].str){
     switch(s[i].type){
     case GMSH_INT: *(int*)s[i].ptr = (int)s[i].def; break;
@@ -82,32 +95,27 @@ void Set_DefaultNumberOptions(StringXNumber s[]){
   }
 }
 
-int Set_NumberOption(char *str, StringXNumber s[], double val){
+void * Get_NumberOption(char *str, StringXNumber s[], int *type){
   int i = 0;
 
   while ((s[i].str != NULL) && (strcmp(s[i].str, str))) i++ ;
   if(!s[i].str)
-    return 0;
+    return NULL;
   else{
-    switch(s[i].type){
-    case GMSH_INT: *(int*)s[i].ptr = (int)val; break;
-    case GMSH_LONG: *(long*)s[i].ptr = (long)val; break;
-    case GMSH_FLOAT: *(float*)s[i].ptr = (float)val; break;
-    case GMSH_DOUBLE: *(double*)s[i].ptr = (double)val; break;
-    }
-    return 1;
+    *type = s[i].type ;
+    return s[i].ptr;
   }
 }
 
-void Print_NumberOptions(StringXNumber s[], FILE *file){
+void Print_NumberOptions(StringXNumber s[], char *prefix, FILE *file){
   int i = 0;
-
   while(s[i].str){
+    fprintf(file, "%s%s = ", prefix, s[i].str);
     switch(s[i].type){
-    case GMSH_INT : fprintf(file, "    %s = %d;\n", s[i].str, *(int*)s[i].ptr); break;
-    case GMSH_LONG : fprintf(file, "    %s = %ld;\n", s[i].str, *(long*)s[i].ptr); break;
-    case GMSH_FLOAT : fprintf(file, "    %s = %g;\n", s[i].str, *(float*)s[i].ptr); break;
-    case GMSH_DOUBLE : fprintf(file, "    %s = %g;\n", s[i].str, *(double*)s[i].ptr); break;
+    case GMSH_INT : fprintf(file, "%d;\n", *(int*)s[i].ptr); break;
+    case GMSH_LONG : fprintf(file, "%ld;\n", *(long*)s[i].ptr); break;
+    case GMSH_FLOAT : fprintf(file, "%g;\n", *(float*)s[i].ptr); break;
+    case GMSH_DOUBLE : fprintf(file, "%g;\n", *(double*)s[i].ptr); break;
     }
     i++;
   }
@@ -116,6 +124,15 @@ void Print_NumberOptions(StringXNumber s[], FILE *file){
 
 // ARRAY OPTIONS
 
+StringXArray * Get_ArrayOptionCategory(char * cat){
+  if     (!strcmp(cat,"General"))        return GeneralOptions_Array ;
+  else if(!strcmp(cat,"Geometry"))       return GeometryOptions_Array ;
+  else if(!strcmp(cat,"Mesh"))           return MeshOptions_Array ;
+  else if(!strcmp(cat,"PostProcessing")) return PostProcessingOptions_Array ;
+  else if(!strcmp(cat,"Print"))          return PrintOptions_Array ;
+  else                                   return NULL ;
+}
+
 void Set_DefaultArrayOptions(StringXArray s[]){
   int i = 0;
   
@@ -150,48 +167,21 @@ void Set_DefaultArrayOptions(StringXArray s[]){
   }
 }
 
-int Set_ArrayOption(char *str, StringXArray s[], double *val){
+void * Get_ArrayOption(char *str, StringXArray s[], int *type){
   int i = 0;
-
   while ((s[i].str != NULL) && (strcmp(s[i].str, str))) i++ ;
   if(!s[i].str)
-    return 0;
+    return NULL;
   else{
-    switch(s[i].type){
-    case GMSH_INT: 
-      ((int*)s[i].ptr)[0] = (int)val[0]; 
-      ((int*)s[i].ptr)[1] = (int)val[1]; 
-      ((int*)s[i].ptr)[2] = (int)val[2]; 
-      ((int*)s[i].ptr)[3] = (int)val[3]; 
-      break;
-    case GMSH_LONG: 
-      ((long*)s[i].ptr)[0] = (long)val[0]; 
-      ((long*)s[i].ptr)[1] = (long)val[1]; 
-      ((long*)s[i].ptr)[2] = (long)val[2]; 
-      ((long*)s[i].ptr)[3] = (long)val[3]; 
-      break;
-    case GMSH_FLOAT: 
-      ((float*)s[i].ptr)[0] = (float)val[0]; 
-      ((float*)s[i].ptr)[1] = (float)val[1]; 
-      ((float*)s[i].ptr)[2] = (float)val[2]; 
-      ((float*)s[i].ptr)[3] = (float)val[3]; 
-      break;
-    case GMSH_DOUBLE: 
-      ((double*)s[i].ptr)[0] = (double)val[0]; 
-      ((double*)s[i].ptr)[1] = (double)val[1]; 
-      ((double*)s[i].ptr)[2] = (double)val[2]; 
-      ((double*)s[i].ptr)[3] = (double)val[3]; 
-      break;
-    }
-    return 1;
+    *type = s[i].type ;
+    return s[i].ptr;
   }
 }
 
-void Print_ArrayOptions(StringXArray s[], FILE *file){
+void Print_ArrayOptions(StringXArray s[], char *prefix, FILE *file){
   int i = 0;
-
   while(s[i].str){
-    fprintf(file, "    %s = {", s[i].str);
+    fprintf(file, "%s%s = {", prefix, s[i].str);
     switch(s[i].type){
     case GMSH_INT : 
       fprintf(file, "%d,%d,%d,%d};\n", 
@@ -221,9 +211,17 @@ void Print_ArrayOptions(StringXArray s[], FILE *file){
 
 // COLORS
 
+StringXColor * Get_ColorOptionCategory(char * cat){
+  if     (!strcmp(cat,"General"))        return GeneralOptions_Color ;
+  else if(!strcmp(cat,"Geometry"))       return GeometryOptions_Color ;
+  else if(!strcmp(cat,"Mesh"))           return MeshOptions_Color ;
+  else if(!strcmp(cat,"PostProcessing")) return PostProcessingOptions_Color ;
+  else if(!strcmp(cat,"Print"))          return PrintOptions_Color ;
+  else                                   return NULL ;
+}
+
 void Set_DefaultColorOptions(StringXColor s[], int num){
   int i = 0;
-
   while(s[i].str){
     switch(num){
     case 0 : *s[i].ptr = s[i].def1; break;
@@ -234,31 +232,25 @@ void Set_DefaultColorOptions(StringXColor s[], int num){
   }
 }
 
-int Set_ColorOption(char *str, StringXColor s[], unsigned int val) {
-  int  i = 0 ;
-
+unsigned int * Get_ColorOption(char *str, StringXColor s[]) {
+  int i = 0;
   while ((s[i].str != NULL) && (strcmp(s[i].str, str))) i++ ;
   if(!s[i].str)
-    return 0;
-  else{
-    *s[i].ptr = val ;
-    return 1;
-  }
+    return NULL;
+  else
+    return s[i].ptr;
 }
 
-void Print_ColorOptions(StringXColor s[], FILE *file){
+void Print_ColorOptions(StringXColor s[], char *prefix, FILE *file){
   int i = 0;
-
-  fprintf(file, "    Color {\n");
   while(s[i].str){
-    fprintf(file, "      %s = {%d,%d,%d};\n", 
-	    s[i].str,
+    fprintf(file, "%sColor.%s = {%d,%d,%d};\n", 
+	    prefix, s[i].str,
 	    UNPACK_RED(*s[i].ptr),
 	    UNPACK_GREEN(*s[i].ptr),
 	    UNPACK_BLUE(*s[i].ptr));
     i++;
   }
-  fprintf(file, "    }\n");
 }
 
 int Get_ColorForString(StringX4Int SX4I[], int alpha, 
@@ -350,43 +342,32 @@ void Init_Context(void){
 
 void Print_Context(FILE *file){
 
-  fprintf(file, "Options{\n");
-
-  fprintf(file, "  General{\n");
-  Print_StringOptions(GeneralOptions_String, file);
-  Print_NumberOptions(GeneralOptions_Number, file);
-  Print_ArrayOptions(GeneralOptions_Array, file);
-  Print_ColorOptions(GeneralOptions_Color, file);
-  fprintf(file, "  }\n");
-
-  fprintf(file, "  Geometry{\n");
-  Print_StringOptions(GeometryOptions_String, file);
-  Print_NumberOptions(GeometryOptions_Number, file);
-  Print_ArrayOptions(GeometryOptions_Array, file);
-  Print_ColorOptions(GeometryOptions_Color, file);
-  fprintf(file, "  }\n");
-
-  fprintf(file, "  Mesh{\n");
-  Print_StringOptions(MeshOptions_String, file);
-  Print_NumberOptions(MeshOptions_Number, file);
-  Print_ArrayOptions(MeshOptions_Array, file);
-  Print_ColorOptions(MeshOptions_Color, file);
-  fprintf(file, "  }\n");
-
-  fprintf(file, "  PostProcessing{\n");
-  Print_StringOptions(PostProcessingOptions_String, file);
-  Print_NumberOptions(PostProcessingOptions_Number, file);
-  Print_ArrayOptions(PostProcessingOptions_Array, file);
-  Print_ColorOptions(PostProcessingOptions_Color, file);
-  fprintf(file, "  }\n");
-
-  fprintf(file, "  Print{\n");
-  Print_StringOptions(PrintOptions_String, file);
-  Print_NumberOptions(PrintOptions_Number, file);
-  Print_ArrayOptions(PrintOptions_Array, file);
-  Print_ColorOptions(PrintOptions_Color, file);
-  fprintf(file, "  }\n");
-
+  fprintf(file, "Options{\n\n");
+  Print_StringOptions(GeneralOptions_String, "  General.", file);
+  Print_NumberOptions(GeneralOptions_Number, "  General.", file);
+  Print_ArrayOptions(GeneralOptions_Array, "  General.", file);
+  Print_ColorOptions(GeneralOptions_Color, "  General.", file);
+  fprintf(file, "  \n");
+  Print_StringOptions(GeometryOptions_String, "  Geometry.", file);
+  Print_NumberOptions(GeometryOptions_Number, "  Geometry.", file);
+  Print_ArrayOptions(GeometryOptions_Array, "  Geometry.", file);
+  Print_ColorOptions(GeometryOptions_Color, "  Geometry.", file);
+  fprintf(file, "  \n");
+  Print_StringOptions(MeshOptions_String, "  Mesh.", file);
+  Print_NumberOptions(MeshOptions_Number, "  Mesh.", file);
+  Print_ArrayOptions(MeshOptions_Array, "  Mesh.", file);
+  Print_ColorOptions(MeshOptions_Color, "  Mesh.", file);
+  fprintf(file, "  \n");
+  Print_StringOptions(PostProcessingOptions_String, "  PostProcessing.", file);
+  Print_NumberOptions(PostProcessingOptions_Number, "  PostProcessing.", file);
+  Print_ArrayOptions(PostProcessingOptions_Array, "  PostProcessing.", file);
+  Print_ColorOptions(PostProcessingOptions_Color, "  PostProcessing.", file);
+  fprintf(file, "  \n");
+  Print_StringOptions(PrintOptions_String, "  Print.", file);
+  Print_NumberOptions(PrintOptions_Number, "  Print.", file);
+  Print_ArrayOptions(PrintOptions_Array, "  Print.", file);
+  Print_ColorOptions(PrintOptions_Color, "  Print.", file);
+  fprintf(file, "  \n");
   fprintf(file, "}\n");
 }
 
diff --git a/Common/Context.h b/Common/Context.h
index 90b35a1e1cfb06f27c23a747e3b064414179ec3e..fab8a22ccc0a58a82a54ee17432f32287f8caca4 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -1,4 +1,4 @@
-/* $Id: Context.h,v 1.15 2000-12-06 18:28:30 remacle Exp $ */
+/* $Id: Context.h,v 1.16 2000-12-06 22:09:53 geuzaine Exp $ */
 #ifndef _CONTEXT_H_
 #define _CONTEXT_H_
 
@@ -180,21 +180,25 @@ typedef struct {
   unsigned int def1, def2, def3 ;
 } StringXColor ;
 
+StringXString * Get_StringOptionCategory(char * cat);
+StringXNumber * Get_NumberOptionCategory(char * cat);
+StringXArray * Get_ArrayOptionCategory(char * cat);
+StringXColor * Get_ColorOptionCategory(char * cat);
 
 void Set_DefaultStringOptions(StringXString s[]);
 void Set_DefaultNumberOptions(StringXNumber s[]);
 void Set_DefaultArrayOptions(StringXArray s[]);
 void Set_DefaultColorOptions(StringXColor s[], int num);
 
-int Set_StringOption(char *str, StringXString s[], char *val);
-int Set_NumberOption(char *str, StringXNumber s[], double val);
-int Set_ArrayOption(char *str, StringXArray s[], double *val);
-int Set_ColorOption(char *str, StringXColor s[], unsigned int val);
+char ** Get_StringOption(char *str, StringXString s[]);
+void * Get_NumberOption(char *str, StringXNumber s[], int *type);
+void * Get_ArrayOption(char *str, StringXArray s[], int *type);
+unsigned int * Get_ColorOption(char *str, StringXColor s[]);
 
-void Print_StringOptions(StringXString s[], FILE *file);
-void Print_NumberOptions(StringXNumber s[], FILE *file);
-void Print_ArrayOptions(StringXArray s[], FILE *file);
-void Print_ColorOptions(StringXArray s[], FILE *file);
+void Print_StringOptions(StringXString s[], char *prefix, FILE *file);
+void Print_NumberOptions(StringXNumber s[], char *prefix, FILE *file);
+void Print_ArrayOptions(StringXArray s[], char *prefix, FILE *file);
+void Print_ColorOptions(StringXArray s[], char *prefix, FILE *file);
 
 void Init_Colors (int num);
 void Init_Context (void);
diff --git a/Parser/Gmsh.l b/Parser/Gmsh.l
index 43f24a5e775dba3d50cf6c80ca33d3856ae5d790..b23a7fe3ee6015555af2bd76b70e8db626ebfe40 100644
--- a/Parser/Gmsh.l
+++ b/Parser/Gmsh.l
@@ -1,4 +1,4 @@
-%{ /* $Id: Gmsh.l,v 1.8 2000-12-06 18:28:30 remacle Exp $ */
+%{ /* $Id: Gmsh.l,v 1.9 2000-12-06 22:09:53 geuzaine Exp $ */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -69,8 +69,22 @@ stepid  {dieze}({digit})*
 "newreg"		{yylval.d = NEWREG(); return tDOUBLE;}
 "newp"  		{yylval.d = NEWPOINT(); return tDOUBLE;}
 "="                     return tAFFECT;
+"+="                    return tAFFECTPLUS ;
+"-="                    return tAFFECTMINUS ;
+"*="                    return tAFFECTTIMES ;
+"/="                    return tAFFECTDIVIDE ;
 "..."                   return tDOTS;
-
+":"                     return tDOTS ;
+"/\\"                   return tCROSSPRODUCT ;
+"||"                    return tOR ;
+"&&"                    return tAND ;
+"++"                    return tPLUSPLUS ;
+"--"                    return tMINUSMINUS ;
+"=="                    return tEQUAL ;
+"!="                    return tNOTEQUAL ;
+"~="                    return tAPPROXEQUAL ;
+"<="                    return tLESSOREQUAL ;
+">="                    return tGREATEROREQUAL ;
 
 ACos                    return tAcos ;
 ArcCos                  return tAcos ;
@@ -80,7 +94,6 @@ Atan                    return tAtan ;
 ArcTan                  return tAtan ;
 Atan2                   return tAtan2 ;
 ArcTan2                 return tAtan2 ;
-Association             return tAssociation;
 Attractor		return tAttractor;
 
 Bump                    return tBump;
@@ -111,9 +124,6 @@ Fabs                    return tFabs ;
 Floor                   return tFloor ;
 Fmod                    return tFmod ;
 
-General                 return tGeneral;
-Geometry                return tGeometry;
-
 Hypot                   return tHypot ;
 
 Include                 return tInclude;
@@ -127,7 +137,6 @@ Log                     return tLog ;
 Log10                   return tLog10 ;
 Layers                  return tLayers;
 
-Mesh                    return tMesh;
 Modulo                  return tModulo ;
 
 Nurbs			return tNurbs;
@@ -143,8 +152,7 @@ Point                   return tPoint;
 Power                   return tProgression;
 Progression             return tProgression;
 Parametric		return tParametric;
-PostProcessing          return tPostProcessing;
-Print                   return tPrint;
+Printf                  return tPrintf ;
 
 Recombine               return tRecombine;
 Rotate                  return tRotate;
@@ -157,6 +165,7 @@ Save                    return tPhysical;
 Spline                  return tSpline;
 Surface                 return tSurface;
 Symmetry                return tSymmetry;
+Script                  return tScript;
 
 Transfinite             return tTransfinite;
 Translate               return tTranslate;
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index ffbc28977ba7699e46dcd37db331da418b9c79a0..a229412caede0c7879f8d8a6ead09f891ad1965b 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -1,4 +1,4 @@
-%{ /* $Id: Gmsh.y,v 1.16 2000-12-06 18:28:30 remacle Exp $ */
+%{ /* $Id: Gmsh.y,v 1.17 2000-12-06 22:09:53 geuzaine Exp $ */
 
 #include <stdarg.h>
 
@@ -40,17 +40,26 @@ static Shape          TheShape;
 static int            i,j,k,flag,RecursionLevel=0,ImbricatedLoop = 0;
 static double         d;
 static ExtrudeParams  extr;
-static StringXColor   *ColorField ;
 static List_T         *ListOfDouble_L,*ListOfDouble2_L;
 static List_T         *ListOfListOfDouble_L;
 
+static void           *pNumOpt, *pArrOpt;
+static char          **pStrOpt;
+static unsigned int   *pColOpt;
+static StringXString  *pStrCat;
+static StringXNumber  *pNumCat;
+static StringXArray   *pArrCat;
+static StringXColor   *pColCat;
+
 void  yyerror (char *s);
 void  vyyerror (char *fmt, ...);
+
 %}
 
 %union {
   char    *c;
   int      i;
+  unsigned int u;
   double   d;
   double   v[5];
   Shape    s;
@@ -63,11 +72,11 @@ void  vyyerror (char *fmt, ...);
 %token tEND tAFFECT tDOTS tPi
 %token tExp tLog tLog10 tSqrt tSin tAsin tCos tAcos tTan
 %token tAtan tAtan2 tSinh tCosh tTanh tFabs tFloor tCeil
-%token tFmod tModulo tHypot
+%token tFmod tModulo tHypot tPrintf
 %token tPoint tCircle tEllipsis tLine tSurface tSpline tVolume
 %token tCharacteristic tLength tParametric tElliptic
 %token tPlane tRuled tTransfinite tComplex tPhysical
-%token tUsing tPower tBump tProgression tAssociation
+%token tUsing tBump tProgression
 %token tRotate tTranslate tSymmetry tDilate tExtrude tDuplicata
 %token tLoop tInclude tRecombine tDelete tCoherence
 %token tView tOffset tAttractor tLayers
@@ -77,7 +86,6 @@ void  vyyerror (char *fmt, ...);
 %token tScalarPoint tVectorPoint tTensorPoint
 %token tBSpline tNurbs tOrder tWith tBounds tKnots
 %token tColor tOptions tFor tEndFor tScript tExit tMerge
-%token tGeneral tGeometry tMesh tPostProcessing tPrint
 
 %token tB_SPLINE_SURFACE_WITH_KNOTS
 %token tB_SPLINE_CURVE_WITH_KNOTS
@@ -93,18 +101,32 @@ void  vyyerror (char *fmt, ...);
 
 %token tSolid tEndSolid tVertex tFacet tNormal tOuter tLoopSTL tEndLoop tEndFacet
 
-%type <d> FExpr  FExpr_Single
-%type <v> VExpr RGBAExpr
+%type <d> FExpr FExpr_Single
+%type <v> VExpr VExpr_Single
 %type <l> ListOfShapes Duplicata Transform MultipleShape
 %type <l> ListOfStrings ListOfDouble ListOfListOfDouble
 %type <s> Shape
 %type <i> BoolExpr
-
-%left '<' '>'
-%left '+' '-'
-%left '*' '/' '%'
-%left UMINUS
-%right '^'
+%type <u> Color
+
+/* ------------------------------------------------------------------ */
+/* Operators (with ascending priority) : cf. C language               */
+/*                                                                    */
+/* Notes: - evaluation order (%left, %right)                          */
+/*        - UNARYPREC is a dummy terminal to resolve ambiguous cases  */ 
+/*          for + and - (which exist in both unary and binary form)   */
+/* ------------------------------------------------------------------ */
+%left    tAFFECT tAFFECTPLUS tAFFECTMINUS tAFFECTTIMES tAFFECTDIVIDE
+%right   '?' tDOTS
+%left    tAND tOR
+%left    tNOTEQUAL tEQUAL tAPPROXEQUAL
+%left    '<' '>' tLESSOREQUAL tGREATEROREQUAL
+%left    '+' '-'
+%left    '*' '/' '%'
+%left    tCROSSPRODUCT
+%left    UNARYPREC '!'
+%right   '^'
+%left    tPLUSPLUS tMINUSMINUS
 
 %start All
 
@@ -341,6 +363,7 @@ GeomFormatList :
 
 GeomFormat :
     View        { return 1; }
+  | Printf      { return 1; }
   | Affectation { return 1; }
   | Shape       { return 1; }
   | Transform   { return 1; }
@@ -354,9 +377,17 @@ GeomFormat :
 /*  | Script      { return 1; }*/
   | Command     { return 1; }
   | tOptions '{' Options '}' { return 1; }
+  | tScript  '{' Scripts '}' { return 1; }
   | error tEND  { yyerrok; return 1;}
 ;
 
+Printf :
+    tPrintf '(' tBIGSTR ',' FExpr ')' tEND
+    {
+      Msg(PARSER_INFO, $3, $5); 
+    }
+;
+
 /* ------------
    V I E W 
    ------------ */
@@ -1429,186 +1460,209 @@ Options :
 ;
 
 Option :
-    tGeneral '{' GeneralOptions '}'
-  | tGeometry '{' GeometryOptions '}'
-  | tMesh '{' MeshOptions '}'
-  | tPostProcessing '{' PostProcessingOptions '}'
-  | tPrint '{' PrintOptions '}'
-;
-
-GeneralOptions :
-  /* empty */
-  | GeneralOptions GeneralOption
-;
-
-GeneralOption :
-    tSTRING tAFFECT tBIGSTR tEND
-    { 
-      if(!Set_StringOption($1, GeneralOptions_String, $3))
-	vyyerror("Unknown General Option (String) '%s'", $1);
-    }
-  | tSTRING tAFFECT FExpr tEND
-    { 
-      if(!Set_NumberOption($1, GeneralOptions_Number, $3))
-	vyyerror("Unknown General Option (Number) '%s'", $1);
-    }
-  | tSTRING tAFFECT VExpr tEND
-    { if(!Set_ArrayOption($1, GeneralOptions_Array, $3)) 
-	vyyerror("Unknown General Option (Array) '%s'", $1);
-    }
-  | tColor 
-    { ColorField = GeneralOptions_Color; }
-    '{' ColorAffects '}'
-;
-
-GeometryOptions :
-  /* empty */
-  | GeometryOptions GeometryOption
-;
-
-GeometryOption :
-    tSTRING tAFFECT tBIGSTR tEND
-    { 
-      if(!Set_StringOption($1, GeometryOptions_String, $3))
-	vyyerror("Unknown Geometry Option (String) '%s'", $1);
+    Printf 
+    {
     }
-  | tSTRING tAFFECT FExpr tEND
+  | tSTRING '.' tSTRING tAFFECT tBIGSTR tEND 
     { 
-      if(!Set_NumberOption($1, GeometryOptions_Number, $3))
-	vyyerror("Unknown Geometry Option (Number) '%s'", $1);
+      if(!(pStrCat = Get_StringOptionCategory($1)))
+	vyyerror("Unknown String Option Class '%s'", $1);
+      else{
+	if(!(pStrOpt = Get_StringOption($3, pStrCat)))
+	  vyyerror("Unknown String Option '%s.%s'", $1, $3);
+	else{
+	  *pStrOpt = $5 ;
+	}
+      }
     }
-  | tSTRING tAFFECT VExpr tEND
+  | tSTRING '.' tSTRING tAFFECT FExpr tEND 
     {
-      if(!Set_ArrayOption($1, GeometryOptions_Array, $3))
-	vyyerror("Unknown Geometry Option (Array) '%s'", $1);
-    }
-  | tColor 
-    { ColorField = GeometryOptions_Color; }
-    '{' ColorAffects '}'
-;
-
-MeshOptions :
-  /* empty */
-  | MeshOptions MeshOption
-;
-
-MeshOption :
-    tSTRING tAFFECT tBIGSTR tEND
-    { 
-      if(!Set_StringOption($1, MeshOptions_String, $3))
-	vyyerror("Unknown Mesh Option (String) '%s'", $1);
+      if(!(pNumCat = Get_NumberOptionCategory($1)))
+	vyyerror("Unknown Numeric Option Class '%s'", $1);
+      else{
+	if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i)))
+	  vyyerror("Unknown Numeric Option '%s.%s'", $1, $3);
+	else{
+	  switch(i){
+	  case GMSH_DOUBLE : *(double*)pNumOpt = $5 ; break ;
+	  case GMSH_FLOAT : *(float*)pNumOpt = (float)$5 ; break ;
+	  case GMSH_LONG : *(long*)pNumOpt = (long)$5 ; break ;
+	  case GMSH_INT : *(int*)pNumOpt = (int)$5 ; break ;
+	  }
+	}
+      }
     }
-  | tSTRING tAFFECT FExpr tEND
+  | tSTRING '.' tSTRING tAFFECTPLUS FExpr tEND 
     {
-      if(!Set_NumberOption($1, MeshOptions_Number, $3))
-	vyyerror("Unknown Mesh Option (Number) '%s'", $1);
+      if(!(pNumCat = Get_NumberOptionCategory($1)))
+	vyyerror("Unknown Numeric Option Class '%s'", $1);
+      else{
+	if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i)))
+	  vyyerror("Unknown Numeric Option '%s.%s'", $1, $3);
+	else{
+	  switch(i){
+	  case GMSH_DOUBLE : *(double*)pNumOpt += $5 ; break ;
+	  case GMSH_FLOAT : *(float*)pNumOpt += (float)$5 ; break ;
+	  case GMSH_LONG : *(long*)pNumOpt += (long)$5 ; break ;
+	  case GMSH_INT : *(int*)pNumOpt += (int)$5 ; break ;
+	  }
+	}
+      }
     }
-  | tSTRING tAFFECT VExpr tEND
+  | tSTRING '.' tSTRING tAFFECTMINUS FExpr tEND 
     {
-      if(!Set_ArrayOption($1, MeshOptions_Array, $3))
-	vyyerror("Unknown Mesh Option (Array) '%s'", $1);
+      if(!(pNumCat = Get_NumberOptionCategory($1)))
+	vyyerror("Unknown Numeric Option Class '%s'", $1);
+      else{
+	if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i)))
+	  vyyerror("Unknown Numeric Option '%s.%s'", $1, $3);
+	else{
+	  switch(i){
+	  case GMSH_DOUBLE : *(double*)pNumOpt -= $5 ; break ;
+	  case GMSH_FLOAT : *(float*)pNumOpt -= (float)$5 ; break ;
+	  case GMSH_LONG : *(long*)pNumOpt -= (long)$5 ; break ;
+	  case GMSH_INT : *(int*)pNumOpt -= (int)$5 ; break ;
+	  }
+	}
+      }
     }
-  | tColor 
-    { ColorField = MeshOptions_Color; }
-    '{' ColorAffects '}'
-;
-
-PostProcessingOptions :
-  /* empty */
-  | PostProcessingOptions PostProcessingOption
-;
-
-PostProcessingOption :
-    tSTRING tAFFECT tBIGSTR tEND
-    { 
-      if(!Set_StringOption($1, PostProcessingOptions_String, $3))
-	vyyerror("Unknown PostProcessing Option (String) '%s'", $1);
+  | tSTRING '.' tSTRING tAFFECTTIMES FExpr tEND 
+    {
+      if(!(pNumCat = Get_NumberOptionCategory($1)))
+	vyyerror("Unknown Numeric Option Class '%s'", $1);
+      else{
+	if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i)))
+	  vyyerror("Unknown Numeric Option '%s.%s'", $1, $3);
+	else{
+	  switch(i){
+	  case GMSH_DOUBLE : *(double*)pNumOpt *= $5 ; break ;
+	  case GMSH_FLOAT : *(float*)pNumOpt *= (float)$5 ; break ;
+	  case GMSH_LONG : *(long*)pNumOpt *= (long)$5 ; break ;
+	  case GMSH_INT : *(int*)pNumOpt *= (int)$5 ; break ;
+	  }
+	}
+      }
     }
-  | tSTRING tAFFECT FExpr tEND
-    { 
-      if(!Set_NumberOption($1, PostProcessingOptions_Number, $3)) 
-	vyyerror("Unknown PostProcessing Option (Number) '%s'", $1);
+  | tSTRING '.' tSTRING tAFFECTDIVIDE FExpr tEND 
+    {
+      if(!(pNumCat = Get_NumberOptionCategory($1)))
+	vyyerror("Unknown Numeric Option Class '%s'", $1);
+      else{
+	if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i)))
+	  vyyerror("Unknown Numeric Option '%s.%s'", $1, $3);
+	else{
+	  switch(i){
+	  case GMSH_DOUBLE : *(double*)pNumOpt /= $5 ; break ;
+	  case GMSH_FLOAT : *(float*)pNumOpt /= (float)$5 ; break ;
+	  case GMSH_LONG : *(long*)pNumOpt /= (long)$5 ; break ;
+	  case GMSH_INT : *(int*)pNumOpt /= (int)$5 ; break ;
+	  }
+	}
+      }
     }
-  | tSTRING tAFFECT VExpr tEND
-    { 
-      if(!Set_ArrayOption($1, PostProcessingOptions_Array, $3))
-	vyyerror("Unknown PostProcessing (Array) Option '%s'", $1);
+  | tSTRING '.' tSTRING tPLUSPLUS tEND 
+    {
+      if(!(pNumCat = Get_NumberOptionCategory($1)))
+	vyyerror("Unknown Numeric Option Class '%s'", $1);
+      else{
+	if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i)))
+	  vyyerror("Unknown Numeric Option '%s.%s'", $1, $3);
+	else{
+	  switch(i){
+	  case GMSH_DOUBLE : *(double*)pNumOpt += 1. ; break ;
+	  case GMSH_FLOAT : *(float*)pNumOpt += 1. ; break ;
+	  case GMSH_LONG : *(long*)pNumOpt += 1 ; break ;
+	  case GMSH_INT : *(int*)pNumOpt += 1 ; break ;
+	  }
+	}
+      }
     }
-  | tColor 
-    { ColorField = PostProcessingOptions_Color; }
-    '{' ColorAffects '}'
-;
-
-PrintOptions :
-  /* empty */
-  | PrintOptions PrintOption
-;
-
-PrintOption :
-    tSTRING tAFFECT tBIGSTR tEND
+  | tSTRING '.' tSTRING tMINUSMINUS tEND 
     {
-      if(!Set_StringOption($1, PrintOptions_String, $3))
-	vyyerror("Unknown Print Option (String) '%s'", $1);
+      if(!(pNumCat = Get_NumberOptionCategory($1)))
+	vyyerror("Unknown Numeric Option Class '%s'", $1);
+      else{
+	if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i)))
+	  vyyerror("Unknown Numeric Option '%s.%s'", $1, $3);
+	else{
+	  switch(i){
+	  case GMSH_DOUBLE : *(double*)pNumOpt -= 1. ; break ;
+	  case GMSH_FLOAT : *(float*)pNumOpt -= 1. ; break ;
+	  case GMSH_LONG : *(long*)pNumOpt -= 1 ; break ;
+	  case GMSH_INT : *(int*)pNumOpt -= 1 ; break ;
+	  }
+	}
+      }
     }
-  | tSTRING tAFFECT FExpr tEND
+  | tSTRING '.' tSTRING tAFFECT VExpr tEND 
     {
-      if(!Set_NumberOption($1, PrintOptions_Number, $3)) 
-	vyyerror("Unknown Print Option (Number) '%s'", $1);
+      if(!(pArrCat = Get_ArrayOptionCategory($1)))
+	vyyerror("Unknown Array Option Class '%s'", $1);
+      else{
+	if(!(pArrOpt = Get_ArrayOption($3, pArrCat, &i)))
+	  vyyerror("Unknown Array Option '%s.%s'", $1, $3);
+	else{
+	  switch(i){
+	  case GMSH_DOUBLE :
+	    ((double*)pNumOpt)[0] = $5[0] ;
+	    ((double*)pNumOpt)[1] = $5[1] ;
+	    ((double*)pNumOpt)[2] = $5[2] ;
+	    ((double*)pNumOpt)[3] = $5[3] ;
+	    break ;
+	  case GMSH_FLOAT :
+	    ((float*)pNumOpt)[0] = (float)$5[0] ;
+	    ((float*)pNumOpt)[1] = (float)$5[1] ;
+	    ((float*)pNumOpt)[2] = (float)$5[2] ;
+	    ((float*)pNumOpt)[3] = (float)$5[3] ;
+	    break ;
+	  case GMSH_LONG :
+	    ((long*)pNumOpt)[0] = (long)$5[0] ;
+	    ((long*)pNumOpt)[1] = (long)$5[1] ;
+	    ((long*)pNumOpt)[2] = (long)$5[2] ;
+	    ((long*)pNumOpt)[3] = (long)$5[3] ;
+	    break ;
+	  case GMSH_INT :
+	    ((int*)pNumOpt)[0] = (int)$5[0] ;
+	    ((int*)pNumOpt)[1] = (int)$5[1] ;
+	    ((int*)pNumOpt)[2] = (int)$5[2] ;
+	    ((int*)pNumOpt)[3] = (int)$5[3] ;
+	    break ;
+	  }
+	}
+      }
     }
-  | tSTRING tAFFECT VExpr tEND
+  | tSTRING '.' tColor '.' tSTRING tAFFECT Color tEND 
     {
-      if(!Set_ArrayOption($1, PrintOptions_Array, $3))
-	vyyerror("Unknown Print Option (Array) '%s'", $1);
+      if(!(pColCat = Get_ColorOptionCategory($1)))
+	vyyerror("Unknown Color Option Class '%s'", $1);
+      else{
+	if(!(pColOpt = Get_ColorOption($5, pColCat)))
+	  vyyerror("Unknown Color Option '%s.%s'", $1, $5);
+	else{
+	  *pColOpt = $7 ;
+	}
+      }
     }
-  | tColor 
-    { ColorField = PrintOptions_Color; }
-    '{' ColorAffects '}'
 ;
 
-ColorAffects :
+/* ---------------
+    S C R I P T S 
+   --------------- */
+
+Scripts :
   /* empty */
-  | ColorAffect ColorAffects
+  | Scripts Script
 ;
 
-ColorAffect : 
-    tSTRING tAFFECT tSTRING tEND
-    {
-      i = Get_ColorForString(ColorString, -1, $3, &flag);
-      if(flag) vyyerror("Unknown Color '%s'", $3);
-      if(!Set_ColorOption($1, ColorField, i))
-	vyyerror("Unknown Color Field '%s'", $1);
-    }
-  | tSTRING tAFFECT '{' tSTRING ',' FExpr '}' tEND
-    {
-      i = Get_ColorForString(ColorString, (int)$6, $4, &flag);
-      if(flag) vyyerror("Unknown Color '%s'", $4);
-      if(!Set_ColorOption($1, ColorField, i))
-	 vyyerror("Unknown Color Field '%s'", $1);
-    }
-  | tSTRING tAFFECT RGBAExpr tEND
-    {
-      if(!Set_ColorOption($1, ColorField,
-			  PACK_COLOR((int)$3[0], (int)$3[1], (int)$3[2], (int)$3[3])))
-	vyyerror("Unknown Color Field '%s'", $1);
-    }
+Script :
+    Option 
+/*
+  | Action
+  | Loop
+  | Test
+*/
 ;
 
-RGBAExpr :
-    '{' FExpr ',' FExpr ',' FExpr ',' FExpr '}'
-    {
-      $$[0]=$2;
-      $$[1]=$4;
-      $$[2]=$6;
-      $$[3]=$8;
-    }
-  | '{' FExpr ',' FExpr ',' FExpr '}'
-    {
-      $$[0]=$2;
-      $$[1]=$4;
-      $$[2]=$6;
-      $$[3]=255.;
-    }
-;
 
 /* ---------------
     G E N E R A L
@@ -1624,15 +1678,26 @@ BoolExpr :
   ;
 
 FExpr :
-    FExpr_Single             { $$ = $1; }
-  | '(' FExpr ')'            { $$ = $2; }
-  | FExpr '-' FExpr          { $$ = $1 - $3; }
-  | FExpr '+' FExpr          { $$ = $1 + $3; }
-  | FExpr '*' FExpr          { $$ = $1 * $3; }
-  | FExpr '/' FExpr          { $$ = $1 / $3; }
-  | FExpr '^' FExpr          { $$ = pow($1, $3); }
-  | '-' FExpr %prec UMINUS   { $$ = - $2; }
-  | '+' FExpr %prec UMINUS   { $$ = $2; }
+    FExpr_Single                     { $$ = $1;           }
+  | '(' FExpr ')'                    { $$ = $2 ;          }
+  | '-' FExpr %prec UNARYPREC        { $$ = -$2 ;         }
+  | '+' FExpr %prec UNARYPREC        { $$ = $2;           }
+  | '!' FExpr                        { $$ = !$2 ;         }
+  | FExpr '-' FExpr                  { $$ = $1 - $3 ;     }
+  | FExpr '+' FExpr                  { $$ = $1 + $3 ;     }
+  | FExpr '*' FExpr                  { $$ = $1 * $3 ;     }
+  | FExpr '/' FExpr                  { $$ = $1 / $3 ;     }
+  | FExpr '%' FExpr                  { $$ = (int)$1 % (int)$3 ;  }
+  | FExpr '^' FExpr                  { $$ = pow($1,$3) ;  }
+  | FExpr '<' FExpr                  { $$ = $1 < $3 ;     }
+  | FExpr '>' FExpr                  { $$ = $1 > $3 ;     }
+  | FExpr tLESSOREQUAL FExpr         { $$ = $1 <= $3 ;    }
+  | FExpr tGREATEROREQUAL FExpr      { $$ = $1 >= $3 ;    }
+  | FExpr tEQUAL FExpr               { $$ = $1 == $3 ;    }
+  | FExpr tNOTEQUAL FExpr            { $$ = $1 != $3 ;    }
+  | FExpr tAND FExpr                 { $$ = $1 && $3 ;    }
+  | FExpr tOR FExpr                  { $$ = $1 || $3 ;    }
+  | FExpr '?' FExpr tDOTS FExpr      { $$ = $1? $3 : $5 ; }
   | tExp    '(' FExpr ')'            { $$ = exp($3);      }
   | tLog    '(' FExpr ')'            { $$ = log($3);      }
   | tLog10  '(' FExpr ')'            { $$ = log10($3);    }
@@ -1667,6 +1732,57 @@ FExpr_Single :
       else  $$ = TheSymbol.val ;
       Free($1);
     }
+  | tSTRING '.' tSTRING 
+    {
+      if(!(pNumCat = Get_NumberOptionCategory($1)))
+	vyyerror("Unknown Numeric Option Class '%s'", $1);
+      else{
+	if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i)))
+	  vyyerror("Unknown Numeric Option '%s.%s'", $1, $3);
+	else{
+	  switch(i){
+	  case GMSH_DOUBLE : $$ = *(double*)pNumOpt ; break ;
+	  case GMSH_FLOAT : $$ = (double)(*(float*)pNumOpt) ; break ;
+	  case GMSH_LONG : $$ = (double)(*(long*)pNumOpt) ; break ;
+	  case GMSH_INT : $$ = (double)(*(int*)pNumOpt) ; break ;
+	  }
+	}
+      }
+    }
+  | tSTRING '.' tSTRING tPLUSPLUS
+    {
+      if(!(pNumCat = Get_NumberOptionCategory($1)))
+	vyyerror("Unknown Numeric Option Class '%s'", $1);
+      else{
+	if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i)))
+	  vyyerror("Unknown Numeric Option '%s.%s'", $1, $3);
+	else{
+	  switch(i){
+	  case GMSH_DOUBLE : $$ = (*(double*)pNumOpt += 1.) ; break ;
+	  case GMSH_FLOAT : $$ = (double)(*(float*)pNumOpt += 1.) ; break ;
+	  case GMSH_LONG : $$ = (double)(*(long*)pNumOpt += 1) ; break ;
+	  case GMSH_INT : $$ = (double)(*(int*)pNumOpt += 1) ; break ;
+	  }
+	}
+      }
+    }
+  | tSTRING '.' tSTRING tMINUSMINUS
+    {
+      if(!(pNumCat = Get_NumberOptionCategory($1)))
+	vyyerror("Unknown Numeric Option Class '%s'", $1);
+      else{
+	if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i)))
+	  vyyerror("Unknown Numeric Option '%s.%s'", $1, $3);
+	else{
+	  switch(i){
+	  case GMSH_DOUBLE : $$ = (*(double*)pNumOpt -= 1.) ; break ;
+	  case GMSH_FLOAT : $$ = (double)(*(float*)pNumOpt -= 1.) ; break ;
+	  case GMSH_LONG : $$ = (double)(*(long*)pNumOpt -= 1) ; break ;
+	  case GMSH_INT : $$ = (double)(*(int*)pNumOpt -= 1) ; break ;
+	  }
+	}
+      }
+    }
 ;
 
 FExpr_Range :
@@ -1690,37 +1806,43 @@ FExpr_Range :
   ;
 
 VExpr :
-    '{' FExpr ',' FExpr ',' FExpr ',' FExpr ',' FExpr  '}'
+    VExpr_Single
     {
-      $$[0]=$2;
-      $$[1]=$4;
-      $$[2]=$6;
-      $$[3]=$8;
-      $$[4]=$10;
+      $$ = $1;
     }
-  | '{' FExpr ',' FExpr ',' FExpr ',' FExpr '}'
+  | '-' VExpr %prec UNARYPREC
+    {
+      for(i=0 ; i<6 ; i++) $$[i] = -$2[i] ;
+    }
+  | '+' VExpr %prec UNARYPREC
+    { 
+      $$ = $2;
+    }
+  | VExpr '-' VExpr
+    { 
+      for(i=0 ; i<6 ; i++) $$[i] = $1[i] - $3[i] ;
+    }
+  | VExpr '+' VExpr
     {
-      $$[0]=$2;
-      $$[1]=$4;
-      $$[2]=$6;
-      $$[3]=$8;
-      $$[4]=1.0;
+      for(i=0 ; i<6 ; i++) $$[i] = $1[i] + $3[i] ;
+    }
+
+VExpr_Single :
+    '{' FExpr ',' FExpr ',' FExpr ',' FExpr ',' FExpr  '}'
+    { 
+      $$[0]=$2;  $$[1]=$4;  $$[2]=$6;  $$[3]=$8; $$[4]=$10;
+    }
+  | '{' FExpr ',' FExpr ',' FExpr ',' FExpr '}'
+    { 
+      $$[0]=$2;  $$[1]=$4;  $$[2]=$6;  $$[3]=$8; $$[4]=1.0;
     }
   | '{' FExpr ',' FExpr ',' FExpr '}'
     {
-      $$[0]=$2;
-      $$[1]=$4;
-      $$[2]=$6;
-      $$[3]=0.0;
-      $$[4]=1.0;
+      $$[0]=$2;  $$[1]=$4;  $$[2]=$6;  $$[3]=0.0; $$[4]=1.0;
     }
   | '(' FExpr ',' FExpr ',' FExpr ')'
     {
-      $$[0]=$2;
-      $$[1]=$4;
-      $$[2]=$6;
-      $$[3]=0.0;
-      $$[4]=1.0;
+      $$[0]=$2;  $$[1]=$4;  $$[2]=$6;  $$[3]=0.0; $$[4]=1.0;
     }
 ;
 
@@ -1782,12 +1904,6 @@ ListOfDouble :
     {
       $$=ListOfDouble_L;
     }
-/*
-  | '(' RecursiveListOfDouble ')'
-    {
-      $$=ListOfDouble_L;
-    }
-*/
 ;
 
 
@@ -1820,6 +1936,38 @@ RecursiveListOfDouble :
     }
 ;
 
+Color :
+    '{' FExpr ',' FExpr ',' FExpr ',' FExpr '}'
+    {
+      $$ = PACK_COLOR((int)$2, (int)$4, (int)$6, (int)$8);
+    }
+  | '{' FExpr ',' FExpr ',' FExpr '}'
+    {
+      $$ = PACK_COLOR((int)$2, (int)$4, (int)$6, 255);
+    }
+  | '{' tSTRING ',' FExpr '}'
+    {
+      $$ = Get_ColorForString(ColorString, (int)$4, $2, &flag);
+      if(flag) vyyerror("Unknown Color '%s'", $2);
+    }
+  | tSTRING
+    {
+      $$ = Get_ColorForString(ColorString, -1, $1, &flag);
+      if(flag) vyyerror("Unknown Color '%s'", $1);
+    }
+  | tSTRING '.' tColor '.' tSTRING 
+    {
+      if(!(pColCat = Get_ColorOptionCategory($1)))
+	vyyerror("Unknown Color Option Class '%s'", $1);
+      else{
+	if(!(pColOpt = Get_ColorOption($5, pColCat)))
+	  vyyerror("Unknown Color Option '%s.%s'", $1, $5);
+	else{
+	  $$ = *pColOpt ;
+	}
+      }
+    }
+;
 
 %%