- From: Yves Lafon via cvs-syncmail <cvsmail@w3.org>
- Date: Mon, 17 Mar 2008 13:41:40 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2002/css-validator/org/w3c/css/parser/analyzer In directory hutz:/tmp/cvs-serv4747 Modified Files: CssParser.jj Log Message: selective case-sensitivity rules, it now catches @Charset, @chArset etc... Added a specific localized error for unknown dimension. skipAfterExpression was looking for the first } or ; instead of skipping every {...} block, making the error recovery in sync with http://www.w3.org/TR/CSS21/syndata.html#parsing-errors -> Malformed declarations. Index: CssParser.jj =================================================================== RCS file: /sources/public/2002/css-validator/org/w3c/css/parser/analyzer/CssParser.jj,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- CssParser.jj 13 Mar 2008 16:54:01 -0000 1.30 +++ CssParser.jj 17 Mar 2008 13:41:38 -0000 1.31 @@ -8,10 +8,10 @@ */ options { - IGNORE_CASE = true; + /* IGNORE_CASE = true; */ STATIC = false; - /* DEBUG_TOKEN_MANAGER = true; - DEBUG_PARSER = true; */ + /* DEBUG_TOKEN_MANAGER = true; + DEBUG_PARSER = true; */ } PARSER_BEGIN(CssParser) @@ -380,7 +380,6 @@ | < #NUM : ( ["0"-"9"] )+ | ( ["0"-"9"] )* "." ( ["0"-"9"] )+ > | < #_STRING : <STRING1> | <STRING2> > | < #_INVALID : <INVALID1> | <INVALID2> > - // FIXME check _URL definition, CSS21 doesn't seem to match | < #_URL : ( [ "!", "#", "$", "%", "&", "*", "+", "-"-"[", "]"-"~" ] | <NONASCII> | <ESCAPE> )* > | < #_S : ( [ " ", "\t" , "\n" , "\r", "\f" ] )+ > | < #_W : ( <_S> )? > @@ -413,7 +412,7 @@ } <DEFAULT> - TOKEN : +TOKEN [IGNORE_CASE] : { < AND : "and" > } @@ -453,19 +452,19 @@ } <DEFAULT> - TOKEN : +TOKEN [IGNORE_CASE] : { < MEDIARESTRICTOR : "only" | "not" > } <DEFAULT> - TOKEN : +TOKEN [IGNORE_CASE] : { < URL : "url(" ( <S> )* ( <STRING> | <_URL> ) ( <S> )* ")" > } <DEFAULT> - TOKEN : +TOKEN [IGNORE_CASE] : { < LENGTH : <NUM> "pt" | <NUM> "mm" @@ -487,13 +486,13 @@ } <DEFAULT> - TOKEN : -{ /* FIXME multiple spaces allowed? */ +TOKEN [IGNORE_CASE] : +{ < IMPORTANT_SYM : "!" ( <_W> )* "important" > } <DEFAULT> - TOKEN : +TOKEN : { <PSEUDOCLASS_SYM : "::" > } @@ -506,7 +505,7 @@ } <DEFAULT> - TOKEN : +TOKEN [IGNORE_CASE] : { < IMPORT_SYM : "@import"> | < MEDIA_SYM : "@media" > @@ -524,9 +523,9 @@ } <DEFAULT> - TOKEN : +TOKEN [IGNORE_CASE] : { - < #RANGE0 : <H> <H> <H> <H> <H> <H> > /* FIXME add <H> to make 6 <H> */ + < #RANGE0 : <H> <H> <H> <H> <H> <H> > | < #RANGE1 : <H> <H> <H> <H> <H> ( "?" )? > | < #RANGE2 : <H> <H> <H> <H> ( "?" )? ( "?" )? > | < #RANGE3 : <H> <H> <H> ( "?" )? ( "?" )? ( "?" )? > @@ -547,7 +546,7 @@ /* FIXED, added a spacial case for lang pseudoclass */ <DEFAULT> - TOKEN: +TOKEN [IGNORE_CASE] : { < FUNCTIONLANG : "lang(" > } @@ -593,9 +592,9 @@ // used as an error recovery for HTML tags in CSS pages ( ( n=<HTMLSTARTTAG> | n=<HTMLENDTAG> ) { addError ( new ParseException(ac.getMsg().getString("generator.dontmixhtml")), n.image); } )* - ( charset() )? - ( <S> | ignoreStatement() )* - ( importDeclaration() ( ignoreStatement() ( <S> )* )* )* + ( charset() ";" )? + ( <S> | <CDO> | <CDC> )* + ( importDeclaration() ( ignoreStatement() ) )* afterImportDeclaration() } catch (TokenMgrError err) { addError (new ParseException(ac.getMsg().getString("generator.unrecognize")), err.getMessage()); @@ -614,7 +613,7 @@ try { // There was * instead of ? in previous versions, but it's useless since // <S> is already a + - charsetToken=<CHARSET_SYM> ( space1Token=<S> )? n=<STRING> ( space2Token=<S> )? <SEMICOLON> + charsetToken=<CHARSET_SYM> ( space1Token=<S> )? n=<STRING> ( space2Token=<S> )? { // the @charset must be at the beginning of the document if(charsetToken.beginLine != 1 || charsetToken.beginColumn != 1) { @@ -664,14 +663,13 @@ addError(e, ret); } } - ) - ( ignoreStatement() ( <S> )* )* )* + ) ignoreStatement() )* } void ignoreStatement() : {} { - <CDO> | <CDC> | atRuleDeclaration() + ( ( <CDO> | <CDC> | atRuleDeclaration() ) ( <S> )* )* } /** @@ -704,7 +702,7 @@ ( <S> )* ( medium(media) ( <COMMA> ( <S> )* medium(media) - )* )? <SEMICOLON> // FIXME why not <SEMICOLON> ? + )* )? <SEMICOLON> ( <S> )* { handleImport(getURL(), importFile, media); @@ -727,10 +725,15 @@ } { try { - <MEDIA_SYM> ( <S> )* (n=<MEDIARESTRICTOR> { newRule.addMediaRestrictor(convertIdent(n.image), ac); } ( <S> )+)? + <MEDIA_SYM> ( <S> )* + // <CSS3> + (n=<MEDIARESTRICTOR> { newRule.addMediaRestrictor(convertIdent(n.image), ac); } ( <S> )+)? medium(newRule) + // </CSS3> ( <COMMA> ( <S> )* medium(newRule) )* + // <CSS3> (<AND> ( <S> )* <RPARAN> ( <S> )* p=mediadeclaration() { newRule.addMediaFeature(p); } <LPARAN> ( <S> )* )* + // </CSS3> { String media = getAtRule().toString(); @@ -798,9 +801,11 @@ } { try { - <PAGE_SYM> ( <S> )* ( n=<IDENT> { newRule.setIdent(convertIdent(n.image)); } - ( <S> )* )? - + <PAGE_SYM> ( <S> )* + // FIXME <CSS3> ? + ( n=<IDENT> { newRule.setIdent(convertIdent(n.image)); } + ( <S> )* )? + // </CSS3> ( pseudo_page(newRule) )? <LBRACE> ( <S> )* ( v=pageContent() { collectv = v; @@ -843,9 +848,11 @@ Vector v = new Vector(); } { + // <CSS3> ?? FIXME v=prefAtRule() { return v;} + // </CSS3> | - v=declarations() { return v;} /* FIXME warning, can match empty */ + v=declarations() { return v;} /* FIXME moved here as it can match empty string */ } Vector prefAtRule() : @@ -1072,10 +1079,9 @@ void operator(CssExpression expr) : {} { - // FIXME ( <DIV> | <COMMA> ) ( <S> )* - ( <DIV> { if (expr.getCount() > 0) expr.setOperator('/'); } + ( ( <DIV> { if (expr.getCount() > 0) expr.setOperator('/'); } | <COMMA> { if (expr.getCount() > 0) expr.setOperator(','); } - ) ( <S> )* + ) ( <S> )* )? } /** @@ -1103,8 +1109,8 @@ char unaryOperator() : {} { - // FIXME <MINUS> | <PLUS> - <MINUS> { return '-'; } + // FIXME <MINUS> | <PLUS> ? warning as <PLUS> is <_W>? "+" + "-" { return '-'; } | <PLUS> { return '+'; } } @@ -1205,7 +1211,7 @@ }*/ currentProperty = null; } - )? )* + )? )* { if (!wrong_value) { addProperty(value_set); @@ -1225,7 +1231,7 @@ { try { current=simple_selector(null) - ( /* FIXME see combinator() */ + ( comb=combinator() { if (ac.getProfile() != null) { if (ac.getProfile().equals("mobile") || @@ -1356,8 +1362,8 @@ ac.getFrame().addError(new CssError(e)); } } - /* FIXME <DOT> n=deprecated_class() ... */ - | n=deprecated_class() { + /* FIXME <DOT> n=deprecated_class() ... ?? (DONE-> to be tested) */ + | <DOT> n=deprecated_class() { if (n.image.charAt(0) == '.') { n.image = n.image.substring(1); @@ -1415,17 +1421,21 @@ } Token deprecated_class() : -{Token n; } { - /* FIXME ( n=<LENGTH> | ... ) { return n;} doesn't work ? */ - n=<LENGTH> { return n; } - | n=<EMS> { return n; } - | n=<EXS> { return n; } - | n=<ANGLE> { return n; } - | n=<TIME> { return n; } - | n=<FREQ> { return n; } - | n=<RESOLUTION> { return n; } - | n=<DIMEN> { return n; } + Token n; +} +{ + ( n=<LENGTH> + | n=<EMS> + | n=<EXS> + | n=<ANGLE> + | n=<TIME> + | n=<FREQ> + | n=<RESOLUTION> + | n=<DIMEN> ) + { + return n; + } } /** @@ -1436,7 +1446,6 @@ { n=<IDENT> { // s.setElement(convertIdent(n.image), ac); s.addType(new TypeSelector(convertIdent(n.image)));} - /* FIXME <ANY> */ | <ANY> { if (!ac.getCssVersion().equals("css1")) { // s.setElement(null); @@ -1459,7 +1468,6 @@ } { <LBRACKET> ( <S> )* att=<IDENT> ( <S> )* - /* FIXME <EQ> */ ( (<EQ> { selectorType = CssSelectors.ATTRIBUTE_EXACT; } | <INCLUDES> { selectorType = CssSelectors.ATTRIBUTE_ONE_OF; } | <DASHMATCH> { selectorType = CssSelectors.ATTRIBUTE_BEGIN; } @@ -1536,7 +1544,6 @@ CssSelectors param = null; } { - /* FIXME declade :: as token */ <PSEUDOCLASS_SYM> ( ( n=<IDENT> { try { @@ -1553,7 +1560,6 @@ } } ) ) | - // FIXME <COLON> <COLON> ( ( n=<IDENT> { try { @@ -1778,7 +1784,7 @@ CssExpression values = new CssExpression(); } { - term(values) ( ( operator(values) )? term(values) )* + term(values) ( operator(values) term(values) )* { return values; } } @@ -1804,7 +1810,7 @@ | n=<RESOLUTION> { setValue(new CssResolution(), exp, operator, n, RESOLUTION); } | n=<DATE> { setValue(new CssDate(), exp, operator, n, DATE); } | n=<DIMEN> { - addError(new ParseException("Unknown dimension"), n.image); } + addError(new ParseException(ac.getMsg().getString("parser.unknown-dimension")), n.image); } | func=function() { setValue(func, exp, operator, null, FUNCTION); } ) ( <S> )* ) | (( n=<STRING> { setValue(new CssString(), exp, operator, n, STRING); } @@ -1835,7 +1841,7 @@ | hexcolor(exp) | n=<URL> { CssURL _u = new CssURL(); - _u.set(n.image.trim(), ac, url); + _u.set(n.image, ac, url); exp.addValue(_u); } | n=<UNICODERANGE> { setValue(new CssUnicodeRange(), exp, operator, n, @@ -1952,7 +1958,8 @@ getNextToken(); tok = getToken(1); } - return s.toString().trim(); + String statement = s.toString().trim(); + return statement; } JAVACODE @@ -1998,16 +2005,37 @@ */ JAVACODE void skipAfterExpression(Exception e) { - Token t = getToken(1); StringBuffer s = new StringBuffer(); s.append(getToken(0).image); - // FIXME same as above (token consumption may throw an exception) - while ((t.kind != RBRACE) && (t.kind != SEMICOLON) && (t.kind != EOF)) { - s.append(t.image); - getNextToken(); - t = getToken(1); + while (true) { + try { + Token t = getToken(1); + if (t.kind == LBRACE) { + s.append(t.image); + getNextToken(); + s.append(skip_to_matching_brace()); + getNextToken(); + t = getToken(1); + continue; + } + if ((t.kind == SEMICOLON) || (t.kind == RBRACE) + || (t.kind == EOF)) { + break; + } + s.append(t.image); + getNextToken(); + t = getToken(1); + } catch (TokenMgrError tmerr) { + try { + s.append(jj_input_stream.readChar()); + continue; + } catch (java.io.IOException ioex) { + ioex.printStackTrace(); + break; + } + } } - + String statement = s.toString().trim(); addError(e, s.toString()); }
Received on Monday, 17 March 2008 13:42:11 UTC