2002/css-validator/org/w3c/css/parser/analyzer Couple.java,1.2,1.3 CssParser.java,1.16,1.17 CssParser.jj,1.14,1.15 CssParserTokenManager.java,1.9,1.10 TokenMgrError.java,1.4,1.5

Update of /sources/public/2002/css-validator/org/w3c/css/parser/analyzer
In directory hutz:/tmp/cvs-serv8236/org/w3c/css/parser/analyzer

Modified Files:
	Couple.java CssParser.java CssParser.jj 
	CssParserTokenManager.java TokenMgrError.java 
Log Message:
Changes from Jean-Guilhem Rouel
Bug fixed: 1174 845 160 766
See
http://www.w3.org/Bugs/Public/show_bug.cgi?id=1174
http://www.w3.org/Bugs/Public/show_bug.cgi?id=845
http://www.w3.org/Bugs/Public/show_bug.cgi?id=160
http://www.w3.org/Bugs/Public/show_bug.cgi?id=766

The handling of selectors has been redone almost entirely.

Also, changelog in files has been removed.



Index: CssParserTokenManager.java
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/parser/analyzer/CssParserTokenManager.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- CssParserTokenManager.java	8 Aug 2005 13:18:11 -0000	1.9
+++ CssParserTokenManager.java	8 Sep 2005 12:23:33 -0000	1.10
@@ -5,55 +5,22 @@
 {
   public  java.io.PrintStream debugStream = System.out;
   public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopAtPos(int pos, int kind)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   return pos + 1;
-}
-private final int jjMoveStringLiteralDfa0_1()
-{
[...4371 lines suppressed...]
@@ -3756,8 +3848,8 @@
    0x14L, 0x0L, 
 };
 protected SimpleCharStream input_stream;
-private final int[] jjrounds = new int[380];
-private final int[] jjstateSet = new int[760];
+private final int[] jjrounds = new int[388];
+private final int[] jjstateSet = new int[776];
 StringBuffer image;
 int jjimageLen;
 int lengthOfMatch;
@@ -3784,7 +3876,7 @@
 {
    int i;
    jjround = 0x80000001;
-   for (i = 380; i-- > 0;)
+   for (i = 388; i-- > 0;)
       jjrounds[i] = 0x80000000;
 }
 public void ReInit(SimpleCharStream stream, int lexState)

Index: CssParser.java
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/parser/analyzer/CssParser.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- CssParser.java	23 Aug 2005 16:22:54 -0000	1.16
+++ CssParser.java	8 Sep 2005 12:23:33 -0000	1.17
@@ -2,39 +2,59 @@
 package org.w3c.css.parser.analyzer;
 
 import java.io.InputStream;
-import java.net.URL;
-import java.util.Enumeration;
 import java.util.Vector;
+import java.util.Enumeration;
+import java.net.URL;
 
+import org.w3c.css.values.CssValue;
+import org.w3c.css.values.CssExpression;
+import org.w3c.css.values.CssString;
+import org.w3c.css.values.CssURL;
+import org.w3c.css.values.CssLength;
+import org.w3c.css.values.CssNumber;
+import org.w3c.css.values.CssColor;
+import org.w3c.css.values.CssIdent;
+import org.w3c.css.values.CssPercentage;
+import org.w3c.css.values.CssFrequency;
+import org.w3c.css.values.CssTime;
+import org.w3c.css.values.CssDate;
+import org.w3c.css.values.CssAngle;
+import org.w3c.css.values.CssFunction;
+import org.w3c.css.values.CssUnicodeRange;
+import org.w3c.css.values.CssResolution;
+import org.w3c.css.properties.css1.CssProperty;
+import org.w3c.css.parser.Frame;
+import org.w3c.css.util.ApplContext;
+import org.w3c.css.parser.CssError;
+import org.w3c.css.parser.CssSelectors;
+import org.w3c.css.parser.CssParseException;
 import org.w3c.css.parser.AtRule;
-import org.w3c.css.parser.AtRuleFontFace;
 import org.w3c.css.parser.AtRuleMedia;
+import org.w3c.css.parser.AtRuleFontFace;
 import org.w3c.css.parser.AtRulePage;
-import org.w3c.css.parser.AtRulePhoneticAlphabet;
 import org.w3c.css.parser.AtRulePreference;
-import org.w3c.css.parser.CssError;
-import org.w3c.css.parser.CssParseException;
-import org.w3c.css.parser.CssSelectors;
-import org.w3c.css.properties.css1.CssProperty;
+import org.w3c.css.parser.AtRulePhoneticAlphabet;
 import org.w3c.css.properties.svg.AtRuleColorProfile;
-import org.w3c.css.util.ApplContext;
 import org.w3c.css.util.InvalidParamException;
 import org.w3c.css.util.Util;
