CLASS WITH SYNTAX

diff --git a/libasn1fix/Makefile.am b/libasn1fix/Makefile.am
index 0db2c68..21b1b83 100644
--- a/libasn1fix/Makefile.am
+++ b/libasn1fix/Makefile.am
@@ -3,6 +3,9 @@
 AM_CPPFLAGS =				\
 	-I$(top_srcdir)/libasn1parser
 
+AM_YFLAGS = -p asn1fix_cws_ -d
+AM_LFLAGS = -sp -Cem -Pasn1fix_cws_ -olex.yy.c
+
 noinst_LTLIBRARIES = libasn1fix.la
 
 libasn1fix_la_LDFLAGS = -all-static
@@ -26,6 +29,8 @@
 	asn1fix_class.c asn1fix_class.h			\
 	asn1fix_tags.c asn1fix_tags.h			\
 	asn1fix_enum.c asn1fix_enum.h			\
+	asn1fix_cws_y.y asn1fix_cws_l.l			\
+	asn1fix_cws.c asn1fix_cws.h			\
 	asn1fix_constraint_compat.c
 
 check_PROGRAMS = check_fixer
diff --git a/libasn1fix/Makefile.in b/libasn1fix/Makefile.in
index b448809..61a4d84 100644
--- a/libasn1fix/Makefile.in
+++ b/libasn1fix/Makefile.in
@@ -39,7 +39,8 @@
 host_triplet = @host@
 check_PROGRAMS = check_fixer$(EXEEXT)
 subdir = libasn1fix
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	asn1fix_cws_l.c asn1fix_cws_y.c asn1fix_cws_y.h
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/configure.in
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
@@ -55,7 +56,7 @@
 	asn1fix_integer.lo asn1fix_crange.lo asn1fix_dereft.lo \
 	asn1fix_derefv.lo asn1fix_export.lo asn1fix_param.lo \
 	asn1fix_class.lo asn1fix_tags.lo asn1fix_enum.lo \
-	asn1fix_constraint_compat.lo
+	asn1fix_cws_y.lo asn1fix_cws_l.lo asn1fix_constraint_compat.lo
 libasn1fix_la_OBJECTS = $(am_libasn1fix_la_OBJECTS)
 check_fixer_SOURCES = check_fixer.c
 check_fixer_OBJECTS = check_fixer.$(OBJEXT)
@@ -72,6 +73,8 @@
 @AMDEP_TRUE@	./$(DEPDIR)/asn1fix_constraint_compat.Plo \
 @AMDEP_TRUE@	./$(DEPDIR)/asn1fix_crange.Plo \
 @AMDEP_TRUE@	./$(DEPDIR)/asn1fix_cstring.Plo \
+@AMDEP_TRUE@	./$(DEPDIR)/asn1fix_cws_l.Plo \
+@AMDEP_TRUE@	./$(DEPDIR)/asn1fix_cws_y.Plo \
 @AMDEP_TRUE@	./$(DEPDIR)/asn1fix_dereft.Plo \
 @AMDEP_TRUE@	./$(DEPDIR)/asn1fix_derefv.Plo \
 @AMDEP_TRUE@	./$(DEPDIR)/asn1fix_enum.Plo \
@@ -91,6 +94,11 @@
 CCLD = $(CC)
 LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS)
+LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS)
+YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
+LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \
+	$(AM_YFLAGS)
 SOURCES = $(libasn1fix_la_SOURCES) check_fixer.c
 DIST_SOURCES = $(libasn1fix_la_SOURCES) check_fixer.c
 ETAGS = etags
@@ -209,6 +217,8 @@
 AM_CPPFLAGS = \
 	-I$(top_srcdir)/libasn1parser
 
+AM_YFLAGS = -p asn1fix_cws_ -d
+AM_LFLAGS = -sp -Cem -Pasn1fix_cws_ -olex.yy.c
 noinst_LTLIBRARIES = libasn1fix.la
 libasn1fix_la_LDFLAGS = -all-static
 libasn1fix_la_SOURCES = \
