diff --git a/parser.c b/parser.c
index 2e8df500bd81ae5c8cae92685a06c20d6822ff3a..8f4a6e3d365d0868bbbec1506bbc130919bab0af 100644
--- a/parser.c
+++ b/parser.c
@@ -13,10 +13,10 @@
  *      declns = ne-list( decln ) tEOF
  *      decln  = tID tEQ shapes tSEMI
  *	shapes = ne-sep-list( shape, tOR )
- *      shape  = tID [ tOPENBR params tCLOSEBR ] [ list( printitem ) ]
+ *	shape  = tID [ tOPENBR params tCLOSEBR ] printlist
  *	params = ne-sep-list( param, tCOMMA )
  *      param  = tID tID
- *	printitem = tSTR | tNUM
+ *	printlist = list( tSTR | tNUM )
  */
 
 
@@ -108,7 +108,7 @@ static BOOL parse_shapes( sp ) shapelist *sp;
 }
 
 
-/* shape = tID [ tOPENBR params tCLOSEBR ] [ printlist ] */
+/* shape = tID [ tOPENBR params tCLOSEBR ] printlist */
 
 static BOOL parse_shape( tagname, pl, print ) char **tagname; paramlist *pl; printlist *print;
 {
@@ -118,19 +118,17 @@ static BOOL parse_shape( tagname, pl, print ) char **tagname; paramlist *pl; pri
         MUSTBE( tID, "shape name" );
         COPYOF( *tagname, lexidval );
 
-        if( nexttok() != tOPENBR )
+        if( nexttok() == tOPENBR )
+	{
+		if( ! parse_params( pl ) ) return FALSE;
+
+		MUSTBE( tCLOSEBR, "')'" );
+	} else
 	{
 		ungettok();
-		return TRUE;
 	}
 
-        if( ! parse_params( pl ) ) return FALSE;
-
-        MUSTBE( tCLOSEBR, "')'" );
-
-	if( ! parse_printlist( print ) ) return FALSE;
-
-        return TRUE;
+	return parse_printlist( print );
 }
 
 
@@ -174,9 +172,12 @@ static BOOL parse_printlist( pp ) printlist *pp;
 
 static BOOL parse_printitem( item ) printitem *item;
 {
+	char *temp;
+
 	switch( nexttok() ) {
 	case tSTR:
-		*item = build_printitem_str( lexidval );
+		COPYOF( temp, lexidval );
+		*item = build_printitem_str( temp );
 		return TRUE;
 	case tNUM:
 		*item = build_printitem_num( lexintval );