-import org.w3c.css.values.CssAngle;
-import org.w3c.css.values.CssDate;
-import org.w3c.css.values.CssExpression;
-import org.w3c.css.values.CssFrequency;
-import org.w3c.css.values.CssFunction;
-import org.w3c.css.values.CssIdent;
-import org.w3c.css.values.CssLength;
-import org.w3c.css.values.CssNumber;
-import org.w3c.css.values.CssPercentage;
-import org.w3c.css.values.CssResolution;
-import org.w3c.css.values.CssString;
-import org.w3c.css.values.CssTime;
-import org.w3c.css.values.CssURL;
-import org.w3c.css.values.CssUnicodeRange;
-import org.w3c.css.values.CssValue;
+import org.w3c.css.util.Messages;
+import org.w3c.css.css.StyleSheetCom;
+
+import org.w3c.css.selectors.AdjacentSelector;
+import org.w3c.css.selectors.AttributeSelector;
+import org.w3c.css.selectors.ChildSelector;
+import org.w3c.css.selectors.ClassSelector;
+import org.w3c.css.selectors.DescendantSelector;
+import org.w3c.css.selectors.IdSelector;
+import org.w3c.css.selectors.TypeSelector;
+import org.w3c.css.selectors.UniversalSelector;
+import org.w3c.css.selectors.attributes.AttributeAny;
+import org.w3c.css.selectors.attributes.AttributeBegin;
+import org.w3c.css.selectors.attributes.AttributeExact;
+import org.w3c.css.selectors.attributes.AttributeOneOf;
+import org.w3c.css.selectors.attributes.AttributeStart;
+import org.w3c.css.selectors.attributes.AttributeSubstr;
+import org.w3c.css.selectors.attributes.AttributeSuffix;
 
 /**
  * A CSS3 parser  
@@ -247,7 +267,8 @@
             if (ac.getCssVersion().equals("css1") && (n.image).equals("inherit")) {
 
                 incompatible_error = true;
-            }            
+            }
+
             if (n.kind == CssParserConstants.IDENT) {
                 v.set( convertIdent(operator+n.image).trim(), ac);
             } else if (n.kind == CssParserConstants.STRING) {
@@ -1374,11 +1395,11 @@
  * @exception ParseException exception during the parse
  */
   final public void atRuleDeclaration() throws ParseException {
-    Token n;
-    n = jj_consume_token(ATKEYWORD);    	
+ Token n;
+    n = jj_consume_token(ATKEYWORD);
         //ac.getFrame().addWarning("at-rule", token.toString());
         ac.getFrame().addError(
-        	new CssError(new InvalidParamException("at-rule", token, ac)));
+                new CssError(new InvalidParamException("at-rule", token, ac)));
         skipStatement();
   }
 
@@ -1769,7 +1790,18 @@
                             {if (true) throw new InvalidParamException("nocomb", "~", ac);}
                       }
                   }
-                current.setConnector(comb);
+                  switch(comb) {
+                  case '+':
+                      current.addAdjacent(new AdjacentSelector());
+                      break;
+                  case '>':
+                      current.addChild(new ChildSelector());
+                      break;
+                  default:
+                      current.addDescendant(new DescendantSelector());
+                  }
+                //current.setConnector(comb); 
+
         current = simple_selector(current);
       }
       label_62:
