src/main/java/br/com/starcode/parccser/Parser.java
protected PseudoExpression expression() throws ParserException {

        List<Item> items = new ArrayList<Item>();
        StringBuilder sb = new StringBuilder();
        int initialPos = pos;

        if (current == '\'' || current == '"') {
        	//string
        	Character quote = current;
            StringValue s = string();
            sb.append(quote);
            sb.append(s.getContext().toString());
            sb.append(quote);
            items.add(new Item(Type.STRING, s.getActualValue()));

            return new PseudoExpression(items, null, s.getActualValue(), new Context(content, sb.toString(), initialPos, pos));
        } else {

        	while (!end()) {
	            if (current == '+') {
	                items.add(new Item(Type.SIGNAL, "+"));
	                sb.append(current);
	                next();
	            } else if (current == '-') {
	                items.add(new Item(Type.SIGNAL, "-"));
	                sb.append(current);
	                next();
	            } else if (Character.isLetter(current)) {
	                //identifier
	                String ident = simpleIdentifier();
	                sb.append(ident);
	                items.add(new Item(Type.IDENTIFIER, ident));
	            } else if (Character.isDigit(current)) {
	                //number or dimension
	                String number = number();
	                sb.append(number);
	                items.add(new Item(Type.NUMBER, number));
	            } else {
	                break;
	            }
	            ignoreWhitespaces();
	        }

        }
        return new PseudoExpression(items, PseudoExpressionEvaluator.evaluate(items), sb.toString(), new Context(content, sb.toString(), initialPos, pos));

    }
protected PseudoExpression expression() throws ParserException {

        List<Item> items = new ArrayList<Item>();
        StringBuilder sb = new StringBuilder();
        int initialPos = pos;

        if (current == '\'' || current == '"') {
        	//string
        	Character quote = current;
            StringValue s = string();
            sb.append(quote);
            sb.append(s.getContext().toString());
            sb.append(quote);
            items.add(new Item(Type.STRING, s.getActualValue()));

            return new PseudoExpression(items, null, s.getActualValue(), new Context(content, sb.toString(), initialPos, pos));
        } else {

        	while (!end()) {
	            if (current == '+') {
	                items.add(new Item(Type.SIGNAL, "+"));
	                sb.append(current);
	                next();
	            } else if (current == '-') {
	                items.add(new Item(Type.SIGNAL, "-"));
	                sb.append(current);
	                next();
	            } else if (Character.isLetter(current)) {
	                //identifier
	                String ident = simpleIdentifier();
	                sb.append(ident);
	                items.add(new Item(Type.IDENTIFIER, ident));
	            } else if (Character.isDigit(current)) {
	                //number or dimension
	                String number = number();
	                sb.append(number);
	                items.add(new Item(Type.NUMBER, number));
	            } else {
	                break;
	            }
	            ignoreWhitespaces();
	        }

        }
        return new PseudoExpression(items, PseudoExpressionEvaluator.evaluate(items), sb.toString(), new Context(content, sb.toString(), initialPos, pos));

    }
protected PseudoExpression expression ( ) throws ParserException { List < Item > items = new ArrayList < Item > ( ) ; StringBuilder sb = new StringBuilder ( ) ; int initialPos = pos ; if ( current == ' ' || current == ' ' ) { //string
 Character quote = current ; StringValue s = string ( ) ; sb . append ( quote ) ; sb . append ( s . getContext ( ) . toString ( ) ) ; sb . append ( quote ) ; items . add ( new Item ( Type . STRING , s . getActualValue ( ) ) ) ; return new PseudoExpression ( items , null , s . getActualValue ( ) , new Context ( content , sb . toString ( ) , initialPos , pos ) ) ; } else { while ( ! end ( ) ) { if ( current == ' ' ) { items . add ( new Item ( Type . SIGNAL , "+" ) ) ; sb . append ( current ) ; next ( ) ; } else if ( current == ' ' ) { items . add ( new Item ( Type . SIGNAL , "-" ) ) ; sb . append ( current ) ; next ( ) ; } else if ( Character . isLetter ( current ) ) { //identifier
 String ident = simpleIdentifier ( ) ; sb . append ( ident ) ; items . add ( new Item ( Type . IDENTIFIER , ident ) ) ; } else if ( Character . isDigit ( current ) ) { //number or dimension
 String number = number ( ) ; sb . append ( number ) ; items . add ( new Item ( Type . NUMBER , number ) ) ; } else { break ; } ignoreWhitespaces ( ) ; } } return new PseudoExpression ( items , PseudoExpressionEvaluator . evaluate ( items ) , sb . toString ( ) , new Context ( content , sb . toString ( ) , initialPos , pos ) ) ; }
expression
// In CSS3, the expressions are identifiers, strings,
// or of the form "an+b"
: [ [ PLUS | '-' | DIMENSION | NUMBER | STRING | IDENT ] S* ]+

{num}{ident}     return DIMENSION;
{num}            return NUMBER;
expression // In CSS3 the expressions are identifiers strings // or of the form an + b : [ [ PLUS | - | DIMENSION | NUMBER | STRING | IDENT ] S * ] +