@@ -231,6 +241,7 @@
 	asn1fix_class.c asn1fix_class.h			\
 	asn1fix_tags.c asn1fix_tags.h			\
 	asn1fix_enum.c asn1fix_enum.h			\
+	asn1fix_cws_y.y asn1fix_cws_l.l			\
 	asn1fix_constraint_compat.c
 
 check_fixer_LDADD = $(noinst_LTLIBRARIES)		\
@@ -242,7 +253,7 @@
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
+.SUFFIXES: .c .l .lo .o .obj .y
 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
@@ -281,6 +292,11 @@
 	  echo "rm -f \"$${dir}/so_locations\""; \
 	  rm -f "$${dir}/so_locations"; \
 	done
+asn1fix_cws_y.h: asn1fix_cws_y.c
+	@if test ! -f $@; then \
+	  rm -f asn1fix_cws_y.c; \
+	  $(MAKE) asn1fix_cws_y.c; \
+	else :; fi
 libasn1fix.la: $(libasn1fix_la_OBJECTS) $(libasn1fix_la_DEPENDENCIES) 
 	$(LINK)  $(libasn1fix_la_LDFLAGS) $(libasn1fix_la_OBJECTS) $(libasn1fix_la_LIBADD) $(LIBS)
 
@@ -309,6 +325,8 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_constraint_compat.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_crange.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_cstring.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_cws_l.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_cws_y.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_dereft.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_derefv.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1fix_enum.Plo@am__quote@
@@ -345,6 +363,31 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
 
+.l.c:
+	$(LEXCOMPILE) $<
+	sed '/^#/ s|$(LEX_OUTPUT_ROOT)\.c|$@|' $(LEX_OUTPUT_ROOT).c >$@
+	rm -f $(LEX_OUTPUT_ROOT).c
+
+.y.c:
+	$(YACCCOMPILE) $<
+	if test -f y.tab.h; then \
+	  to=`echo "$*_H" | sed \
+                -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
+                -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \
+	  sed "/^#/ s/Y_TAB_H/$$to/g" y.tab.h >$*.ht; \
+	  rm -f y.tab.h; \
+	  if cmp -s $*.ht $*.h; then \
+	    rm -f $*.ht ;\
+	  else \
+	    mv $*.ht $*.h; \
+	  fi; \
+	fi
+	if test -f y.output; then \
+	  mv y.output $*.output; \
+	fi
+	sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@
+	rm -f y.tab.c
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
@@ -533,6 +576,9 @@
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
+	-rm -f asn1fix_cws_y.c
+	-rm -f asn1fix_cws_y.h
+	-rm -f asn1fix_cws_l.c
 clean: clean-am
 
 clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
diff --git a/libasn1fix/asn1fix_cws.c b/libasn1fix/asn1fix_cws.c
new file mode 100644
index 0000000..2a629e9
--- /dev/null
+++ b/libasn1fix/asn1fix_cws.c
@@ -0,0 +1 @@
+#include "asn1fix_internal.h"
diff --git a/libasn1fix/asn1fix_cws.h b/libasn1fix/asn1fix_cws.h
new file mode 100644
index 0000000..a134e53
--- /dev/null
+++ b/libasn1fix/asn1fix_cws.h
@@ -0,0 +1,24 @@
+#ifndef	_ASN1FIX_CLASS_WITH_SYNTAX_H_
+#define	_ASN1FIX_CLASS_WITH_SYNTAX_H_
+
+/*
+ * This structure describes the "WITH SYNTAX" clause of a CLASS.
+ */
+typedef struct asn1f_cws_syntax_list_s {
+	struct asn1f_cws_spec **cwspecs;
+	int cwcount;	/* Number of pieces of CWS information */
+} asn1f_cws_syntax_list_t;
+
+struct asn1f_cws_spec {
+	enum {
+		CWS_LITERAL,
+		CWS_FIELD,
+		CWS_OPTIONALGROUP
+	} type;
+	union {
+		char *token;	/* For CWSB_LITERAL & CWSB_FIELD */
+		asn1f_cws_syntax_list_t *syntax;
+	} content;
+};
+
+#endif	/* _ASN1FIX_CLASS_WITH_SYNTAX_H_ */