@@ -2161,8 +2193,9 @@
       /*  "." n=<IDENT> { */
           n = jj_consume_token(CLASS);
       try {
-          s.addAttribute("class", convertIdent(n.image.substring(1)),
-             CssSelectors.ATTRIBUTE_CLASS_SEL);
+          s.addClass(new ClassSelector(convertIdent(n.image.substring(1))));
+//        s.addAttribute("class", convertIdent(n.image.substring(1)),
+//           CssSelectors.ATTRIBUTE_CLASS_SEL);
       } catch (InvalidParamException e) {
              removeThisRule();
              ac.getFrame().addError(new CssError(e));
@@ -2178,34 +2211,56 @@
     case DIMEN:
       n = deprecated_class();
       if (n.image.charAt(0) == '.') {
-          n.image = n.image.substring(1);
+n.image = n.image.substring(1);
+
+          // the class with the first digit escaped
           String cl = "\\" + Integer.toString(n.image.charAt(0), 16);
-          int len = n.image.length();
-          if (len != 1) {
-              int i = 1;
-              do {
-                  char c = n.image.charAt(i);
-                  if (((c <= 9) && (c >= -1))
-                      || ((c <= 'f') && (c >= 'a'))
-                      || ((c <= 'F') && (c >= 'A'))) {
-                      cl += "\\" + Integer.toString(c, 16);
-                  } else {
-                      break;
+          cl += n.image.substring(1);
+
+          String profile = ac.getProfile();
+          if(profile == null || profile.equals("")) {
+              profile = ac.getCssVersion();
+          }
+
+          if(!profile.equals("css1")) {
+              addError(new ParseException(ac.getMsg().getString(
+                      "parser.old_class")),
+                      "To make \"." + n.image + "\" a valid class, CSS2" +
+                      " requires the first digit to be escaped " +
+                      "(\"." + cl + "\")");
+              s.addClass(new ClassSelector(n.image));
+              removeThisRule();
+          }
+          else {
+              CssLength length = new CssLength();
+              boolean isLength = false;
+              try {
+                  length.set(n.image, ac);
+                  isLength = true;
+              }
+              catch(Exception e) {
+                  System.out.println("CssParser._class(): " + e.getClass());
+                  isLength = false;
+              }
+              if(isLength) {
+                  addError(new ParseException(ac.getMsg().getString(
+                  "parser.class_dim")), n.image);
+                  s.addClass(new ClassSelector(n.image));
+                  removeThisRule();
+              }
+              else {
+                  try {
+                      // for css > 1, we add the rule to have a context, 
+                      // and we then remove it
+                      s.addClass(new ClassSelector(n.image));
+
+                      ac.getFrame().addWarning("old_class");
+                  } catch (InvalidParamException e) {
+                      ac.getFrame().addError(new CssError(e));
+                      removeThisRule();
                   }
-              } while (++i < len);
-              if (i < len) {
-                  cl += n.image.substring(i);
               }
           }
-          addError(new ParseException(ac.getMsg().getString("parser.old_class")),
-                   "To make \"." + n.image + "\" a valid class, CSS2 requires"
-                   + " the first digit to be escaped (\"." + cl + "\")");
-          try {
-                s.addAttribute("class", cl, CssSelectors.ATTRIBUTE_ONE_OF);
-          } catch (InvalidParamException e) {
-                removeThisRule();
-                ac.getFrame().addError(new CssError(e));
-          }
       } else {
           {if (true) throw new ParseException("Unrecognized ");}
       }
@@ -2268,12 +2323,14 @@
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case IDENT:
       n = jj_consume_token(IDENT);
-              s.setElement(convertIdent(n.image), ac);
+              //              s.setElement(convertIdent(n.image), ac);
+      s.addType(new TypeSelector(convertIdent(n.image)));
       break;
     case ANY:
       jj_consume_token(ANY);
                 if (!ac.getCssVersion().equals("css1")) {
-                    s.setElement(null);
+//                  s.setElement(null);
+                    s.addUniversal(new UniversalSelector());
                 } else {
                     ac.getFrame().addError(new CssError(new InvalidParamException("notversion",
                         "*", ac.getCssVersion(), ac)));
@@ -2402,15 +2459,48 @@
     jj_consume_token(RBRACKET);
           if (selectorType == CssSelectors.ATTRIBUTE_ANY) {
               try {
-                  s.addAttribute(att.image.toLowerCase(), null, selectorType);
+                  s.addAttribute(new AttributeAny(att.image.toLowerCase()));
+//                s.addAttribute(att.image.toLowerCase(), null, selectorType);
               } catch (InvalidParamException e) {
                   removeThisRule();
                   ac.getFrame().addError(new CssError(e));
               }
           } else {
+              AttributeSelector attribute;
+              switch(selectorType) {
+              case CssSelectors.ATTRIBUTE_BEGIN:
+                  attribute = new AttributeBegin(att.image.toLowerCase(),
+                          val.image);
+                  break;
+              case CssSelectors.ATTRIBUTE_EXACT:
+                  attribute = new AttributeExact(att.image.toLowerCase(),
+                          val.image);
+                  break;
+              case CssSelectors.ATTRIBUTE_ONE_OF:
+                  attribute = new AttributeOneOf(att.image.toLowerCase(),
+                          val.image);
+                  break;
+              case CssSelectors.ATTRIBUTE_START:
+                  attribute = new AttributeStart(att.image.toLowerCase(),
+                          val.image);
+                  break;
+              case CssSelectors.ATTRIBUTE_SUBSTR:
+                  attribute = new AttributeSubstr(att.image.toLowerCase(),
+                          val.image);
+                  break;
+              case CssSelectors.ATTRIBUTE_SUFFIX:
+                  attribute = new AttributeSuffix(att.image.toLowerCase(),
+                          val.image);
+                  break;
+              default:
+                  attribute = new AttributeExact(att.image.toLowerCase(),
+                          val.image);
+                  break;
+              }
               try {
-                  s.addAttribute(att.image.toLowerCase(), val.image,
-                             selectorType);
+                  s.addAttribute(attribute);
+//	      	  s.addAttribute(att.image.toLowerCase(), val.image, 
+//			     selectorType);
               } catch (InvalidParamException e) {
                   removeThisRule();
                   ac.getFrame().addError(new CssError(e));
@@ -2547,12 +2637,64 @@
   final public void hash(CssSelectors s) throws ParseException {
  Token n;
     n = jj_consume_token(HASH);
-      try {
-          s.addAttribute("id", n.image.substring(1),
-                     CssSelectors.ATTRIBUTE_EXACT);
-      } catch (InvalidParamException e) {
-          removeThisRule();
-          ac.getFrame().addError(new CssError(e));
+      n.image = n.image.substring(1);
+      if(Character.isDigit(n.image.charAt(0))) {
+          String profile = ac.getProfile();
+          if(profile == null || profile.equals("")) {
+              profile = ac.getCssVersion();
+          }
+
+          if(!profile.equals("css1")) {
+              // the id with the first digit escaped
+              String cl = "\\" + Integer.toString(n.image.charAt(0), 16);
+              cl += n.image.substring(1);
+
+              addError(new ParseException(ac.getMsg().getString(
+                "parser.old_id")),
+                "To make \"." + n.image + "\" a valid id, CSS2" +
+                " requires the first digit to be escaped " +
+                "(\"#" + cl + "\")");
+              // for css > 1, we add the rule to have a context, 
+              // and we then remove it
+              s.addId(new IdSelector(n.image));
+              removeThisRule();
+          }
+          else {
+              CssLength length = new CssLength();
+              boolean isLength = false;
+              try {
+                  length.set(n.image, ac);
+                  isLength = true;
+              }
+              catch(Exception e) {
+                  System.out.println("CssParser._id(): " + e.getClass());
+                  isLength = false;
+              }
+              if(isLength) {
+                  addError(new ParseException(ac.getMsg().getString(
+                  "parser.id_dim")), n.image);
+                  // we add the rule to have a context, and then we remove it
+                  s.addId(new IdSelector(n.image));
+                  removeThisRule();
+              }
+              else {
+                  try {
+                      s.addId(new IdSelector(n.image));
+                      ac.getFrame().addWarning("old_id");
+                  } catch (InvalidParamException e) {
+                      ac.getFrame().addError(new CssError(e));
+                      removeThisRule();
+                  }
+              }
+          }
+      }
+      else {
+          try {
+              s.addId(new IdSelector(n.image));
+          } catch (InvalidParamException e) {
+              ac.getFrame().addError(new CssError(e));
+              removeThisRule();
+          }
       }
   }
 
@@ -2649,7 +2791,7 @@
         }
         jj_consume_token(S);
       }
-      values = expr();      
+      values = expr();
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case IMPORTANT_SYM:
         important = prio();
@@ -2671,7 +2813,7 @@
                                                   values, important);
                 // Did the property recognize all values in the expression ?
 
-                if (!values.end() && ac.getMedium() == null) {                     
+                if (!values.end() && ac.getMedium() == null) {
                         addError(new InvalidParamException("unrecognize", "", ac),
                              values);
                 } else {
@@ -2727,7 +2869,7 @@
  */
   final public CssExpression expr() throws ParseException {
   CssExpression values = new CssExpression();
-    term(values);    
+    term(values);
     label_79:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -2766,9 +2908,9 @@
       default:
         jj_la1[112] = jj_gen;
         ;
-      }      
+      }
       term(values);
-    }    
+    }
     {if (true) return values;}
     throw new Error("Missing return statement in function");
   }
@@ -2924,8 +3066,8 @@
         jj_la1[116] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
-      }      
-      label_81:	  
+      }
+      label_81:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case S:
@@ -2942,7 +3084,7 @@
       jj_la1[118] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
-    }    
+    }
   }
 
 /**
@@ -3159,18 +3301,8 @@
     finally { jj_save(0, xla); }
   }
 
-  final private boolean jj_3R_103() {
-    if (jj_scan_token(IDENT)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_95() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_103()) {
-    jj_scanpos = xsp;
-    if (jj_3R_104()) return true;
-    }
+  final private boolean jj_3R_96() {
+    if (jj_scan_token(HASH)) return true;
     return false;
   }
 
@@ -3184,26 +3316,11 @@
     return false;
   }
 
-  final private boolean jj_3R_117() {
-    if (jj_scan_token(DIMEN)) return true;
-    return false;
-  }
-
   final private boolean jj_3R_100() {
     if (jj_scan_token(PLUS)) return true;
     return false;
   }
 
-  final private boolean jj_3R_116() {
-    if (jj_scan_token(RESOLUTION)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_115() {
-    if (jj_scan_token(FREQ)) return true;
-    return false;
-  }
-
   final private boolean jj_3R_94() {
     Token xsp;
     xsp = jj_scanpos;
@@ -3217,59 +3334,6 @@
     return false;
   }
 
-  final private boolean jj_3R_114() {
-    if (jj_scan_token(TIME)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_113() {
-    if (jj_scan_token(ANGLE)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_112() {
-    if (jj_scan_token(EXS)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_111() {
-    if (jj_scan_token(EMS)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_110() {
-    if (jj_scan_token(LENGTH)) return true;
-    return false;
-  }
-
-  final private boolean jj_3R_109() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_110()) {
-    jj_scanpos = xsp;
-    if (jj_3R_111()) {
-    jj_scanpos = xsp;
-    if (jj_3R_112()) {
-    jj_scanpos = xsp;
-    if (jj_3R_113()) {
-    jj_scanpos = xsp;
-    if (jj_3R_114()) {
-    jj_scanpos = xsp;
-    if (jj_3R_115()) {
-    jj_scanpos = xsp;
-    if (jj_3R_116()) {
-    jj_scanpos = xsp;
-    if (jj_3R_117()) return true;
-    }
-    }
-    }
-    }
-    }
-    }
-    }
-    return false;
-  }
-
   final private boolean jj_3R_88() {
     if (jj_scan_token(S)) return true;
     Token xsp;
@@ -3298,16 +3362,6 @@
     return false;
   }
 
-  final private boolean jj_3R_85() {
-    if (jj_scan_token(PLUS)) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
   final private boolean jj_3R_83() {
     Token xsp;
     xsp = jj_scanpos;
@@ -3324,13 +3378,43 @@
     return false;
   }
 
+  final private boolean jj_3R_85() {
+    if (jj_scan_token(PLUS)) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_scan_token(1)) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  final private boolean jj_3R_99() {
+    if (jj_scan_token(LBRACKET)) return true;
+    return false;
+  }
+
   final private boolean jj_3R_108() {
     if (jj_scan_token(COLON)) return true;
     return false;
   }
 
-  final private boolean jj_3R_107() {
-    if (jj_scan_token(84)) return true;
+  final private boolean jj_3R_106() {
+    if (jj_3R_109()) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_97() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_105()) {
+    jj_scanpos = xsp;
+    if (jj_3R_106()) return true;
+    }
+    return false;
+  }
+
+  final private boolean jj_3R_105() {
+    if (jj_scan_token(CLASS)) return true;
     return false;
   }
 
@@ -3344,38 +3428,63 @@
     return false;
   }
 
-  final private boolean jj_3R_106() {
-    if (jj_3R_109()) return true;
+  final private boolean jj_3R_107() {
+    if (jj_scan_token(84)) return true;
     return false;
   }
 
-  final private boolean jj_3R_105() {
-    if (jj_scan_token(CLASS)) return true;
+  final private boolean jj_3R_104() {
+    if (jj_scan_token(ANY)) return true;
     return false;
   }
 
-  final private boolean jj_3R_97() {
+  final private boolean jj_3R_95() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_105()) {
+    if (jj_3R_103()) {
     jj_scanpos = xsp;
-    if (jj_3R_106()) return true;
+    if (jj_3R_104()) return true;
     }
     return false;
   }
 
+  final private boolean jj_3R_103() {
+    if (jj_scan_token(IDENT)) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_117() {
+    if (jj_scan_token(DIMEN)) return true;
+    return false;
+  }
+
   final private boolean jj_3R_93() {
     if (jj_3R_99()) return true;
     return false;
   }
 
-  final private boolean jj_3R_99() {
-    if (jj_scan_token(LBRACKET)) return true;
+  final private boolean jj_3R_116() {
+    if (jj_scan_token(RESOLUTION)) return true;
     return false;
   }
 
-  final private boolean jj_3R_96() {
-    if (jj_scan_token(HASH)) return true;
+  final private boolean jj_3R_115() {
+    if (jj_scan_token(FREQ)) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_114() {
+    if (jj_scan_token(TIME)) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_113() {
+    if (jj_scan_token(ANGLE)) return true;
+    return false;
+  }
+
+  final private boolean jj_3R_112() {
+    if (jj_scan_token(EXS)) return true;
     return false;
   }
 
@@ -3384,29 +3493,51 @@
     return false;
   }
 
-  final private boolean jj_3_1() {
-    if (jj_3R_83()) return true;
-    if (jj_3R_84()) return true;
+  final private boolean jj_3R_111() {
+    if (jj_scan_token(EMS)) return true;
     return false;
   }
 
-  final private boolean jj_3R_91() {
-    if (jj_3R_97()) return true;
+  final private boolean jj_3R_109() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_110()) {
+    jj_scanpos = xsp;
+    if (jj_3R_111()) {
+    jj_scanpos = xsp;
+    if (jj_3R_112()) {
+    jj_scanpos = xsp;
+    if (jj_3R_113()) {
+    jj_scanpos = xsp;
+    if (jj_3R_114()) {
+    jj_scanpos = xsp;
+    if (jj_3R_115()) {
+    jj_scanpos = xsp;
+    if (jj_3R_116()) {
+    jj_scanpos = xsp;
+    if (jj_3R_117()) return true;
+    }
+    }
+    }
+    }
+    }
+    }
+    }
     return false;
   }
 
-  final private boolean jj_3R_90() {
-    if (jj_3R_96()) return true;
+  final private boolean jj_3R_110() {
+    if (jj_scan_token(LENGTH)) return true;
     return false;
   }
 
-  final private boolean jj_3R_104() {
-    if (jj_scan_token(ANY)) return true;
+  final private boolean jj_3R_91() {
+    if (jj_3R_97()) return true;
     return false;
   }
 
-  final private boolean jj_3R_89() {
-    if (jj_3R_95()) return true;
+  final private boolean jj_3R_90() {
+    if (jj_3R_96()) return true;
     return false;
   }
 
@@ -3429,6 +3560,17 @@
     return false;
   }
 
+  final private boolean jj_3R_89() {
+    if (jj_3R_95()) return true;
+    return false;
+  }
+
+  final private boolean jj_3_1() {
+    if (jj_3R_83()) return true;
+    if (jj_3R_84()) return true;
+    return false;
+  }
+
   public CssParserTokenManager token_source;
   SimpleCharStream jj_input_stream;
   public Token token, jj_nt;

Index: TokenMgrError.java
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/parser/analyzer/TokenMgrError.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- TokenMgrError.java	22 Jul 2005 09:45:18 -0000	1.4
+++ TokenMgrError.java	8 Sep 2005 12:23:33 -0000	1.5
@@ -32,13 +32,13 @@
     * one of the above 4 values.
     */
    int errorCode;
-   
+
    private int errorLine;
 
    public int getErrorLine() {
 	return errorLine;
    } 
-   
+
    /**
     * Replaces unprintable characters by their espaced (or unicode escaped)
     * equivalents in the given string

Index: CssParser.jj
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/parser/analyzer/CssParser.jj,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- CssParser.jj	8 Aug 2005 13:18:11 -0000	1.14
+++ CssParser.jj	8 Sep 2005 12:23:33 -0000	1.15
@@ -40,7 +40,7 @@
 import org.w3c.css.values.CssFunction;
 import org.w3c.css.values.CssUnicodeRange;
 import org.w3c.css.values.CssResolution;
-import org.w3c.css.properties.CssProperty;
+import org.w3c.css.properties.css1.CssProperty;
 import org.w3c.css.parser.Frame;
 import org.w3c.css.util.ApplContext;
 import org.w3c.css.parser.CssError;
@@ -52,12 +52,28 @@
 import org.w3c.css.parser.AtRulePage;
 import org.w3c.css.parser.AtRulePreference;
 import org.w3c.css.parser.AtRulePhoneticAlphabet;
-import org.w3c.css.svgproperties.AtRuleColorProfile;
+import org.w3c.css.properties.svg.AtRuleColorProfile;
 import org.w3c.css.util.InvalidParamException;
 import org.w3c.css.util.Util;
 import org.w3c.css.util.Messages;
 import org.w3c.css.css.StyleSheetCom;
 
+import org.w3c.css.selectors.AdjacentSelector;
+import org.w3c.css.selectors.AttributeSelector;
+import org.w3c.css.selectors.ChildSelector;
+import org.w3c.css.selectors.ClassSelector;
+import org.w3c.css.selectors.DescendantSelector;
+import org.w3c.css.selectors.IdSelector;
+import org.w3c.css.selectors.TypeSelector;
+import org.w3c.css.selectors.UniversalSelector;
+import org.w3c.css.selectors.attributes.AttributeAny;
+import org.w3c.css.selectors.attributes.AttributeBegin;
+import org.w3c.css.selectors.attributes.AttributeExact;
+import org.w3c.css.selectors.attributes.AttributeOneOf;
+import org.w3c.css.selectors.attributes.AttributeStart;
+import org.w3c.css.selectors.attributes.AttributeSubstr;
+import org.w3c.css.selectors.attributes.AttributeSuffix;
+
 /**
  * A CSS3 parser  
  *
@@ -451,7 +467,7 @@
 <DEFAULT>
 TOKEN :
 {
-  < HASH : "#" <NAME> >
+  < HASH : "#" <IDENT> >
 }
 
 <DEFAULT>
@@ -1135,7 +1151,17 @@
 			    throw new InvalidParamException("nocomb", "~", ac);
                       }
                   } 
-		current.setConnector(comb);
+		  switch(comb) {
+                  case '+': 
+                      current.addAdjacent(new AdjacentSelector());
+                      break;
+                  case '>':
+                      current.addChild(new ChildSelector());
+                      break;
+                  default:
+                      current.addDescendant(new DescendantSelector());
+                  }                  
+                //current.setConnector(comb); 
 	  }
 	 current=simple_selector(current) 
 	 )* ( <S> )*
@@ -1243,8 +1269,9 @@
 /*  "." n=<IDENT> { */
     n=<CLASS> {
       try {
-      	  s.addAttribute("class", convertIdent(n.image.substring(1)),
-	     CssSelectors.ATTRIBUTE_CLASS_SEL); 
+	  s.addClass(new ClassSelector(convertIdent(n.image.substring(1))));
+//        s.addAttribute("class", convertIdent(n.image.substring(1)),
+//           CssSelectors.ATTRIBUTE_CLASS_SEL);
       } catch (InvalidParamException e) {
 	     removeThisRule();
 	     ac.getFrame().addError(new CssError(e));
@@ -1253,33 +1280,55 @@
   
   | n=deprecated_class() {
       if (n.image.charAt(0) == '.') {
-	  n.image = n.image.substring(1);
-	  String cl = "\\" + Integer.toString(n.image.charAt(0), 16);
-	  int len = n.image.length();
-	  if (len != 1) {
-	      int i = 1;
-	      do {
-		  char c = n.image.charAt(i);
-		  if (((c <= 9) && (c >= -1))
-		      || ((c <= 'f') && (c >= 'a'))
-		      || ((c <= 'F') && (c >= 'A'))) {
-		      cl += "\\" + Integer.toString(c, 16);
-		  } else {
-		      break;
-		  }
-	      } while (++i < len);
-	      if (i < len) {
-		  cl += n.image.substring(i);
-	      }
-	  }
-	  addError(new ParseException(ac.getMsg().getString("parser.old_class")),
-		   "To make \"." + n.image + "\" a valid class, CSS2 requires"
-		   + " the first digit to be escaped (\"." + cl + "\")");
-	  try {
-		s.addAttribute("class", cl, CssSelectors.ATTRIBUTE_ONE_OF);
-      	  } catch (InvalidParamException e) {
-	        removeThisRule();
-	        ac.getFrame().addError(new CssError(e));
+n.image = n.image.substring(1);
+          
+          // the class with the first digit escaped
+          String cl = "\\" + Integer.toString(n.image.charAt(0), 16);
+          cl += n.image.substring(1);
+          
+          String profile = ac.getProfile();
+          if(profile == null || profile.equals("")) {
+              profile = ac.getCssVersion(); 
+          }     
+          
+          if(!profile.equals("css1")) {
+              addError(new ParseException(ac.getMsg().getString(
+        	      "parser.old_class")),
+        	      "To make \"." + n.image + "\" a valid class, CSS2" +
+        	      " requires the first digit to be escaped " +
+        	      "(\"." + cl + "\")");
+              s.addClass(new ClassSelector(n.image));                            
+              removeThisRule();              
+          }
+          else {
+              CssLength length = new CssLength();
+              boolean isLength = false;
+              try {              
+        	  length.set(n.image, ac);
+        	  isLength = true;               
+              }
+              catch(Exception e) {
+        	  System.out.println("CssParser._class(): " + e.getClass());
+        	  isLength = false;              
+              }
+              if(isLength) {
+        	  addError(new ParseException(ac.getMsg().getString(
+        	  "parser.class_dim")), n.image);
+        	  s.addClass(new ClassSelector(n.image));                            
+        	  removeThisRule();
+              }        
+              else {
+        	  try {
+        	      // for css > 1, we add the rule to have a context, 
+        	      // and we then remove it
+        	      s.addClass(new ClassSelector(n.image));                      	          	  
+        	      
+        	      ac.getFrame().addWarning("old_class");              
+        	  } catch (InvalidParamException e) {
+        	      ac.getFrame().addError(new CssError(e));
+        	      removeThisRule();
+        	  }
+              }
           }
       } else {
 	  throw new ParseException("Unrecognized ");
@@ -1306,10 +1355,12 @@
 void element_name(CssSelectors s) :
 {Token n; }
 {
-  n=<IDENT> { s.setElement(convertIdent(n.image), ac); }
+  n=<IDENT> { //              s.setElement(convertIdent(n.image), ac);
+      s.addType(new TypeSelector(convertIdent(n.image)));}
   | "*" { 
 		if (!ac.getCssVersion().equals("css1")) {
-		    s.setElement(null); 
+//                  s.setElement(null);
+                    s.addUniversal(new UniversalSelector());
 		} else {
 		    ac.getFrame().addError(new CssError(new InvalidParamException("notversion",
 			"*", ac.getCssVersion(), ac)));
@@ -1345,15 +1396,48 @@
       {
 	  if (selectorType == CssSelectors.ATTRIBUTE_ANY) {
 	      try {
-	      	  s.addAttribute(att.image.toLowerCase(), null, selectorType);
+		  s.addAttribute(new AttributeAny(att.image.toLowerCase()));
+//                s.addAttribute(att.image.toLowerCase(), null, selectorType);
               } catch (InvalidParamException e) {
 	          removeThisRule();
 	          ac.getFrame().addError(new CssError(e));
               }
 	  } else {
+	      AttributeSelector attribute;
+              switch(selectorType) {
+              case CssSelectors.ATTRIBUTE_BEGIN:
+        	  attribute = new AttributeBegin(att.image.toLowerCase(),
+        		  val.image);
+        	  break;
+              case CssSelectors.ATTRIBUTE_EXACT:
+        	  attribute = new AttributeExact(att.image.toLowerCase(),
+        		  val.image);
+        	  break;
+              case CssSelectors.ATTRIBUTE_ONE_OF:
+        	  attribute = new AttributeOneOf(att.image.toLowerCase(),
+        		  val.image);
+        	  break;
+              case CssSelectors.ATTRIBUTE_START:
+        	  attribute = new AttributeStart(att.image.toLowerCase(),
+        		  val.image);
+        	  break;
+              case CssSelectors.ATTRIBUTE_SUBSTR:
+        	  attribute = new AttributeSubstr(att.image.toLowerCase(),
+        		  val.image);
+        	  break;
+              case CssSelectors.ATTRIBUTE_SUFFIX:
+        	  attribute = new AttributeSuffix(att.image.toLowerCase(),
+        		  val.image);
+        	  break;
+              default:
+        	  attribute = new AttributeExact(att.image.toLowerCase(),
+        		  val.image);
+              	  break;
+              }
 	      try {
-	      	  s.addAttribute(att.image.toLowerCase(), val.image, 
-			     selectorType);
+		  s.addAttribute(attribute);
+//	      	  s.addAttribute(att.image.toLowerCase(), val.image, 
+//			     selectorType);
 	      } catch (InvalidParamException e) {
 	     	  removeThisRule();
 	          ac.getFrame().addError(new CssError(e));
@@ -1426,12 +1510,64 @@
 {Token n; }
 {
   n=<HASH>  {
-      try { 
-          s.addAttribute("id", n.image.substring(1), 
-		     CssSelectors.ATTRIBUTE_EXACT); 
-      } catch (InvalidParamException e) {
-	  removeThisRule();
-	  ac.getFrame().addError(new CssError(e));
+      n.image = n.image.substring(1);
+      if(Character.isDigit(n.image.charAt(0))) { 
+	  String profile = ac.getProfile();
+	  if(profile == null || profile.equals("")) {
+	      profile = ac.getCssVersion(); 
+	  }     
+	  
+	  if(!profile.equals("css1")) {
+	      // the id with the first digit escaped
+	      String cl = "\\" + Integer.toString(n.image.charAt(0), 16);
+	      cl += n.image.substring(1);
+	      
+	      addError(new ParseException(ac.getMsg().getString(
+	      	"parser.old_id")),
+	      	"To make \"." + n.image + "\" a valid id, CSS2" +
+	      	" requires the first digit to be escaped " +
+	      	"(\"#" + cl + "\")");
+	      // for css > 1, we add the rule to have a context, 
+	      // and we then remove it
+	      s.addId(new IdSelector(n.image));                            
+	      removeThisRule();              
+	  }
+	  else {
+	      CssLength length = new CssLength();
+	      boolean isLength = false;
+	      try {              
+		  length.set(n.image, ac);
+		  isLength = true;               
+	      }
+	      catch(Exception e) {
+		  System.out.println("CssParser._id(): " + e.getClass());
+		  isLength = false;              
+	      }
+	      if(isLength) {
+		  addError(new ParseException(ac.getMsg().getString(
+		  "parser.id_dim")), n.image);
+		  // we add the rule to have a context, and then we remove it
+		  s.addId(new IdSelector(n.image));                            
+		  removeThisRule();
+	      }        
+	      else {
+		  try {
+		      s.addId(new IdSelector(n.image));      
+		      ac.getFrame().addWarning("old_id");              
+		  } catch (InvalidParamException e) {
+		      ac.getFrame().addError(new CssError(e));
+		      removeThisRule();
+		  }
+	      }
+	  }
+      }
+      else {
+	  try {
+	      s.addId(new IdSelector(n.image));             
+	  } catch (InvalidParamException e) {
+	      ac.getFrame().addError(new CssError(e));
+	      removeThisRule();
+	  }
       }
   }
 }

Index: Couple.java
===================================================================
RCS file: /sources/public/2002/css-validator/org/w3c/css/parser/analyzer/Couple.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- Couple.java	8 Apr 2002 21:24:03 -0000	1.2
+++ Couple.java	8 Sep 2005 12:23:33 -0000	1.3
@@ -4,12 +4,7 @@
 //
 // (c) COPYRIGHT MIT and INRIA, 1997.
 // Please first read the full copyright statement in file COPYRIGHT.html
-/*
- * $Log$
- * Revision 1.2  2002/04/08 21:24:03  plehegar
- * New
- *
- */
+
 package org.w3c.css.parser.analyzer;
 
 import org.w3c.css.values.CssExpression;

Received on Thursday, 8 September 2005 12:24:43 UTC