All Downloads are FREE. Search and download functionalities are using the official Maven repository.

yale.compiler.compiler.0.9.12.source-code.CSSParser Maven / Gradle / Ivy

The newest version!
// $ANTLR 3.5.2 CSS.g

/*
 *
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

package org.apache.royale.compiler.internal.css;

import java.util.Map;
import java.util.HashMap;
import org.apache.royale.compiler.problems.CSSParserProblem;
import org.apache.royale.compiler.problems.ICompilerProblem;


import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;

import org.antlr.runtime.tree.*;


/**
 * This is a grammar for advanced CSS in Royale. It parses the CSS document and
 * generate DOM objects.
 */
@SuppressWarnings("all")
public class CSSParser extends Parser {
	public static final String[] tokenNames = new String[] {
		"", "", "", "", "ALPHA_VALUE", "ARGUMENTS", "AT_FONT_FACE", 
		"AT_KEYFRAMES", "AT_MEDIA", "AT_NAMESPACE", "AT_WEBKIT_KEYFRAMES", "BEGINS_WITH", 
		"BLOCK_END", "BLOCK_OPEN", "CALC", "CHILD", "CLASS_REFERENCE", "COLON", 
		"COMMA", "COMMENT", "CONTAINS", "DASHED_ID", "DIGIT", "DOT", "DOUBLE_COLON", 
		"EMBED", "ENDS_WITH", "EQUALS", "ESCAPED_HEX", "FORMAT", "FUNCTIONS", 
		"HASH_WORD", "HEX_DIGIT", "HREFLANG_MATCH", "ID", "IMPORTANT", "I_ARRAY", 
		"I_CHILD_SELECTOR", "I_DECL", "I_MEDIUM_CONDITIONS", "I_MULTIVALUE", "I_PRECEDED_SELECTOR", 
		"I_RULE", "I_RULES", "I_SELECTOR", "I_SELECTOR_GROUP", "I_SIBLING_SELECTOR", 
		"I_SIMPLE_SELECTOR", "LETTER", "LIST_MATCH", "LOCAL", "MATRIX3D_VALUE", 
		"MATRIX_VALUE", "NOT", "NULL", "NUMBER", "NUMBER_WITH_PERCENT", "NUMBER_WITH_UNIT", 
		"ONLY", "OPERATOR", "PERCENT", "PIPE", "PRECEDED", "PROPERTY_REFERENCE", 
		"RECT_VALUE", "RGB", "RGBA", "ROTATE_VALUE", "SCALE", "SCALE_VALUE", "SEMI_COLONS", 
		"SQUARE_END", "SQUARE_OPEN", "STAR", "STRING", "STRING_QUOTE", "TILDE", 
		"TRANSLATE3D_VALUE", "URL", "VAR", "WS", "'and'"
	};
	public static final int EOF=-1;
	public static final int T__81=81;
	public static final int ALPHA_VALUE=4;
	public static final int ARGUMENTS=5;
	public static final int AT_FONT_FACE=6;
	public static final int AT_KEYFRAMES=7;
	public static final int AT_MEDIA=8;
	public static final int AT_NAMESPACE=9;
	public static final int AT_WEBKIT_KEYFRAMES=10;
	public static final int BEGINS_WITH=11;
	public static final int BLOCK_END=12;
	public static final int BLOCK_OPEN=13;
	public static final int CALC=14;
	public static final int CHILD=15;
	public static final int CLASS_REFERENCE=16;
	public static final int COLON=17;
	public static final int COMMA=18;
	public static final int COMMENT=19;
	public static final int CONTAINS=20;
	public static final int DASHED_ID=21;
	public static final int DIGIT=22;
	public static final int DOT=23;
	public static final int DOUBLE_COLON=24;
	public static final int EMBED=25;
	public static final int ENDS_WITH=26;
	public static final int EQUALS=27;
	public static final int ESCAPED_HEX=28;
	public static final int FORMAT=29;
	public static final int FUNCTIONS=30;
	public static final int HASH_WORD=31;
	public static final int HEX_DIGIT=32;
	public static final int HREFLANG_MATCH=33;
	public static final int ID=34;
	public static final int IMPORTANT=35;
	public static final int I_ARRAY=36;
	public static final int I_CHILD_SELECTOR=37;
	public static final int I_DECL=38;
	public static final int I_MEDIUM_CONDITIONS=39;
	public static final int I_MULTIVALUE=40;
	public static final int I_PRECEDED_SELECTOR=41;
	public static final int I_RULE=42;
	public static final int I_RULES=43;
	public static final int I_SELECTOR=44;
	public static final int I_SELECTOR_GROUP=45;
	public static final int I_SIBLING_SELECTOR=46;
	public static final int I_SIMPLE_SELECTOR=47;
	public static final int LETTER=48;
	public static final int LIST_MATCH=49;
	public static final int LOCAL=50;
	public static final int MATRIX3D_VALUE=51;
	public static final int MATRIX_VALUE=52;
	public static final int NOT=53;
	public static final int NULL=54;
	public static final int NUMBER=55;
	public static final int NUMBER_WITH_PERCENT=56;
	public static final int NUMBER_WITH_UNIT=57;
	public static final int ONLY=58;
	public static final int OPERATOR=59;
	public static final int PERCENT=60;
	public static final int PIPE=61;
	public static final int PRECEDED=62;
	public static final int PROPERTY_REFERENCE=63;
	public static final int RECT_VALUE=64;
	public static final int RGB=65;
	public static final int RGBA=66;
	public static final int ROTATE_VALUE=67;
	public static final int SCALE=68;
	public static final int SCALE_VALUE=69;
	public static final int SEMI_COLONS=70;
	public static final int SQUARE_END=71;
	public static final int SQUARE_OPEN=72;
	public static final int STAR=73;
	public static final int STRING=74;
	public static final int STRING_QUOTE=75;
	public static final int TILDE=76;
	public static final int TRANSLATE3D_VALUE=77;
	public static final int URL=78;
	public static final int VAR=79;
	public static final int WS=80;

	// delegates
	public Parser[] getDelegates() {
		return new Parser[] {};
	}

	// delegators


	public CSSParser(TokenStream input) {
		this(input, new RecognizerSharedState());
	}
	public CSSParser(TokenStream input, RecognizerSharedState state) {
		super(input, state);
	}

	protected TreeAdaptor adaptor = new CommonTreeAdaptor();

	public void setTreeAdaptor(TreeAdaptor adaptor) {
		this.adaptor = adaptor;
	}
	public TreeAdaptor getTreeAdaptor() {
		return adaptor;
	}
	@Override public String[] getTokenNames() { return CSSParser.tokenNames; }
	@Override public String getGrammarFileName() { return "CSS.g"; }



	/**
	 * Parser problems.
	 */
	protected List problems = new ArrayList();

	/**
	 * Collect parser problems.
	 */
	@Override
	public void displayRecognitionError(String[] tokenNames, RecognitionException e)
	{
	    problems.add(CSSParserProblem.create(this, tokenNames, e));
	}

	/**
	 * Check if the cursor is at the end of a simple selector.
	 * @return -1 if not end
	 * @return 0 if end
	 * @return 1 if ended by Child combinator
	 * @return 2 if ended by Preceded combinator
	 * @return 3 if ended by Sibling combinator
	 */
	private final int endOfSimpleSelector()
	{
	    final CommonToken nextToken = (CommonToken) getTokenStream().LT(1);
	    if (nextToken == null)
	        return 0;
	    
	    final int nextType = nextToken.getType();

	    if (nextType == CHILD) 
	    { 
	        getTokenStream().consume();
	        return 1;
	    }
	    if (nextType == PRECEDED)
	    {
	        getTokenStream().consume();
	        return 2;
	    }
	    if (nextType == TILDE)
	    {
	        getTokenStream().consume();
	        return 3;
	    }

	    // Check if there's white space between the previous token and the next token.
	    final CommonToken lastToken = (CommonToken) getTokenStream().LT(-1);
	    if (lastToken != null)
	    {
	        final int lastType = lastToken.getType();
	        if (lastType == CHILD)
	        {
	            return 1;
	        }
	        if (lastType == PRECEDED)
	        {
	            return 2;
	        }
	        if (lastType == TILDE)
	        {
	            return 3;
	        }
	        if (nextToken != null)
	        {
	            final int lastStop = lastToken.getStopIndex();
	            final int nextStart = nextToken.getStartIndex();
	            if (lastStop + 1 < nextStart)
	            {
	                return 0;
	            }
	        }
	    }

	    
	    // If the next token is "{" or ",", it's also end of a selector.
	    if (nextType == BLOCK_OPEN || nextType == COMMA)
	    {
	        return 0;
	    }

	    
	    // If the next token is the end of the input, it's also end of a selector.
	    if (nextType == EOF)
	    {
	        return 0;
	    }
	    
	    return -1;
	}



	public static class stylesheet_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "stylesheet"
	// CSS.g:193:1: stylesheet : ( namespaceStatement | fontFace | keyframes | mediaQuery | ruleset )* EOF ;
	public final CSSParser.stylesheet_return stylesheet() throws RecognitionException {
		CSSParser.stylesheet_return retval = new CSSParser.stylesheet_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token EOF6=null;
		ParserRuleReturnScope namespaceStatement1 =null;
		ParserRuleReturnScope fontFace2 =null;
		ParserRuleReturnScope keyframes3 =null;
		ParserRuleReturnScope mediaQuery4 =null;
		ParserRuleReturnScope ruleset5 =null;

		Object EOF6_tree=null;

		try {
			// CSS.g:194:5: ( ( namespaceStatement | fontFace | keyframes | mediaQuery | ruleset )* EOF )
			// CSS.g:194:9: ( namespaceStatement | fontFace | keyframes | mediaQuery | ruleset )* EOF
			{
			root_0 = (Object)adaptor.nil();


			// CSS.g:194:9: ( namespaceStatement | fontFace | keyframes | mediaQuery | ruleset )*
			loop1:
			while (true) {
				int alt1=6;
				switch ( input.LA(1) ) {
				case AT_NAMESPACE:
					{
					alt1=1;
					}
					break;
				case AT_FONT_FACE:
					{
					alt1=2;
					}
					break;
				case AT_KEYFRAMES:
				case AT_WEBKIT_KEYFRAMES:
					{
					alt1=3;
					}
					break;
				case AT_MEDIA:
					{
					alt1=4;
					}
					break;
				case COLON:
				case DOT:
				case DOUBLE_COLON:
				case HASH_WORD:
				case ID:
				case NUMBER_WITH_PERCENT:
				case SQUARE_OPEN:
				case STAR:
					{
					alt1=5;
					}
					break;
				}
				switch (alt1) {
				case 1 :
					// CSS.g:194:11: namespaceStatement
					{
					pushFollow(FOLLOW_namespaceStatement_in_stylesheet149);
					namespaceStatement1=namespaceStatement();
					state._fsp--;

					adaptor.addChild(root_0, namespaceStatement1.getTree());

					}
					break;
				case 2 :
					// CSS.g:194:32: fontFace
					{
					pushFollow(FOLLOW_fontFace_in_stylesheet153);
					fontFace2=fontFace();
					state._fsp--;

					adaptor.addChild(root_0, fontFace2.getTree());

					}
					break;
				case 3 :
					// CSS.g:194:43: keyframes
					{
					pushFollow(FOLLOW_keyframes_in_stylesheet157);
					keyframes3=keyframes();
					state._fsp--;

					adaptor.addChild(root_0, keyframes3.getTree());

					}
					break;
				case 4 :
					// CSS.g:194:55: mediaQuery
					{
					pushFollow(FOLLOW_mediaQuery_in_stylesheet161);
					mediaQuery4=mediaQuery();
					state._fsp--;

					adaptor.addChild(root_0, mediaQuery4.getTree());

					}
					break;
				case 5 :
					// CSS.g:194:68: ruleset
					{
					pushFollow(FOLLOW_ruleset_in_stylesheet165);
					ruleset5=ruleset();
					state._fsp--;

					adaptor.addChild(root_0, ruleset5.getTree());

					}
					break;

				default :
					break loop1;
				}
			}

			EOF6=(Token)match(input,EOF,FOLLOW_EOF_in_stylesheet170); 
			EOF6_tree = (Object)adaptor.create(EOF6);
			adaptor.addChild(root_0, EOF6_tree);

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "stylesheet"


	public static class namespaceStatement_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "namespaceStatement"
	// CSS.g:206:1: namespaceStatement : AT_NAMESPACE ( ID )? STRING SEMI_COLONS -> ^( AT_NAMESPACE ( ID )? STRING ) ;
	public final CSSParser.namespaceStatement_return namespaceStatement() throws RecognitionException {
		CSSParser.namespaceStatement_return retval = new CSSParser.namespaceStatement_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token AT_NAMESPACE7=null;
		Token ID8=null;
		Token STRING9=null;
		Token SEMI_COLONS10=null;

		Object AT_NAMESPACE7_tree=null;
		Object ID8_tree=null;
		Object STRING9_tree=null;
		Object SEMI_COLONS10_tree=null;
		RewriteRuleTokenStream stream_STRING=new RewriteRuleTokenStream(adaptor,"token STRING");
		RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
		RewriteRuleTokenStream stream_SEMI_COLONS=new RewriteRuleTokenStream(adaptor,"token SEMI_COLONS");
		RewriteRuleTokenStream stream_AT_NAMESPACE=new RewriteRuleTokenStream(adaptor,"token AT_NAMESPACE");

		try {
			// CSS.g:207:5: ( AT_NAMESPACE ( ID )? STRING SEMI_COLONS -> ^( AT_NAMESPACE ( ID )? STRING ) )
			// CSS.g:207:9: AT_NAMESPACE ( ID )? STRING SEMI_COLONS
			{
			AT_NAMESPACE7=(Token)match(input,AT_NAMESPACE,FOLLOW_AT_NAMESPACE_in_namespaceStatement191);  
			stream_AT_NAMESPACE.add(AT_NAMESPACE7);

			// CSS.g:207:22: ( ID )?
			int alt2=2;
			int LA2_0 = input.LA(1);
			if ( (LA2_0==ID) ) {
				alt2=1;
			}
			switch (alt2) {
				case 1 :
					// CSS.g:207:22: ID
					{
					ID8=(Token)match(input,ID,FOLLOW_ID_in_namespaceStatement193);  
					stream_ID.add(ID8);

					}
					break;

			}

			STRING9=(Token)match(input,STRING,FOLLOW_STRING_in_namespaceStatement196);  
			stream_STRING.add(STRING9);

			SEMI_COLONS10=(Token)match(input,SEMI_COLONS,FOLLOW_SEMI_COLONS_in_namespaceStatement198);  
			stream_SEMI_COLONS.add(SEMI_COLONS10);

			// AST REWRITE
			// elements: AT_NAMESPACE, ID, STRING
			// token labels: 
			// rule labels: retval
			// token list labels: 
			// rule list labels: 
			// wildcard labels: 
			retval.tree = root_0;
			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

			root_0 = (Object)adaptor.nil();
			// 208:6: -> ^( AT_NAMESPACE ( ID )? STRING )
			{
				// CSS.g:208:9: ^( AT_NAMESPACE ( ID )? STRING )
				{
				Object root_1 = (Object)adaptor.nil();
				root_1 = (Object)adaptor.becomeRoot(stream_AT_NAMESPACE.nextNode(), root_1);
				// CSS.g:208:24: ( ID )?
				if ( stream_ID.hasNext() ) {
					adaptor.addChild(root_1, stream_ID.nextNode());
				}
				stream_ID.reset();

				adaptor.addChild(root_1, stream_STRING.nextNode());
				adaptor.addChild(root_0, root_1);
				}

			}


			retval.tree = root_0;

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "namespaceStatement"


	public static class keyframes_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "keyframes"
	// CSS.g:219:1: keyframes : ( AT_KEYFRAMES ID BLOCK_OPEN ( ruleset )* BLOCK_END -> ^( AT_KEYFRAMES ID ( ruleset )* ) | AT_WEBKIT_KEYFRAMES ID BLOCK_OPEN ( ruleset )* BLOCK_END -> ^( AT_WEBKIT_KEYFRAMES ID ( ruleset )* ) );
	public final CSSParser.keyframes_return keyframes() throws RecognitionException {
		CSSParser.keyframes_return retval = new CSSParser.keyframes_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token AT_KEYFRAMES11=null;
		Token ID12=null;
		Token BLOCK_OPEN13=null;
		Token BLOCK_END15=null;
		Token AT_WEBKIT_KEYFRAMES16=null;
		Token ID17=null;
		Token BLOCK_OPEN18=null;
		Token BLOCK_END20=null;
		ParserRuleReturnScope ruleset14 =null;
		ParserRuleReturnScope ruleset19 =null;

		Object AT_KEYFRAMES11_tree=null;
		Object ID12_tree=null;
		Object BLOCK_OPEN13_tree=null;
		Object BLOCK_END15_tree=null;
		Object AT_WEBKIT_KEYFRAMES16_tree=null;
		Object ID17_tree=null;
		Object BLOCK_OPEN18_tree=null;
		Object BLOCK_END20_tree=null;
		RewriteRuleTokenStream stream_BLOCK_OPEN=new RewriteRuleTokenStream(adaptor,"token BLOCK_OPEN");
		RewriteRuleTokenStream stream_BLOCK_END=new RewriteRuleTokenStream(adaptor,"token BLOCK_END");
		RewriteRuleTokenStream stream_AT_WEBKIT_KEYFRAMES=new RewriteRuleTokenStream(adaptor,"token AT_WEBKIT_KEYFRAMES");
		RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
		RewriteRuleTokenStream stream_AT_KEYFRAMES=new RewriteRuleTokenStream(adaptor,"token AT_KEYFRAMES");
		RewriteRuleSubtreeStream stream_ruleset=new RewriteRuleSubtreeStream(adaptor,"rule ruleset");

		try {
			// CSS.g:220:5: ( AT_KEYFRAMES ID BLOCK_OPEN ( ruleset )* BLOCK_END -> ^( AT_KEYFRAMES ID ( ruleset )* ) | AT_WEBKIT_KEYFRAMES ID BLOCK_OPEN ( ruleset )* BLOCK_END -> ^( AT_WEBKIT_KEYFRAMES ID ( ruleset )* ) )
			int alt5=2;
			int LA5_0 = input.LA(1);
			if ( (LA5_0==AT_KEYFRAMES) ) {
				alt5=1;
			}
			else if ( (LA5_0==AT_WEBKIT_KEYFRAMES) ) {
				alt5=2;
			}

			else {
				NoViableAltException nvae =
					new NoViableAltException("", 5, 0, input);
				throw nvae;
			}

			switch (alt5) {
				case 1 :
					// CSS.g:220:9: AT_KEYFRAMES ID BLOCK_OPEN ( ruleset )* BLOCK_END
					{
					AT_KEYFRAMES11=(Token)match(input,AT_KEYFRAMES,FOLLOW_AT_KEYFRAMES_in_keyframes241);  
					stream_AT_KEYFRAMES.add(AT_KEYFRAMES11);

					ID12=(Token)match(input,ID,FOLLOW_ID_in_keyframes243);  
					stream_ID.add(ID12);

					BLOCK_OPEN13=(Token)match(input,BLOCK_OPEN,FOLLOW_BLOCK_OPEN_in_keyframes245);  
					stream_BLOCK_OPEN.add(BLOCK_OPEN13);

					// CSS.g:220:36: ( ruleset )*
					loop3:
					while (true) {
						int alt3=2;
						int LA3_0 = input.LA(1);
						if ( (LA3_0==COLON||(LA3_0 >= DOT && LA3_0 <= DOUBLE_COLON)||LA3_0==HASH_WORD||LA3_0==ID||LA3_0==NUMBER_WITH_PERCENT||(LA3_0 >= SQUARE_OPEN && LA3_0 <= STAR)) ) {
							alt3=1;
						}

						switch (alt3) {
						case 1 :
							// CSS.g:220:36: ruleset
							{
							pushFollow(FOLLOW_ruleset_in_keyframes247);
							ruleset14=ruleset();
							state._fsp--;

							stream_ruleset.add(ruleset14.getTree());
							}
							break;

						default :
							break loop3;
						}
					}

					BLOCK_END15=(Token)match(input,BLOCK_END,FOLLOW_BLOCK_END_in_keyframes250);  
					stream_BLOCK_END.add(BLOCK_END15);

					// AST REWRITE
					// elements: ruleset, ID, AT_KEYFRAMES
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (Object)adaptor.nil();
					// 221:6: -> ^( AT_KEYFRAMES ID ( ruleset )* )
					{
						// CSS.g:221:9: ^( AT_KEYFRAMES ID ( ruleset )* )
						{
						Object root_1 = (Object)adaptor.nil();
						root_1 = (Object)adaptor.becomeRoot(stream_AT_KEYFRAMES.nextNode(), root_1);
						adaptor.addChild(root_1, stream_ID.nextNode());
						// CSS.g:221:27: ( ruleset )*
						while ( stream_ruleset.hasNext() ) {
							adaptor.addChild(root_1, stream_ruleset.nextTree());
						}
						stream_ruleset.reset();

						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;
				case 2 :
					// CSS.g:222:9: AT_WEBKIT_KEYFRAMES ID BLOCK_OPEN ( ruleset )* BLOCK_END
					{
					AT_WEBKIT_KEYFRAMES16=(Token)match(input,AT_WEBKIT_KEYFRAMES,FOLLOW_AT_WEBKIT_KEYFRAMES_in_keyframes276);  
					stream_AT_WEBKIT_KEYFRAMES.add(AT_WEBKIT_KEYFRAMES16);

					ID17=(Token)match(input,ID,FOLLOW_ID_in_keyframes278);  
					stream_ID.add(ID17);

					BLOCK_OPEN18=(Token)match(input,BLOCK_OPEN,FOLLOW_BLOCK_OPEN_in_keyframes280);  
					stream_BLOCK_OPEN.add(BLOCK_OPEN18);

					// CSS.g:222:43: ( ruleset )*
					loop4:
					while (true) {
						int alt4=2;
						int LA4_0 = input.LA(1);
						if ( (LA4_0==COLON||(LA4_0 >= DOT && LA4_0 <= DOUBLE_COLON)||LA4_0==HASH_WORD||LA4_0==ID||LA4_0==NUMBER_WITH_PERCENT||(LA4_0 >= SQUARE_OPEN && LA4_0 <= STAR)) ) {
							alt4=1;
						}

						switch (alt4) {
						case 1 :
							// CSS.g:222:43: ruleset
							{
							pushFollow(FOLLOW_ruleset_in_keyframes282);
							ruleset19=ruleset();
							state._fsp--;

							stream_ruleset.add(ruleset19.getTree());
							}
							break;

						default :
							break loop4;
						}
					}

					BLOCK_END20=(Token)match(input,BLOCK_END,FOLLOW_BLOCK_END_in_keyframes285);  
					stream_BLOCK_END.add(BLOCK_END20);

					// AST REWRITE
					// elements: AT_WEBKIT_KEYFRAMES, ID, ruleset
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (Object)adaptor.nil();
					// 223:6: -> ^( AT_WEBKIT_KEYFRAMES ID ( ruleset )* )
					{
						// CSS.g:223:9: ^( AT_WEBKIT_KEYFRAMES ID ( ruleset )* )
						{
						Object root_1 = (Object)adaptor.nil();
						root_1 = (Object)adaptor.becomeRoot(stream_AT_WEBKIT_KEYFRAMES.nextNode(), root_1);
						adaptor.addChild(root_1, stream_ID.nextNode());
						// CSS.g:223:34: ( ruleset )*
						while ( stream_ruleset.hasNext() ) {
							adaptor.addChild(root_1, stream_ruleset.nextTree());
						}
						stream_ruleset.reset();

						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;

			}
			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "keyframes"


	public static class mediaQuery_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "mediaQuery"
	// CSS.g:234:1: mediaQuery : AT_MEDIA medium BLOCK_OPEN ( ruleset )* BLOCK_END -> ^( AT_MEDIA medium ( ruleset )* ) ;
	public final CSSParser.mediaQuery_return mediaQuery() throws RecognitionException {
		CSSParser.mediaQuery_return retval = new CSSParser.mediaQuery_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token AT_MEDIA21=null;
		Token BLOCK_OPEN23=null;
		Token BLOCK_END25=null;
		ParserRuleReturnScope medium22 =null;
		ParserRuleReturnScope ruleset24 =null;

		Object AT_MEDIA21_tree=null;
		Object BLOCK_OPEN23_tree=null;
		Object BLOCK_END25_tree=null;
		RewriteRuleTokenStream stream_BLOCK_OPEN=new RewriteRuleTokenStream(adaptor,"token BLOCK_OPEN");
		RewriteRuleTokenStream stream_BLOCK_END=new RewriteRuleTokenStream(adaptor,"token BLOCK_END");
		RewriteRuleTokenStream stream_AT_MEDIA=new RewriteRuleTokenStream(adaptor,"token AT_MEDIA");
		RewriteRuleSubtreeStream stream_ruleset=new RewriteRuleSubtreeStream(adaptor,"rule ruleset");
		RewriteRuleSubtreeStream stream_medium=new RewriteRuleSubtreeStream(adaptor,"rule medium");

		try {
			// CSS.g:235:5: ( AT_MEDIA medium BLOCK_OPEN ( ruleset )* BLOCK_END -> ^( AT_MEDIA medium ( ruleset )* ) )
			// CSS.g:235:9: AT_MEDIA medium BLOCK_OPEN ( ruleset )* BLOCK_END
			{
			AT_MEDIA21=(Token)match(input,AT_MEDIA,FOLLOW_AT_MEDIA_in_mediaQuery324);  
			stream_AT_MEDIA.add(AT_MEDIA21);

			pushFollow(FOLLOW_medium_in_mediaQuery326);
			medium22=medium();
			state._fsp--;

			stream_medium.add(medium22.getTree());
			BLOCK_OPEN23=(Token)match(input,BLOCK_OPEN,FOLLOW_BLOCK_OPEN_in_mediaQuery328);  
			stream_BLOCK_OPEN.add(BLOCK_OPEN23);

			// CSS.g:235:36: ( ruleset )*
			loop6:
			while (true) {
				int alt6=2;
				int LA6_0 = input.LA(1);
				if ( (LA6_0==COLON||(LA6_0 >= DOT && LA6_0 <= DOUBLE_COLON)||LA6_0==HASH_WORD||LA6_0==ID||LA6_0==NUMBER_WITH_PERCENT||(LA6_0 >= SQUARE_OPEN && LA6_0 <= STAR)) ) {
					alt6=1;
				}

				switch (alt6) {
				case 1 :
					// CSS.g:235:36: ruleset
					{
					pushFollow(FOLLOW_ruleset_in_mediaQuery330);
					ruleset24=ruleset();
					state._fsp--;

					stream_ruleset.add(ruleset24.getTree());
					}
					break;

				default :
					break loop6;
				}
			}

			BLOCK_END25=(Token)match(input,BLOCK_END,FOLLOW_BLOCK_END_in_mediaQuery333);  
			stream_BLOCK_END.add(BLOCK_END25);

			// AST REWRITE
			// elements: AT_MEDIA, ruleset, medium
			// token labels: 
			// rule labels: retval
			// token list labels: 
			// rule list labels: 
			// wildcard labels: 
			retval.tree = root_0;
			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

			root_0 = (Object)adaptor.nil();
			// 236:6: -> ^( AT_MEDIA medium ( ruleset )* )
			{
				// CSS.g:236:9: ^( AT_MEDIA medium ( ruleset )* )
				{
				Object root_1 = (Object)adaptor.nil();
				root_1 = (Object)adaptor.becomeRoot(stream_AT_MEDIA.nextNode(), root_1);
				adaptor.addChild(root_1, stream_medium.nextTree());
				// CSS.g:236:27: ( ruleset )*
				while ( stream_ruleset.hasNext() ) {
					adaptor.addChild(root_1, stream_ruleset.nextTree());
				}
				stream_ruleset.reset();

				adaptor.addChild(root_0, root_1);
				}

			}


			retval.tree = root_0;

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "mediaQuery"


	public static class medium_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "medium"
	// CSS.g:243:1: medium : mediumCondition ( 'and' mediumCondition | mediumCondition )* -> ^( I_MEDIUM_CONDITIONS ( mediumCondition )* ) ;
	public final CSSParser.medium_return medium() throws RecognitionException {
		CSSParser.medium_return retval = new CSSParser.medium_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token string_literal27=null;
		ParserRuleReturnScope mediumCondition26 =null;
		ParserRuleReturnScope mediumCondition28 =null;
		ParserRuleReturnScope mediumCondition29 =null;

		Object string_literal27_tree=null;
		RewriteRuleTokenStream stream_81=new RewriteRuleTokenStream(adaptor,"token 81");
		RewriteRuleSubtreeStream stream_mediumCondition=new RewriteRuleSubtreeStream(adaptor,"rule mediumCondition");

		try {
			// CSS.g:244:5: ( mediumCondition ( 'and' mediumCondition | mediumCondition )* -> ^( I_MEDIUM_CONDITIONS ( mediumCondition )* ) )
			// CSS.g:244:9: mediumCondition ( 'and' mediumCondition | mediumCondition )*
			{
			pushFollow(FOLLOW_mediumCondition_in_medium373);
			mediumCondition26=mediumCondition();
			state._fsp--;

			stream_mediumCondition.add(mediumCondition26.getTree());
			// CSS.g:245:9: ( 'and' mediumCondition | mediumCondition )*
			loop7:
			while (true) {
				int alt7=3;
				int LA7_0 = input.LA(1);
				if ( (LA7_0==81) ) {
					alt7=1;
				}
				else if ( (LA7_0==ARGUMENTS||LA7_0==COMMA||LA7_0==ID||LA7_0==ONLY) ) {
					alt7=2;
				}

				switch (alt7) {
				case 1 :
					// CSS.g:247:13: 'and' mediumCondition
					{
					string_literal27=(Token)match(input,81,FOLLOW_81_in_medium416);  
					stream_81.add(string_literal27);

					pushFollow(FOLLOW_mediumCondition_in_medium431);
					mediumCondition28=mediumCondition();
					state._fsp--;

					stream_mediumCondition.add(mediumCondition28.getTree());
					}
					break;
				case 2 :
					// CSS.g:249:15: mediumCondition
					{
					pushFollow(FOLLOW_mediumCondition_in_medium447);
					mediumCondition29=mediumCondition();
					state._fsp--;

					stream_mediumCondition.add(mediumCondition29.getTree());
					}
					break;

				default :
					break loop7;
				}
			}

			// AST REWRITE
			// elements: mediumCondition
			// token labels: 
			// rule labels: retval
			// token list labels: 
			// rule list labels: 
			// wildcard labels: 
			retval.tree = root_0;
			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

			root_0 = (Object)adaptor.nil();
			// 251:9: -> ^( I_MEDIUM_CONDITIONS ( mediumCondition )* )
			{
				// CSS.g:251:12: ^( I_MEDIUM_CONDITIONS ( mediumCondition )* )
				{
				Object root_1 = (Object)adaptor.nil();
				root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(I_MEDIUM_CONDITIONS, "I_MEDIUM_CONDITIONS"), root_1);
				// CSS.g:251:34: ( mediumCondition )*
				while ( stream_mediumCondition.hasNext() ) {
					adaptor.addChild(root_1, stream_mediumCondition.nextTree());
				}
				stream_mediumCondition.reset();

				adaptor.addChild(root_0, root_1);
				}

			}


			retval.tree = root_0;

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "medium"


	public static class mediumCondition_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "mediumCondition"
	// CSS.g:258:1: mediumCondition : ( ID | ONLY ID | ARGUMENTS | COMMA );
	public final CSSParser.mediumCondition_return mediumCondition() throws RecognitionException {
		CSSParser.mediumCondition_return retval = new CSSParser.mediumCondition_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token ID30=null;
		Token ONLY31=null;
		Token ID32=null;
		Token ARGUMENTS33=null;
		Token COMMA34=null;

		Object ID30_tree=null;
		Object ONLY31_tree=null;
		Object ID32_tree=null;
		Object ARGUMENTS33_tree=null;
		Object COMMA34_tree=null;

		try {
			// CSS.g:259:5: ( ID | ONLY ID | ARGUMENTS | COMMA )
			int alt8=4;
			switch ( input.LA(1) ) {
			case ID:
				{
				alt8=1;
				}
				break;
			case ONLY:
				{
				alt8=2;
				}
				break;
			case ARGUMENTS:
				{
				alt8=3;
				}
				break;
			case COMMA:
				{
				alt8=4;
				}
				break;
			default:
				NoViableAltException nvae =
					new NoViableAltException("", 8, 0, input);
				throw nvae;
			}
			switch (alt8) {
				case 1 :
					// CSS.g:259:9: ID
					{
					root_0 = (Object)adaptor.nil();


					ID30=(Token)match(input,ID,FOLLOW_ID_in_mediumCondition498); 
					ID30_tree = (Object)adaptor.create(ID30);
					adaptor.addChild(root_0, ID30_tree);

					}
					break;
				case 2 :
					// CSS.g:260:9: ONLY ID
					{
					root_0 = (Object)adaptor.nil();


					ONLY31=(Token)match(input,ONLY,FOLLOW_ONLY_in_mediumCondition508); 
					ONLY31_tree = (Object)adaptor.create(ONLY31);
					adaptor.addChild(root_0, ONLY31_tree);

					ID32=(Token)match(input,ID,FOLLOW_ID_in_mediumCondition510); 
					ID32_tree = (Object)adaptor.create(ID32);
					adaptor.addChild(root_0, ID32_tree);

					}
					break;
				case 3 :
					// CSS.g:261:9: ARGUMENTS
					{
					root_0 = (Object)adaptor.nil();


					ARGUMENTS33=(Token)match(input,ARGUMENTS,FOLLOW_ARGUMENTS_in_mediumCondition524); 
					ARGUMENTS33_tree = (Object)adaptor.create(ARGUMENTS33);
					adaptor.addChild(root_0, ARGUMENTS33_tree);

					}
					break;
				case 4 :
					// CSS.g:262:9: COMMA
					{
					root_0 = (Object)adaptor.nil();


					COMMA34=(Token)match(input,COMMA,FOLLOW_COMMA_in_mediumCondition534); 
					COMMA34_tree = (Object)adaptor.create(COMMA34);
					adaptor.addChild(root_0, COMMA34_tree);

					}
					break;

			}
			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "mediumCondition"


	public static class fontFace_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "fontFace"
	// CSS.g:276:1: fontFace : AT_FONT_FACE declarationsBlock -> ^( AT_FONT_FACE declarationsBlock ) ;
	public final CSSParser.fontFace_return fontFace() throws RecognitionException {
		CSSParser.fontFace_return retval = new CSSParser.fontFace_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token AT_FONT_FACE35=null;
		ParserRuleReturnScope declarationsBlock36 =null;

		Object AT_FONT_FACE35_tree=null;
		RewriteRuleTokenStream stream_AT_FONT_FACE=new RewriteRuleTokenStream(adaptor,"token AT_FONT_FACE");
		RewriteRuleSubtreeStream stream_declarationsBlock=new RewriteRuleSubtreeStream(adaptor,"rule declarationsBlock");

		try {
			// CSS.g:277:5: ( AT_FONT_FACE declarationsBlock -> ^( AT_FONT_FACE declarationsBlock ) )
			// CSS.g:277:9: AT_FONT_FACE declarationsBlock
			{
			AT_FONT_FACE35=(Token)match(input,AT_FONT_FACE,FOLLOW_AT_FONT_FACE_in_fontFace563);  
			stream_AT_FONT_FACE.add(AT_FONT_FACE35);

			pushFollow(FOLLOW_declarationsBlock_in_fontFace565);
			declarationsBlock36=declarationsBlock();
			state._fsp--;

			stream_declarationsBlock.add(declarationsBlock36.getTree());
			// AST REWRITE
			// elements: AT_FONT_FACE, declarationsBlock
			// token labels: 
			// rule labels: retval
			// token list labels: 
			// rule list labels: 
			// wildcard labels: 
			retval.tree = root_0;
			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

			root_0 = (Object)adaptor.nil();
			// 277:40: -> ^( AT_FONT_FACE declarationsBlock )
			{
				// CSS.g:277:43: ^( AT_FONT_FACE declarationsBlock )
				{
				Object root_1 = (Object)adaptor.nil();
				root_1 = (Object)adaptor.becomeRoot(stream_AT_FONT_FACE.nextNode(), root_1);
				adaptor.addChild(root_1, stream_declarationsBlock.nextTree());
				adaptor.addChild(root_0, root_1);
				}

			}


			retval.tree = root_0;

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "fontFace"


	public static class ruleset_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "ruleset"
	// CSS.g:283:1: ruleset : selectorGroup declarationsBlock -> ^( I_RULE selectorGroup declarationsBlock ) ;
	public final CSSParser.ruleset_return ruleset() throws RecognitionException {
		CSSParser.ruleset_return retval = new CSSParser.ruleset_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		ParserRuleReturnScope selectorGroup37 =null;
		ParserRuleReturnScope declarationsBlock38 =null;

		RewriteRuleSubtreeStream stream_selectorGroup=new RewriteRuleSubtreeStream(adaptor,"rule selectorGroup");
		RewriteRuleSubtreeStream stream_declarationsBlock=new RewriteRuleSubtreeStream(adaptor,"rule declarationsBlock");

		try {
			// CSS.g:284:5: ( selectorGroup declarationsBlock -> ^( I_RULE selectorGroup declarationsBlock ) )
			// CSS.g:284:9: selectorGroup declarationsBlock
			{
			pushFollow(FOLLOW_selectorGroup_in_ruleset596);
			selectorGroup37=selectorGroup();
			state._fsp--;

			stream_selectorGroup.add(selectorGroup37.getTree());
			pushFollow(FOLLOW_declarationsBlock_in_ruleset598);
			declarationsBlock38=declarationsBlock();
			state._fsp--;

			stream_declarationsBlock.add(declarationsBlock38.getTree());
			// AST REWRITE
			// elements: selectorGroup, declarationsBlock
			// token labels: 
			// rule labels: retval
			// token list labels: 
			// rule list labels: 
			// wildcard labels: 
			retval.tree = root_0;
			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

			root_0 = (Object)adaptor.nil();
			// 285:9: -> ^( I_RULE selectorGroup declarationsBlock )
			{
				// CSS.g:285:12: ^( I_RULE selectorGroup declarationsBlock )
				{
				Object root_1 = (Object)adaptor.nil();
				root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(I_RULE, "I_RULE"), root_1);
				adaptor.addChild(root_1, stream_selectorGroup.nextTree());
				adaptor.addChild(root_1, stream_declarationsBlock.nextTree());
				adaptor.addChild(root_0, root_1);
				}

			}


			retval.tree = root_0;

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "ruleset"


	public static class selectorGroup_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "selectorGroup"
	// CSS.g:291:1: selectorGroup : compoundSelector ( COMMA compoundSelector )* -> ^( I_SELECTOR_GROUP ( compoundSelector )+ ) ;
	public final CSSParser.selectorGroup_return selectorGroup() throws RecognitionException {
		CSSParser.selectorGroup_return retval = new CSSParser.selectorGroup_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token COMMA40=null;
		ParserRuleReturnScope compoundSelector39 =null;
		ParserRuleReturnScope compoundSelector41 =null;

		Object COMMA40_tree=null;
		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
		RewriteRuleSubtreeStream stream_compoundSelector=new RewriteRuleSubtreeStream(adaptor,"rule compoundSelector");

		try {
			// CSS.g:292:2: ( compoundSelector ( COMMA compoundSelector )* -> ^( I_SELECTOR_GROUP ( compoundSelector )+ ) )
			// CSS.g:292:4: compoundSelector ( COMMA compoundSelector )*
			{
			pushFollow(FOLLOW_compoundSelector_in_selectorGroup632);
			compoundSelector39=compoundSelector();
			state._fsp--;

			stream_compoundSelector.add(compoundSelector39.getTree());
			// CSS.g:292:21: ( COMMA compoundSelector )*
			loop9:
			while (true) {
				int alt9=2;
				int LA9_0 = input.LA(1);
				if ( (LA9_0==COMMA) ) {
					alt9=1;
				}

				switch (alt9) {
				case 1 :
					// CSS.g:292:23: COMMA compoundSelector
					{
					COMMA40=(Token)match(input,COMMA,FOLLOW_COMMA_in_selectorGroup636);  
					stream_COMMA.add(COMMA40);

					pushFollow(FOLLOW_compoundSelector_in_selectorGroup638);
					compoundSelector41=compoundSelector();
					state._fsp--;

					stream_compoundSelector.add(compoundSelector41.getTree());
					}
					break;

				default :
					break loop9;
				}
			}

			// AST REWRITE
			// elements: compoundSelector
			// token labels: 
			// rule labels: retval
			// token list labels: 
			// rule list labels: 
			// wildcard labels: 
			retval.tree = root_0;
			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

			root_0 = (Object)adaptor.nil();
			// 293:9: -> ^( I_SELECTOR_GROUP ( compoundSelector )+ )
			{
				// CSS.g:293:12: ^( I_SELECTOR_GROUP ( compoundSelector )+ )
				{
				Object root_1 = (Object)adaptor.nil();
				root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(I_SELECTOR_GROUP, "I_SELECTOR_GROUP"), root_1);
				if ( !(stream_compoundSelector.hasNext()) ) {
					throw new RewriteEarlyExitException();
				}
				while ( stream_compoundSelector.hasNext() ) {
					adaptor.addChild(root_1, stream_compoundSelector.nextTree());
				}
				stream_compoundSelector.reset();

				adaptor.addChild(root_0, root_1);
				}

			}


			retval.tree = root_0;

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "selectorGroup"


	public static class compoundSelector_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "compoundSelector"
	// CSS.g:304:1: compoundSelector : (l= simpleSelectorFraction ( '+' | '>' )? )+ -> ^( I_SELECTOR ) ;
	public final CSSParser.compoundSelector_return compoundSelector() throws RecognitionException {
		CSSParser.compoundSelector_return retval = new CSSParser.compoundSelector_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token char_literal42=null;
		Token char_literal43=null;
		ParserRuleReturnScope l =null;

		Object char_literal42_tree=null;
		Object char_literal43_tree=null;
		RewriteRuleTokenStream stream_PRECEDED=new RewriteRuleTokenStream(adaptor,"token PRECEDED");
		RewriteRuleTokenStream stream_CHILD=new RewriteRuleTokenStream(adaptor,"token CHILD");
		RewriteRuleSubtreeStream stream_simpleSelectorFraction=new RewriteRuleSubtreeStream(adaptor,"rule simpleSelectorFraction");


			final List simpleSelectorNodeList = new ArrayList();
			Object currentSimpleSelectorNode = adaptor.create(I_SIMPLE_SELECTOR, "I_SIMPLE_SELECTOR");
			Token simpleSelectorStartToken = null;
		    Token simpleSelectorStopToken = null;

		try {
			// CSS.g:317:5: ( (l= simpleSelectorFraction ( '+' | '>' )? )+ -> ^( I_SELECTOR ) )
			// CSS.g:317:9: (l= simpleSelectorFraction ( '+' | '>' )? )+
			{
			// CSS.g:317:9: (l= simpleSelectorFraction ( '+' | '>' )? )+
			int cnt11=0;
			loop11:
			while (true) {
				int alt11=2;
				int LA11_0 = input.LA(1);
				if ( (LA11_0==COLON||(LA11_0 >= DOT && LA11_0 <= DOUBLE_COLON)||LA11_0==HASH_WORD||LA11_0==ID||LA11_0==NUMBER_WITH_PERCENT||(LA11_0 >= SQUARE_OPEN && LA11_0 <= STAR)) ) {
					alt11=1;
				}

				switch (alt11) {
				case 1 :
					// CSS.g:317:13: l= simpleSelectorFraction ( '+' | '>' )?
					{
					pushFollow(FOLLOW_simpleSelectorFraction_in_compoundSelector703);
					l=simpleSelectorFraction();
					state._fsp--;

					stream_simpleSelectorFraction.add(l.getTree());
					// CSS.g:317:38: ( '+' | '>' )?
					int alt10=3;
					int LA10_0 = input.LA(1);
					if ( (LA10_0==PRECEDED) ) {
						alt10=1;
					}
					else if ( (LA10_0==CHILD) ) {
						alt10=2;
					}
					switch (alt10) {
						case 1 :
							// CSS.g:317:40: '+'
							{
							char_literal42=(Token)match(input,PRECEDED,FOLLOW_PRECEDED_in_compoundSelector707);  
							stream_PRECEDED.add(char_literal42);

							}
							break;
						case 2 :
							// CSS.g:317:46: '>'
							{
							char_literal43=(Token)match(input,CHILD,FOLLOW_CHILD_in_compoundSelector711);  
							stream_CHILD.add(char_literal43);

							}
							break;

					}

					 
								    // expand token range of the current simple selector
									if (simpleSelectorStartToken == null)
									    simpleSelectorStartToken = (l!=null?(l.start):null);
									simpleSelectorStopToken = (l!=null?(l.stop):null);
									
									adaptor.addChild(currentSimpleSelectorNode, (l!=null?((Object)l.getTree()):null));
								    
					                            int end = endOfSimpleSelector();
								    if (end != -1) 
								    {
								        adaptor.setTokenBoundaries(
					                        currentSimpleSelectorNode,
					                        simpleSelectorStartToken,
					                        simpleSelectorStopToken);
								    	simpleSelectorNodeList.add(currentSimpleSelectorNode);
					                        
					                    simpleSelectorStartToken = null;
					                    simpleSelectorStopToken = null;
					                    
					                                if (end == 1)
					                                  currentSimpleSelectorNode =  adaptor.create(I_CHILD_SELECTOR, "I_CHILD_SELECTOR");
					                                else if (end == 2)		   
								    	  currentSimpleSelectorNode = adaptor.create(I_PRECEDED_SELECTOR, "I_PRECEDED_SELECTOR");			   
					                                else if (end == 3)			   
								    	  currentSimpleSelectorNode = adaptor.create(I_SIBLING_SELECTOR, "I_SIBLING_SELECTOR");
					                                else
					                              	  currentSimpleSelectorNode = adaptor.create(I_SIMPLE_SELECTOR, "I_SIMPLE_SELECTOR");			   
								    }
								
					}
					break;

				default :
					if ( cnt11 >= 1 ) break loop11;
					EarlyExitException eee = new EarlyExitException(11, input);
					throw eee;
				}
				cnt11++;
			}

			// AST REWRITE
			// elements: 
			// token labels: 
			// rule labels: retval
			// token list labels: 
			// rule list labels: 
			// wildcard labels: 
			retval.tree = root_0;
			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

			root_0 = (Object)adaptor.nil();
			// 349:9: -> ^( I_SELECTOR )
			{
				// CSS.g:349:12: ^( I_SELECTOR )
				{
				Object root_1 = (Object)adaptor.nil();
				root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(I_SELECTOR, "I_SELECTOR"), root_1);
				adaptor.addChild(root_0, root_1);
				}

			}


			retval.tree = root_0;

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);


				for(final Object simpleSelectorNode : simpleSelectorNodeList)
					adaptor.addChild(retval.tree, simpleSelectorNode);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "compoundSelector"


	public static class simpleSelectorFraction_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "simpleSelectorFraction"
	// CSS.g:376:1: simpleSelectorFraction : ( condition | element );
	public final CSSParser.simpleSelectorFraction_return simpleSelectorFraction() throws RecognitionException {
		CSSParser.simpleSelectorFraction_return retval = new CSSParser.simpleSelectorFraction_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		ParserRuleReturnScope condition44 =null;
		ParserRuleReturnScope element45 =null;


		try {
			// CSS.g:377:5: ( condition | element )
			int alt12=2;
			int LA12_0 = input.LA(1);
			if ( (LA12_0==COLON||(LA12_0 >= DOT && LA12_0 <= DOUBLE_COLON)||LA12_0==HASH_WORD||LA12_0==SQUARE_OPEN) ) {
				alt12=1;
			}
			else if ( (LA12_0==ID||LA12_0==NUMBER_WITH_PERCENT||LA12_0==STAR) ) {
				alt12=2;
			}

			else {
				NoViableAltException nvae =
					new NoViableAltException("", 12, 0, input);
				throw nvae;
			}

			switch (alt12) {
				case 1 :
					// CSS.g:377:9: condition
					{
					root_0 = (Object)adaptor.nil();


					pushFollow(FOLLOW_condition_in_simpleSelectorFraction784);
					condition44=condition();
					state._fsp--;

					adaptor.addChild(root_0, condition44.getTree());

					}
					break;
				case 2 :
					// CSS.g:378:9: element
					{
					root_0 = (Object)adaptor.nil();


					pushFollow(FOLLOW_element_in_simpleSelectorFraction795);
					element45=element();
					state._fsp--;

					adaptor.addChild(root_0, element45.getTree());

					}
					break;

			}
			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "simpleSelectorFraction"


	public static class condition_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "condition"
	// CSS.g:385:1: condition : ( DOT ^ ID | HASH_WORD | COLON ^ NOT ARGUMENTS | COLON ^ ID | DOUBLE_COLON ^ ID | attributeSelector ) ;
	public final CSSParser.condition_return condition() throws RecognitionException {
		CSSParser.condition_return retval = new CSSParser.condition_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token DOT46=null;
		Token ID47=null;
		Token HASH_WORD48=null;
		Token COLON49=null;
		Token NOT50=null;
		Token ARGUMENTS51=null;
		Token COLON52=null;
		Token ID53=null;
		Token DOUBLE_COLON54=null;
		Token ID55=null;
		ParserRuleReturnScope attributeSelector56 =null;

		Object DOT46_tree=null;
		Object ID47_tree=null;
		Object HASH_WORD48_tree=null;
		Object COLON49_tree=null;
		Object NOT50_tree=null;
		Object ARGUMENTS51_tree=null;
		Object COLON52_tree=null;
		Object ID53_tree=null;
		Object DOUBLE_COLON54_tree=null;
		Object ID55_tree=null;

		try {
			// CSS.g:386:5: ( ( DOT ^ ID | HASH_WORD | COLON ^ NOT ARGUMENTS | COLON ^ ID | DOUBLE_COLON ^ ID | attributeSelector ) )
			// CSS.g:386:9: ( DOT ^ ID | HASH_WORD | COLON ^ NOT ARGUMENTS | COLON ^ ID | DOUBLE_COLON ^ ID | attributeSelector )
			{
			root_0 = (Object)adaptor.nil();


			// CSS.g:386:9: ( DOT ^ ID | HASH_WORD | COLON ^ NOT ARGUMENTS | COLON ^ ID | DOUBLE_COLON ^ ID | attributeSelector )
			int alt13=6;
			switch ( input.LA(1) ) {
			case DOT:
				{
				alt13=1;
				}
				break;
			case HASH_WORD:
				{
				alt13=2;
				}
				break;
			case COLON:
				{
				int LA13_3 = input.LA(2);
				if ( (LA13_3==NOT) ) {
					alt13=3;
				}
				else if ( (LA13_3==ID) ) {
					alt13=4;
				}

				else {
					int nvaeMark = input.mark();
					try {
						input.consume();
						NoViableAltException nvae =
							new NoViableAltException("", 13, 3, input);
						throw nvae;
					} finally {
						input.rewind(nvaeMark);
					}
				}

				}
				break;
			case DOUBLE_COLON:
				{
				alt13=5;
				}
				break;
			case SQUARE_OPEN:
				{
				alt13=6;
				}
				break;
			default:
				NoViableAltException nvae =
					new NoViableAltException("", 13, 0, input);
				throw nvae;
			}
			switch (alt13) {
				case 1 :
					// CSS.g:386:11: DOT ^ ID
					{
					DOT46=(Token)match(input,DOT,FOLLOW_DOT_in_condition821); 
					DOT46_tree = (Object)adaptor.create(DOT46);
					root_0 = (Object)adaptor.becomeRoot(DOT46_tree, root_0);

					ID47=(Token)match(input,ID,FOLLOW_ID_in_condition824); 
					ID47_tree = (Object)adaptor.create(ID47);
					adaptor.addChild(root_0, ID47_tree);

					}
					break;
				case 2 :
					// CSS.g:387:11: HASH_WORD
					{
					HASH_WORD48=(Token)match(input,HASH_WORD,FOLLOW_HASH_WORD_in_condition836); 
					HASH_WORD48_tree = (Object)adaptor.create(HASH_WORD48);
					adaptor.addChild(root_0, HASH_WORD48_tree);

					}
					break;
				case 3 :
					// CSS.g:388:11: COLON ^ NOT ARGUMENTS
					{
					COLON49=(Token)match(input,COLON,FOLLOW_COLON_in_condition849); 
					COLON49_tree = (Object)adaptor.create(COLON49);
					root_0 = (Object)adaptor.becomeRoot(COLON49_tree, root_0);

					NOT50=(Token)match(input,NOT,FOLLOW_NOT_in_condition852); 
					NOT50_tree = (Object)adaptor.create(NOT50);
					adaptor.addChild(root_0, NOT50_tree);

					ARGUMENTS51=(Token)match(input,ARGUMENTS,FOLLOW_ARGUMENTS_in_condition854); 
					ARGUMENTS51_tree = (Object)adaptor.create(ARGUMENTS51);
					adaptor.addChild(root_0, ARGUMENTS51_tree);

					}
					break;
				case 4 :
					// CSS.g:389:11: COLON ^ ID
					{
					COLON52=(Token)match(input,COLON,FOLLOW_COLON_in_condition867); 
					COLON52_tree = (Object)adaptor.create(COLON52);
					root_0 = (Object)adaptor.becomeRoot(COLON52_tree, root_0);

					ID53=(Token)match(input,ID,FOLLOW_ID_in_condition870); 
					ID53_tree = (Object)adaptor.create(ID53);
					adaptor.addChild(root_0, ID53_tree);

					}
					break;
				case 5 :
					// CSS.g:390:11: DOUBLE_COLON ^ ID
					{
					DOUBLE_COLON54=(Token)match(input,DOUBLE_COLON,FOLLOW_DOUBLE_COLON_in_condition883); 
					DOUBLE_COLON54_tree = (Object)adaptor.create(DOUBLE_COLON54);
					root_0 = (Object)adaptor.becomeRoot(DOUBLE_COLON54_tree, root_0);

					ID55=(Token)match(input,ID,FOLLOW_ID_in_condition886); 
					ID55_tree = (Object)adaptor.create(ID55);
					adaptor.addChild(root_0, ID55_tree);

					}
					break;
				case 6 :
					// CSS.g:391:11: attributeSelector
					{
					pushFollow(FOLLOW_attributeSelector_in_condition899);
					attributeSelector56=attributeSelector();
					state._fsp--;

					adaptor.addChild(root_0, attributeSelector56.getTree());

					}
					break;

			}

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "condition"


	public static class element_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "element"
	// CSS.g:400:1: element : ( ID PIPE ^ ID | NUMBER_WITH_PERCENT | ID | STAR );
	public final CSSParser.element_return element() throws RecognitionException {
		CSSParser.element_return retval = new CSSParser.element_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token ID57=null;
		Token PIPE58=null;
		Token ID59=null;
		Token NUMBER_WITH_PERCENT60=null;
		Token ID61=null;
		Token STAR62=null;

		Object ID57_tree=null;
		Object PIPE58_tree=null;
		Object ID59_tree=null;
		Object NUMBER_WITH_PERCENT60_tree=null;
		Object ID61_tree=null;
		Object STAR62_tree=null;

		try {
			// CSS.g:401:5: ( ID PIPE ^ ID | NUMBER_WITH_PERCENT | ID | STAR )
			int alt14=4;
			switch ( input.LA(1) ) {
			case ID:
				{
				int LA14_1 = input.LA(2);
				if ( (LA14_1==PIPE) ) {
					alt14=1;
				}
				else if ( (LA14_1==BLOCK_OPEN||LA14_1==CHILD||(LA14_1 >= COLON && LA14_1 <= COMMA)||(LA14_1 >= DOT && LA14_1 <= DOUBLE_COLON)||LA14_1==HASH_WORD||LA14_1==ID||LA14_1==NUMBER_WITH_PERCENT||LA14_1==PRECEDED||(LA14_1 >= SQUARE_OPEN && LA14_1 <= STAR)) ) {
					alt14=3;
				}

				else {
					int nvaeMark = input.mark();
					try {
						input.consume();
						NoViableAltException nvae =
							new NoViableAltException("", 14, 1, input);
						throw nvae;
					} finally {
						input.rewind(nvaeMark);
					}
				}

				}
				break;
			case NUMBER_WITH_PERCENT:
				{
				alt14=2;
				}
				break;
			case STAR:
				{
				alt14=4;
				}
				break;
			default:
				NoViableAltException nvae =
					new NoViableAltException("", 14, 0, input);
				throw nvae;
			}
			switch (alt14) {
				case 1 :
					// CSS.g:401:9: ID PIPE ^ ID
					{
					root_0 = (Object)adaptor.nil();


					ID57=(Token)match(input,ID,FOLLOW_ID_in_element933); 
					ID57_tree = (Object)adaptor.create(ID57);
					adaptor.addChild(root_0, ID57_tree);

					PIPE58=(Token)match(input,PIPE,FOLLOW_PIPE_in_element935); 
					PIPE58_tree = (Object)adaptor.create(PIPE58);
					root_0 = (Object)adaptor.becomeRoot(PIPE58_tree, root_0);

					ID59=(Token)match(input,ID,FOLLOW_ID_in_element938); 
					ID59_tree = (Object)adaptor.create(ID59);
					adaptor.addChild(root_0, ID59_tree);

					}
					break;
				case 2 :
					// CSS.g:402:9: NUMBER_WITH_PERCENT
					{
					root_0 = (Object)adaptor.nil();


					NUMBER_WITH_PERCENT60=(Token)match(input,NUMBER_WITH_PERCENT,FOLLOW_NUMBER_WITH_PERCENT_in_element948); 
					NUMBER_WITH_PERCENT60_tree = (Object)adaptor.create(NUMBER_WITH_PERCENT60);
					adaptor.addChild(root_0, NUMBER_WITH_PERCENT60_tree);

					}
					break;
				case 3 :
					// CSS.g:403:9: ID
					{
					root_0 = (Object)adaptor.nil();


					ID61=(Token)match(input,ID,FOLLOW_ID_in_element970); 
					ID61_tree = (Object)adaptor.create(ID61);
					adaptor.addChild(root_0, ID61_tree);

					}
					break;
				case 4 :
					// CSS.g:404:9: STAR
					{
					root_0 = (Object)adaptor.nil();


					STAR62=(Token)match(input,STAR,FOLLOW_STAR_in_element990); 
					STAR62_tree = (Object)adaptor.create(STAR62);
					adaptor.addChild(root_0, STAR62_tree);

					}
					break;

			}
			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "element"


	public static class declarationsBlock_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "declarationsBlock"
	// CSS.g:412:1: declarationsBlock : BLOCK_OPEN ( ( SEMI_COLONS )? declaration ( SEMI_COLONS declaration )* ( SEMI_COLONS )? )? BLOCK_END -> ^( I_DECL ( declaration )* ) ;
	public final CSSParser.declarationsBlock_return declarationsBlock() throws RecognitionException {
		CSSParser.declarationsBlock_return retval = new CSSParser.declarationsBlock_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token BLOCK_OPEN63=null;
		Token SEMI_COLONS64=null;
		Token SEMI_COLONS66=null;
		Token SEMI_COLONS68=null;
		Token BLOCK_END69=null;
		ParserRuleReturnScope declaration65 =null;
		ParserRuleReturnScope declaration67 =null;

		Object BLOCK_OPEN63_tree=null;
		Object SEMI_COLONS64_tree=null;
		Object SEMI_COLONS66_tree=null;
		Object SEMI_COLONS68_tree=null;
		Object BLOCK_END69_tree=null;
		RewriteRuleTokenStream stream_BLOCK_OPEN=new RewriteRuleTokenStream(adaptor,"token BLOCK_OPEN");
		RewriteRuleTokenStream stream_BLOCK_END=new RewriteRuleTokenStream(adaptor,"token BLOCK_END");
		RewriteRuleTokenStream stream_SEMI_COLONS=new RewriteRuleTokenStream(adaptor,"token SEMI_COLONS");
		RewriteRuleSubtreeStream stream_declaration=new RewriteRuleSubtreeStream(adaptor,"rule declaration");

		try {
			// CSS.g:413:5: ( BLOCK_OPEN ( ( SEMI_COLONS )? declaration ( SEMI_COLONS declaration )* ( SEMI_COLONS )? )? BLOCK_END -> ^( I_DECL ( declaration )* ) )
			// CSS.g:413:9: BLOCK_OPEN ( ( SEMI_COLONS )? declaration ( SEMI_COLONS declaration )* ( SEMI_COLONS )? )? BLOCK_END
			{
			BLOCK_OPEN63=(Token)match(input,BLOCK_OPEN,FOLLOW_BLOCK_OPEN_in_declarationsBlock1019);  
			stream_BLOCK_OPEN.add(BLOCK_OPEN63);

			// CSS.g:414:9: ( ( SEMI_COLONS )? declaration ( SEMI_COLONS declaration )* ( SEMI_COLONS )? )?
			int alt18=2;
			int LA18_0 = input.LA(1);
			if ( (LA18_0==DASHED_ID||LA18_0==ID||LA18_0==SEMI_COLONS) ) {
				alt18=1;
			}
			switch (alt18) {
				case 1 :
					// CSS.g:415:13: ( SEMI_COLONS )? declaration ( SEMI_COLONS declaration )* ( SEMI_COLONS )?
					{
					// CSS.g:415:13: ( SEMI_COLONS )?
					int alt15=2;
					int LA15_0 = input.LA(1);
					if ( (LA15_0==SEMI_COLONS) ) {
						alt15=1;
					}
					switch (alt15) {
						case 1 :
							// CSS.g:415:13: SEMI_COLONS
							{
							SEMI_COLONS64=(Token)match(input,SEMI_COLONS,FOLLOW_SEMI_COLONS_in_declarationsBlock1047);  
							stream_SEMI_COLONS.add(SEMI_COLONS64);

							}
							break;

					}

					pushFollow(FOLLOW_declaration_in_declarationsBlock1065);
					declaration65=declaration();
					state._fsp--;

					stream_declaration.add(declaration65.getTree());
					// CSS.g:417:13: ( SEMI_COLONS declaration )*
					loop16:
					while (true) {
						int alt16=2;
						int LA16_0 = input.LA(1);
						if ( (LA16_0==SEMI_COLONS) ) {
							int LA16_1 = input.LA(2);
							if ( (LA16_1==DASHED_ID||LA16_1==ID) ) {
								alt16=1;
							}

						}

						switch (alt16) {
						case 1 :
							// CSS.g:418:17: SEMI_COLONS declaration
							{
							SEMI_COLONS66=(Token)match(input,SEMI_COLONS,FOLLOW_SEMI_COLONS_in_declarationsBlock1099);  
							stream_SEMI_COLONS.add(SEMI_COLONS66);

							pushFollow(FOLLOW_declaration_in_declarationsBlock1118);
							declaration67=declaration();
							state._fsp--;

							stream_declaration.add(declaration67.getTree());
							}
							break;

						default :
							break loop16;
						}
					}

					// CSS.g:421:13: ( SEMI_COLONS )?
					int alt17=2;
					int LA17_0 = input.LA(1);
					if ( (LA17_0==SEMI_COLONS) ) {
						alt17=1;
					}
					switch (alt17) {
						case 1 :
							// CSS.g:421:13: SEMI_COLONS
							{
							SEMI_COLONS68=(Token)match(input,SEMI_COLONS,FOLLOW_SEMI_COLONS_in_declarationsBlock1148);  
							stream_SEMI_COLONS.add(SEMI_COLONS68);

							}
							break;

					}

					}
					break;

			}

			BLOCK_END69=(Token)match(input,BLOCK_END,FOLLOW_BLOCK_END_in_declarationsBlock1171);  
			stream_BLOCK_END.add(BLOCK_END69);

			// AST REWRITE
			// elements: declaration
			// token labels: 
			// rule labels: retval
			// token list labels: 
			// rule list labels: 
			// wildcard labels: 
			retval.tree = root_0;
			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

			root_0 = (Object)adaptor.nil();
			// 424:9: -> ^( I_DECL ( declaration )* )
			{
				// CSS.g:424:12: ^( I_DECL ( declaration )* )
				{
				Object root_1 = (Object)adaptor.nil();
				root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(I_DECL, "I_DECL"), root_1);
				// CSS.g:424:21: ( declaration )*
				while ( stream_declaration.hasNext() ) {
					adaptor.addChild(root_1, stream_declaration.nextTree());
				}
				stream_declaration.reset();

				adaptor.addChild(root_0, root_1);
				}

			}


			retval.tree = root_0;

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "declarationsBlock"


	public static class declaration_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "declaration"
	// CSS.g:432:1: declaration : ( ID COLON value -> ^( COLON ID value ) | DASHED_ID COLON value -> ^( COLON DASHED_ID value ) );
	public final CSSParser.declaration_return declaration() throws RecognitionException {
		CSSParser.declaration_return retval = new CSSParser.declaration_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token ID70=null;
		Token COLON71=null;
		Token DASHED_ID73=null;
		Token COLON74=null;
		ParserRuleReturnScope value72 =null;
		ParserRuleReturnScope value75 =null;

		Object ID70_tree=null;
		Object COLON71_tree=null;
		Object DASHED_ID73_tree=null;
		Object COLON74_tree=null;
		RewriteRuleTokenStream stream_DASHED_ID=new RewriteRuleTokenStream(adaptor,"token DASHED_ID");
		RewriteRuleTokenStream stream_COLON=new RewriteRuleTokenStream(adaptor,"token COLON");
		RewriteRuleTokenStream stream_ID=new RewriteRuleTokenStream(adaptor,"token ID");
		RewriteRuleSubtreeStream stream_value=new RewriteRuleSubtreeStream(adaptor,"rule value");

		try {
			// CSS.g:433:5: ( ID COLON value -> ^( COLON ID value ) | DASHED_ID COLON value -> ^( COLON DASHED_ID value ) )
			int alt19=2;
			int LA19_0 = input.LA(1);
			if ( (LA19_0==ID) ) {
				alt19=1;
			}
			else if ( (LA19_0==DASHED_ID) ) {
				alt19=2;
			}

			else {
				NoViableAltException nvae =
					new NoViableAltException("", 19, 0, input);
				throw nvae;
			}

			switch (alt19) {
				case 1 :
					// CSS.g:433:9: ID COLON value
					{
					ID70=(Token)match(input,ID,FOLLOW_ID_in_declaration1211);  
					stream_ID.add(ID70);

					COLON71=(Token)match(input,COLON,FOLLOW_COLON_in_declaration1213);  
					stream_COLON.add(COLON71);

					pushFollow(FOLLOW_value_in_declaration1215);
					value72=value();
					state._fsp--;

					stream_value.add(value72.getTree());
					// AST REWRITE
					// elements: ID, COLON, value
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (Object)adaptor.nil();
					// 433:24: -> ^( COLON ID value )
					{
						// CSS.g:433:27: ^( COLON ID value )
						{
						Object root_1 = (Object)adaptor.nil();
						root_1 = (Object)adaptor.becomeRoot(stream_COLON.nextNode(), root_1);
						adaptor.addChild(root_1, stream_ID.nextNode());
						adaptor.addChild(root_1, stream_value.nextTree());
						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;
				case 2 :
					// CSS.g:434:9: DASHED_ID COLON value
					{
					DASHED_ID73=(Token)match(input,DASHED_ID,FOLLOW_DASHED_ID_in_declaration1235);  
					stream_DASHED_ID.add(DASHED_ID73);

					COLON74=(Token)match(input,COLON,FOLLOW_COLON_in_declaration1237);  
					stream_COLON.add(COLON74);

					pushFollow(FOLLOW_value_in_declaration1239);
					value75=value();
					state._fsp--;

					stream_value.add(value75.getTree());
					// AST REWRITE
					// elements: COLON, value, DASHED_ID
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (Object)adaptor.nil();
					// 434:31: -> ^( COLON DASHED_ID value )
					{
						// CSS.g:434:34: ^( COLON DASHED_ID value )
						{
						Object root_1 = (Object)adaptor.nil();
						root_1 = (Object)adaptor.becomeRoot(stream_COLON.nextNode(), root_1);
						adaptor.addChild(root_1, stream_DASHED_ID.nextNode());
						adaptor.addChild(root_1, stream_value.nextTree());
						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;

			}
			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "declaration"


	public static class value_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "value"
	// CSS.g:450:1: value : multiValue ( COMMA multiValue )* -> {count > 1}? ^( I_ARRAY ( multiValue )+ ) -> multiValue ;
	public final CSSParser.value_return value() throws RecognitionException {
		CSSParser.value_return retval = new CSSParser.value_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token COMMA77=null;
		ParserRuleReturnScope multiValue76 =null;
		ParserRuleReturnScope multiValue78 =null;

		Object COMMA77_tree=null;
		RewriteRuleTokenStream stream_COMMA=new RewriteRuleTokenStream(adaptor,"token COMMA");
		RewriteRuleSubtreeStream stream_multiValue=new RewriteRuleSubtreeStream(adaptor,"rule multiValue");

		 int count = 1; 
		try {
			// CSS.g:452:5: ( multiValue ( COMMA multiValue )* -> {count > 1}? ^( I_ARRAY ( multiValue )+ ) -> multiValue )
			// CSS.g:452:9: multiValue ( COMMA multiValue )*
			{
			pushFollow(FOLLOW_multiValue_in_value1285);
			multiValue76=multiValue();
			state._fsp--;

			stream_multiValue.add(multiValue76.getTree());
			// CSS.g:452:20: ( COMMA multiValue )*
			loop20:
			while (true) {
				int alt20=2;
				int LA20_0 = input.LA(1);
				if ( (LA20_0==COMMA) ) {
					alt20=1;
				}

				switch (alt20) {
				case 1 :
					// CSS.g:452:22: COMMA multiValue
					{
					COMMA77=(Token)match(input,COMMA,FOLLOW_COMMA_in_value1289);  
					stream_COMMA.add(COMMA77);

					pushFollow(FOLLOW_multiValue_in_value1291);
					multiValue78=multiValue();
					state._fsp--;

					stream_multiValue.add(multiValue78.getTree());
					 count++; 
					}
					break;

				default :
					break loop20;
				}
			}

			// AST REWRITE
			// elements: multiValue, multiValue
			// token labels: 
			// rule labels: retval
			// token list labels: 
			// rule list labels: 
			// wildcard labels: 
			retval.tree = root_0;
			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

			root_0 = (Object)adaptor.nil();
			// 453:9: -> {count > 1}? ^( I_ARRAY ( multiValue )+ )
			if (count > 1) {
				// CSS.g:453:25: ^( I_ARRAY ( multiValue )+ )
				{
				Object root_1 = (Object)adaptor.nil();
				root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(I_ARRAY, "I_ARRAY"), root_1);
				if ( !(stream_multiValue.hasNext()) ) {
					throw new RewriteEarlyExitException();
				}
				while ( stream_multiValue.hasNext() ) {
					adaptor.addChild(root_1, stream_multiValue.nextTree());
				}
				stream_multiValue.reset();

				adaptor.addChild(root_0, root_1);
				}

			}

			else // 454:9: -> multiValue
			{
				adaptor.addChild(root_0, stream_multiValue.nextTree());
			}


			retval.tree = root_0;

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "value"


	public static class multiValue_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "multiValue"
	// CSS.g:466:1: multiValue : singleValue ( singleValue )* -> {count > 1}? ^( I_MULTIVALUE ( singleValue )+ ) -> singleValue ;
	public final CSSParser.multiValue_return multiValue() throws RecognitionException {
		CSSParser.multiValue_return retval = new CSSParser.multiValue_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		ParserRuleReturnScope singleValue79 =null;
		ParserRuleReturnScope singleValue80 =null;

		RewriteRuleSubtreeStream stream_singleValue=new RewriteRuleSubtreeStream(adaptor,"rule singleValue");

		 int count = 1; 
		try {
			// CSS.g:468:5: ( singleValue ( singleValue )* -> {count > 1}? ^( I_MULTIVALUE ( singleValue )+ ) -> singleValue )
			// CSS.g:468:9: singleValue ( singleValue )*
			{
			pushFollow(FOLLOW_singleValue_in_multiValue1372);
			singleValue79=singleValue();
			state._fsp--;

			stream_singleValue.add(singleValue79.getTree());
			// CSS.g:468:21: ( singleValue )*
			loop21:
			while (true) {
				int alt21=2;
				int LA21_0 = input.LA(1);
				if ( (LA21_0==ALPHA_VALUE||LA21_0==CALC||LA21_0==CLASS_REFERENCE||LA21_0==EMBED||(LA21_0 >= FUNCTIONS && LA21_0 <= HASH_WORD)||(LA21_0 >= ID && LA21_0 <= IMPORTANT)||(LA21_0 >= LOCAL && LA21_0 <= MATRIX_VALUE)||(LA21_0 >= NUMBER_WITH_PERCENT && LA21_0 <= NUMBER_WITH_UNIT)||LA21_0==OPERATOR||(LA21_0 >= PROPERTY_REFERENCE && LA21_0 <= ROTATE_VALUE)||LA21_0==SCALE_VALUE||LA21_0==STRING||(LA21_0 >= TRANSLATE3D_VALUE && LA21_0 <= VAR)) ) {
					alt21=1;
				}

				switch (alt21) {
				case 1 :
					// CSS.g:468:23: singleValue
					{
					pushFollow(FOLLOW_singleValue_in_multiValue1376);
					singleValue80=singleValue();
					state._fsp--;

					stream_singleValue.add(singleValue80.getTree());
					 count++; 
					}
					break;

				default :
					break loop21;
				}
			}

			// AST REWRITE
			// elements: singleValue, singleValue
			// token labels: 
			// rule labels: retval
			// token list labels: 
			// rule list labels: 
			// wildcard labels: 
			retval.tree = root_0;
			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

			root_0 = (Object)adaptor.nil();
			// 469:9: -> {count > 1}? ^( I_MULTIVALUE ( singleValue )+ )
			if (count > 1) {
				// CSS.g:469:25: ^( I_MULTIVALUE ( singleValue )+ )
				{
				Object root_1 = (Object)adaptor.nil();
				root_1 = (Object)adaptor.becomeRoot((Object)adaptor.create(I_MULTIVALUE, "I_MULTIVALUE"), root_1);
				if ( !(stream_singleValue.hasNext()) ) {
					throw new RewriteEarlyExitException();
				}
				while ( stream_singleValue.hasNext() ) {
					adaptor.addChild(root_1, stream_singleValue.nextTree());
				}
				stream_singleValue.reset();

				adaptor.addChild(root_0, root_1);
				}

			}

			else // 470:9: -> singleValue
			{
				adaptor.addChild(root_0, stream_singleValue.nextTree());
			}


			retval.tree = root_0;

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "multiValue"


	public static class singleValue_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "singleValue"
	// CSS.g:488:1: singleValue : ( NUMBER_WITH_PERCENT | NUMBER_WITH_UNIT | HASH_WORD | CLASS_REFERENCE ARGUMENTS -> ^( CLASS_REFERENCE ARGUMENTS ) | PROPERTY_REFERENCE ARGUMENTS -> ^( PROPERTY_REFERENCE ARGUMENTS ) | EMBED ARGUMENTS -> ^( EMBED ARGUMENTS ) | URL ARGUMENTS ( formatOption )* -> ^( URL ARGUMENTS ( formatOption )* ) | LOCAL ARGUMENTS -> ^( LOCAL ARGUMENTS ) | CALC ARGUMENTS -> ^( CALC ARGUMENTS ) | VAR ARGUMENTS -> ^( VAR ARGUMENTS ) | FUNCTIONS ARGUMENTS -> ^( FUNCTIONS ARGUMENTS ) | ALPHA_VALUE | SCALE_VALUE | RECT_VALUE | ROTATE_VALUE | TRANSLATE3D_VALUE | MATRIX_VALUE | MATRIX3D_VALUE | RGB | RGBA | STRING | ID | OPERATOR | IMPORTANT );
	public final CSSParser.singleValue_return singleValue() throws RecognitionException {
		CSSParser.singleValue_return retval = new CSSParser.singleValue_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token NUMBER_WITH_PERCENT81=null;
		Token NUMBER_WITH_UNIT82=null;
		Token HASH_WORD83=null;
		Token CLASS_REFERENCE84=null;
		Token ARGUMENTS85=null;
		Token PROPERTY_REFERENCE86=null;
		Token ARGUMENTS87=null;
		Token EMBED88=null;
		Token ARGUMENTS89=null;
		Token URL90=null;
		Token ARGUMENTS91=null;
		Token LOCAL93=null;
		Token ARGUMENTS94=null;
		Token CALC95=null;
		Token ARGUMENTS96=null;
		Token VAR97=null;
		Token ARGUMENTS98=null;
		Token FUNCTIONS99=null;
		Token ARGUMENTS100=null;
		Token ALPHA_VALUE101=null;
		Token SCALE_VALUE102=null;
		Token RECT_VALUE103=null;
		Token ROTATE_VALUE104=null;
		Token TRANSLATE3D_VALUE105=null;
		Token MATRIX_VALUE106=null;
		Token MATRIX3D_VALUE107=null;
		Token RGB108=null;
		Token RGBA109=null;
		Token STRING110=null;
		Token ID111=null;
		Token OPERATOR112=null;
		Token IMPORTANT113=null;
		ParserRuleReturnScope formatOption92 =null;

		Object NUMBER_WITH_PERCENT81_tree=null;
		Object NUMBER_WITH_UNIT82_tree=null;
		Object HASH_WORD83_tree=null;
		Object CLASS_REFERENCE84_tree=null;
		Object ARGUMENTS85_tree=null;
		Object PROPERTY_REFERENCE86_tree=null;
		Object ARGUMENTS87_tree=null;
		Object EMBED88_tree=null;
		Object ARGUMENTS89_tree=null;
		Object URL90_tree=null;
		Object ARGUMENTS91_tree=null;
		Object LOCAL93_tree=null;
		Object ARGUMENTS94_tree=null;
		Object CALC95_tree=null;
		Object ARGUMENTS96_tree=null;
		Object VAR97_tree=null;
		Object ARGUMENTS98_tree=null;
		Object FUNCTIONS99_tree=null;
		Object ARGUMENTS100_tree=null;
		Object ALPHA_VALUE101_tree=null;
		Object SCALE_VALUE102_tree=null;
		Object RECT_VALUE103_tree=null;
		Object ROTATE_VALUE104_tree=null;
		Object TRANSLATE3D_VALUE105_tree=null;
		Object MATRIX_VALUE106_tree=null;
		Object MATRIX3D_VALUE107_tree=null;
		Object RGB108_tree=null;
		Object RGBA109_tree=null;
		Object STRING110_tree=null;
		Object ID111_tree=null;
		Object OPERATOR112_tree=null;
		Object IMPORTANT113_tree=null;
		RewriteRuleTokenStream stream_ARGUMENTS=new RewriteRuleTokenStream(adaptor,"token ARGUMENTS");
		RewriteRuleTokenStream stream_PROPERTY_REFERENCE=new RewriteRuleTokenStream(adaptor,"token PROPERTY_REFERENCE");
		RewriteRuleTokenStream stream_VAR=new RewriteRuleTokenStream(adaptor,"token VAR");
		RewriteRuleTokenStream stream_CLASS_REFERENCE=new RewriteRuleTokenStream(adaptor,"token CLASS_REFERENCE");
		RewriteRuleTokenStream stream_LOCAL=new RewriteRuleTokenStream(adaptor,"token LOCAL");
		RewriteRuleTokenStream stream_EMBED=new RewriteRuleTokenStream(adaptor,"token EMBED");
		RewriteRuleTokenStream stream_CALC=new RewriteRuleTokenStream(adaptor,"token CALC");
		RewriteRuleTokenStream stream_FUNCTIONS=new RewriteRuleTokenStream(adaptor,"token FUNCTIONS");
		RewriteRuleTokenStream stream_URL=new RewriteRuleTokenStream(adaptor,"token URL");
		RewriteRuleSubtreeStream stream_formatOption=new RewriteRuleSubtreeStream(adaptor,"rule formatOption");

		try {
			// CSS.g:489:5: ( NUMBER_WITH_PERCENT | NUMBER_WITH_UNIT | HASH_WORD | CLASS_REFERENCE ARGUMENTS -> ^( CLASS_REFERENCE ARGUMENTS ) | PROPERTY_REFERENCE ARGUMENTS -> ^( PROPERTY_REFERENCE ARGUMENTS ) | EMBED ARGUMENTS -> ^( EMBED ARGUMENTS ) | URL ARGUMENTS ( formatOption )* -> ^( URL ARGUMENTS ( formatOption )* ) | LOCAL ARGUMENTS -> ^( LOCAL ARGUMENTS ) | CALC ARGUMENTS -> ^( CALC ARGUMENTS ) | VAR ARGUMENTS -> ^( VAR ARGUMENTS ) | FUNCTIONS ARGUMENTS -> ^( FUNCTIONS ARGUMENTS ) | ALPHA_VALUE | SCALE_VALUE | RECT_VALUE | ROTATE_VALUE | TRANSLATE3D_VALUE | MATRIX_VALUE | MATRIX3D_VALUE | RGB | RGBA | STRING | ID | OPERATOR | IMPORTANT )
			int alt23=24;
			switch ( input.LA(1) ) {
			case NUMBER_WITH_PERCENT:
				{
				alt23=1;
				}
				break;
			case NUMBER_WITH_UNIT:
				{
				alt23=2;
				}
				break;
			case HASH_WORD:
				{
				alt23=3;
				}
				break;
			case CLASS_REFERENCE:
				{
				alt23=4;
				}
				break;
			case PROPERTY_REFERENCE:
				{
				alt23=5;
				}
				break;
			case EMBED:
				{
				alt23=6;
				}
				break;
			case URL:
				{
				alt23=7;
				}
				break;
			case LOCAL:
				{
				alt23=8;
				}
				break;
			case CALC:
				{
				alt23=9;
				}
				break;
			case VAR:
				{
				alt23=10;
				}
				break;
			case FUNCTIONS:
				{
				alt23=11;
				}
				break;
			case ALPHA_VALUE:
				{
				alt23=12;
				}
				break;
			case SCALE_VALUE:
				{
				alt23=13;
				}
				break;
			case RECT_VALUE:
				{
				alt23=14;
				}
				break;
			case ROTATE_VALUE:
				{
				alt23=15;
				}
				break;
			case TRANSLATE3D_VALUE:
				{
				alt23=16;
				}
				break;
			case MATRIX_VALUE:
				{
				alt23=17;
				}
				break;
			case MATRIX3D_VALUE:
				{
				alt23=18;
				}
				break;
			case RGB:
				{
				alt23=19;
				}
				break;
			case RGBA:
				{
				alt23=20;
				}
				break;
			case STRING:
				{
				alt23=21;
				}
				break;
			case ID:
				{
				alt23=22;
				}
				break;
			case OPERATOR:
				{
				alt23=23;
				}
				break;
			case IMPORTANT:
				{
				alt23=24;
				}
				break;
			default:
				NoViableAltException nvae =
					new NoViableAltException("", 23, 0, input);
				throw nvae;
			}
			switch (alt23) {
				case 1 :
					// CSS.g:489:9: NUMBER_WITH_PERCENT
					{
					root_0 = (Object)adaptor.nil();


					NUMBER_WITH_PERCENT81=(Token)match(input,NUMBER_WITH_PERCENT,FOLLOW_NUMBER_WITH_PERCENT_in_singleValue1446); 
					NUMBER_WITH_PERCENT81_tree = (Object)adaptor.create(NUMBER_WITH_PERCENT81);
					adaptor.addChild(root_0, NUMBER_WITH_PERCENT81_tree);

					}
					break;
				case 2 :
					// CSS.g:490:9: NUMBER_WITH_UNIT
					{
					root_0 = (Object)adaptor.nil();


					NUMBER_WITH_UNIT82=(Token)match(input,NUMBER_WITH_UNIT,FOLLOW_NUMBER_WITH_UNIT_in_singleValue1456); 
					NUMBER_WITH_UNIT82_tree = (Object)adaptor.create(NUMBER_WITH_UNIT82);
					adaptor.addChild(root_0, NUMBER_WITH_UNIT82_tree);

					}
					break;
				case 3 :
					// CSS.g:491:9: HASH_WORD
					{
					root_0 = (Object)adaptor.nil();


					HASH_WORD83=(Token)match(input,HASH_WORD,FOLLOW_HASH_WORD_in_singleValue1466); 
					HASH_WORD83_tree = (Object)adaptor.create(HASH_WORD83);
					adaptor.addChild(root_0, HASH_WORD83_tree);

					}
					break;
				case 4 :
					// CSS.g:492:9: CLASS_REFERENCE ARGUMENTS
					{
					CLASS_REFERENCE84=(Token)match(input,CLASS_REFERENCE,FOLLOW_CLASS_REFERENCE_in_singleValue1476);  
					stream_CLASS_REFERENCE.add(CLASS_REFERENCE84);

					ARGUMENTS85=(Token)match(input,ARGUMENTS,FOLLOW_ARGUMENTS_in_singleValue1478);  
					stream_ARGUMENTS.add(ARGUMENTS85);

					// AST REWRITE
					// elements: CLASS_REFERENCE, ARGUMENTS
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (Object)adaptor.nil();
					// 493:13: -> ^( CLASS_REFERENCE ARGUMENTS )
					{
						// CSS.g:493:16: ^( CLASS_REFERENCE ARGUMENTS )
						{
						Object root_1 = (Object)adaptor.nil();
						root_1 = (Object)adaptor.becomeRoot(stream_CLASS_REFERENCE.nextNode(), root_1);
						adaptor.addChild(root_1, stream_ARGUMENTS.nextNode());
						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;
				case 5 :
					// CSS.g:494:9: PROPERTY_REFERENCE ARGUMENTS
					{
					PROPERTY_REFERENCE86=(Token)match(input,PROPERTY_REFERENCE,FOLLOW_PROPERTY_REFERENCE_in_singleValue1508);  
					stream_PROPERTY_REFERENCE.add(PROPERTY_REFERENCE86);

					ARGUMENTS87=(Token)match(input,ARGUMENTS,FOLLOW_ARGUMENTS_in_singleValue1510);  
					stream_ARGUMENTS.add(ARGUMENTS87);

					// AST REWRITE
					// elements: ARGUMENTS, PROPERTY_REFERENCE
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (Object)adaptor.nil();
					// 495:13: -> ^( PROPERTY_REFERENCE ARGUMENTS )
					{
						// CSS.g:495:16: ^( PROPERTY_REFERENCE ARGUMENTS )
						{
						Object root_1 = (Object)adaptor.nil();
						root_1 = (Object)adaptor.becomeRoot(stream_PROPERTY_REFERENCE.nextNode(), root_1);
						adaptor.addChild(root_1, stream_ARGUMENTS.nextNode());
						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;
				case 6 :
					// CSS.g:496:9: EMBED ARGUMENTS
					{
					EMBED88=(Token)match(input,EMBED,FOLLOW_EMBED_in_singleValue1540);  
					stream_EMBED.add(EMBED88);

					ARGUMENTS89=(Token)match(input,ARGUMENTS,FOLLOW_ARGUMENTS_in_singleValue1542);  
					stream_ARGUMENTS.add(ARGUMENTS89);

					// AST REWRITE
					// elements: ARGUMENTS, EMBED
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (Object)adaptor.nil();
					// 497:13: -> ^( EMBED ARGUMENTS )
					{
						// CSS.g:497:16: ^( EMBED ARGUMENTS )
						{
						Object root_1 = (Object)adaptor.nil();
						root_1 = (Object)adaptor.becomeRoot(stream_EMBED.nextNode(), root_1);
						adaptor.addChild(root_1, stream_ARGUMENTS.nextNode());
						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;
				case 7 :
					// CSS.g:498:9: URL ARGUMENTS ( formatOption )*
					{
					URL90=(Token)match(input,URL,FOLLOW_URL_in_singleValue1572);  
					stream_URL.add(URL90);

					ARGUMENTS91=(Token)match(input,ARGUMENTS,FOLLOW_ARGUMENTS_in_singleValue1574);  
					stream_ARGUMENTS.add(ARGUMENTS91);

					// CSS.g:498:23: ( formatOption )*
					loop22:
					while (true) {
						int alt22=2;
						int LA22_0 = input.LA(1);
						if ( (LA22_0==FORMAT) ) {
							alt22=1;
						}

						switch (alt22) {
						case 1 :
							// CSS.g:498:23: formatOption
							{
							pushFollow(FOLLOW_formatOption_in_singleValue1576);
							formatOption92=formatOption();
							state._fsp--;

							stream_formatOption.add(formatOption92.getTree());
							}
							break;

						default :
							break loop22;
						}
					}

					// AST REWRITE
					// elements: formatOption, URL, ARGUMENTS
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (Object)adaptor.nil();
					// 498:39: -> ^( URL ARGUMENTS ( formatOption )* )
					{
						// CSS.g:498:42: ^( URL ARGUMENTS ( formatOption )* )
						{
						Object root_1 = (Object)adaptor.nil();
						root_1 = (Object)adaptor.becomeRoot(stream_URL.nextNode(), root_1);
						adaptor.addChild(root_1, stream_ARGUMENTS.nextNode());
						// CSS.g:498:58: ( formatOption )*
						while ( stream_formatOption.hasNext() ) {
							adaptor.addChild(root_1, stream_formatOption.nextTree());
						}
						stream_formatOption.reset();

						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;
				case 8 :
					// CSS.g:499:9: LOCAL ARGUMENTS
					{
					LOCAL93=(Token)match(input,LOCAL,FOLLOW_LOCAL_in_singleValue1600);  
					stream_LOCAL.add(LOCAL93);

					ARGUMENTS94=(Token)match(input,ARGUMENTS,FOLLOW_ARGUMENTS_in_singleValue1602);  
					stream_ARGUMENTS.add(ARGUMENTS94);

					// AST REWRITE
					// elements: LOCAL, ARGUMENTS
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (Object)adaptor.nil();
					// 499:34: -> ^( LOCAL ARGUMENTS )
					{
						// CSS.g:499:37: ^( LOCAL ARGUMENTS )
						{
						Object root_1 = (Object)adaptor.nil();
						root_1 = (Object)adaptor.becomeRoot(stream_LOCAL.nextNode(), root_1);
						adaptor.addChild(root_1, stream_ARGUMENTS.nextNode());
						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;
				case 9 :
					// CSS.g:500:9: CALC ARGUMENTS
					{
					CALC95=(Token)match(input,CALC,FOLLOW_CALC_in_singleValue1629);  
					stream_CALC.add(CALC95);

					ARGUMENTS96=(Token)match(input,ARGUMENTS,FOLLOW_ARGUMENTS_in_singleValue1631);  
					stream_ARGUMENTS.add(ARGUMENTS96);

					// AST REWRITE
					// elements: CALC, ARGUMENTS
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (Object)adaptor.nil();
					// 500:33: -> ^( CALC ARGUMENTS )
					{
						// CSS.g:500:36: ^( CALC ARGUMENTS )
						{
						Object root_1 = (Object)adaptor.nil();
						root_1 = (Object)adaptor.becomeRoot(stream_CALC.nextNode(), root_1);
						adaptor.addChild(root_1, stream_ARGUMENTS.nextNode());
						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;
				case 10 :
					// CSS.g:501:9: VAR ARGUMENTS
					{
					VAR97=(Token)match(input,VAR,FOLLOW_VAR_in_singleValue1658);  
					stream_VAR.add(VAR97);

					ARGUMENTS98=(Token)match(input,ARGUMENTS,FOLLOW_ARGUMENTS_in_singleValue1660);  
					stream_ARGUMENTS.add(ARGUMENTS98);

					// AST REWRITE
					// elements: VAR, ARGUMENTS
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (Object)adaptor.nil();
					// 501:32: -> ^( VAR ARGUMENTS )
					{
						// CSS.g:501:35: ^( VAR ARGUMENTS )
						{
						Object root_1 = (Object)adaptor.nil();
						root_1 = (Object)adaptor.becomeRoot(stream_VAR.nextNode(), root_1);
						adaptor.addChild(root_1, stream_ARGUMENTS.nextNode());
						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;
				case 11 :
					// CSS.g:502:9: FUNCTIONS ARGUMENTS
					{
					FUNCTIONS99=(Token)match(input,FUNCTIONS,FOLLOW_FUNCTIONS_in_singleValue1687);  
					stream_FUNCTIONS.add(FUNCTIONS99);

					ARGUMENTS100=(Token)match(input,ARGUMENTS,FOLLOW_ARGUMENTS_in_singleValue1689);  
					stream_ARGUMENTS.add(ARGUMENTS100);

					// AST REWRITE
					// elements: FUNCTIONS, ARGUMENTS
					// token labels: 
					// rule labels: retval
					// token list labels: 
					// rule list labels: 
					// wildcard labels: 
					retval.tree = root_0;
					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

					root_0 = (Object)adaptor.nil();
					// 502:38: -> ^( FUNCTIONS ARGUMENTS )
					{
						// CSS.g:502:41: ^( FUNCTIONS ARGUMENTS )
						{
						Object root_1 = (Object)adaptor.nil();
						root_1 = (Object)adaptor.becomeRoot(stream_FUNCTIONS.nextNode(), root_1);
						adaptor.addChild(root_1, stream_ARGUMENTS.nextNode());
						adaptor.addChild(root_0, root_1);
						}

					}


					retval.tree = root_0;

					}
					break;
				case 12 :
					// CSS.g:503:9: ALPHA_VALUE
					{
					root_0 = (Object)adaptor.nil();


					ALPHA_VALUE101=(Token)match(input,ALPHA_VALUE,FOLLOW_ALPHA_VALUE_in_singleValue1716); 
					ALPHA_VALUE101_tree = (Object)adaptor.create(ALPHA_VALUE101);
					adaptor.addChild(root_0, ALPHA_VALUE101_tree);

					}
					break;
				case 13 :
					// CSS.g:504:9: SCALE_VALUE
					{
					root_0 = (Object)adaptor.nil();


					SCALE_VALUE102=(Token)match(input,SCALE_VALUE,FOLLOW_SCALE_VALUE_in_singleValue1726); 
					SCALE_VALUE102_tree = (Object)adaptor.create(SCALE_VALUE102);
					adaptor.addChild(root_0, SCALE_VALUE102_tree);

					}
					break;
				case 14 :
					// CSS.g:505:9: RECT_VALUE
					{
					root_0 = (Object)adaptor.nil();


					RECT_VALUE103=(Token)match(input,RECT_VALUE,FOLLOW_RECT_VALUE_in_singleValue1736); 
					RECT_VALUE103_tree = (Object)adaptor.create(RECT_VALUE103);
					adaptor.addChild(root_0, RECT_VALUE103_tree);

					}
					break;
				case 15 :
					// CSS.g:506:9: ROTATE_VALUE
					{
					root_0 = (Object)adaptor.nil();


					ROTATE_VALUE104=(Token)match(input,ROTATE_VALUE,FOLLOW_ROTATE_VALUE_in_singleValue1746); 
					ROTATE_VALUE104_tree = (Object)adaptor.create(ROTATE_VALUE104);
					adaptor.addChild(root_0, ROTATE_VALUE104_tree);

					}
					break;
				case 16 :
					// CSS.g:507:9: TRANSLATE3D_VALUE
					{
					root_0 = (Object)adaptor.nil();


					TRANSLATE3D_VALUE105=(Token)match(input,TRANSLATE3D_VALUE,FOLLOW_TRANSLATE3D_VALUE_in_singleValue1756); 
					TRANSLATE3D_VALUE105_tree = (Object)adaptor.create(TRANSLATE3D_VALUE105);
					adaptor.addChild(root_0, TRANSLATE3D_VALUE105_tree);

					}
					break;
				case 17 :
					// CSS.g:508:9: MATRIX_VALUE
					{
					root_0 = (Object)adaptor.nil();


					MATRIX_VALUE106=(Token)match(input,MATRIX_VALUE,FOLLOW_MATRIX_VALUE_in_singleValue1766); 
					MATRIX_VALUE106_tree = (Object)adaptor.create(MATRIX_VALUE106);
					adaptor.addChild(root_0, MATRIX_VALUE106_tree);

					}
					break;
				case 18 :
					// CSS.g:509:9: MATRIX3D_VALUE
					{
					root_0 = (Object)adaptor.nil();


					MATRIX3D_VALUE107=(Token)match(input,MATRIX3D_VALUE,FOLLOW_MATRIX3D_VALUE_in_singleValue1776); 
					MATRIX3D_VALUE107_tree = (Object)adaptor.create(MATRIX3D_VALUE107);
					adaptor.addChild(root_0, MATRIX3D_VALUE107_tree);

					}
					break;
				case 19 :
					// CSS.g:510:9: RGB
					{
					root_0 = (Object)adaptor.nil();


					RGB108=(Token)match(input,RGB,FOLLOW_RGB_in_singleValue1786); 
					RGB108_tree = (Object)adaptor.create(RGB108);
					adaptor.addChild(root_0, RGB108_tree);

					}
					break;
				case 20 :
					// CSS.g:511:9: RGBA
					{
					root_0 = (Object)adaptor.nil();


					RGBA109=(Token)match(input,RGBA,FOLLOW_RGBA_in_singleValue1796); 
					RGBA109_tree = (Object)adaptor.create(RGBA109);
					adaptor.addChild(root_0, RGBA109_tree);

					}
					break;
				case 21 :
					// CSS.g:512:9: STRING
					{
					root_0 = (Object)adaptor.nil();


					STRING110=(Token)match(input,STRING,FOLLOW_STRING_in_singleValue1806); 
					STRING110_tree = (Object)adaptor.create(STRING110);
					adaptor.addChild(root_0, STRING110_tree);

					}
					break;
				case 22 :
					// CSS.g:513:9: ID
					{
					root_0 = (Object)adaptor.nil();


					ID111=(Token)match(input,ID,FOLLOW_ID_in_singleValue1822); 
					ID111_tree = (Object)adaptor.create(ID111);
					adaptor.addChild(root_0, ID111_tree);

					}
					break;
				case 23 :
					// CSS.g:514:9: OPERATOR
					{
					root_0 = (Object)adaptor.nil();


					OPERATOR112=(Token)match(input,OPERATOR,FOLLOW_OPERATOR_in_singleValue1832); 
					OPERATOR112_tree = (Object)adaptor.create(OPERATOR112);
					adaptor.addChild(root_0, OPERATOR112_tree);

					}
					break;
				case 24 :
					// CSS.g:515:9: IMPORTANT
					{
					root_0 = (Object)adaptor.nil();


					IMPORTANT113=(Token)match(input,IMPORTANT,FOLLOW_IMPORTANT_in_singleValue1842); 
					IMPORTANT113_tree = (Object)adaptor.create(IMPORTANT113);
					adaptor.addChild(root_0, IMPORTANT113_tree);

					}
					break;

			}
			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "singleValue"


	public static class formatOption_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "formatOption"
	// CSS.g:518:1: formatOption : FORMAT ARGUMENTS -> ^( FORMAT ARGUMENTS ) ;
	public final CSSParser.formatOption_return formatOption() throws RecognitionException {
		CSSParser.formatOption_return retval = new CSSParser.formatOption_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token FORMAT114=null;
		Token ARGUMENTS115=null;

		Object FORMAT114_tree=null;
		Object ARGUMENTS115_tree=null;
		RewriteRuleTokenStream stream_ARGUMENTS=new RewriteRuleTokenStream(adaptor,"token ARGUMENTS");
		RewriteRuleTokenStream stream_FORMAT=new RewriteRuleTokenStream(adaptor,"token FORMAT");

		try {
			// CSS.g:519:5: ( FORMAT ARGUMENTS -> ^( FORMAT ARGUMENTS ) )
			// CSS.g:519:9: FORMAT ARGUMENTS
			{
			FORMAT114=(Token)match(input,FORMAT,FOLLOW_FORMAT_in_formatOption1862);  
			stream_FORMAT.add(FORMAT114);

			ARGUMENTS115=(Token)match(input,ARGUMENTS,FOLLOW_ARGUMENTS_in_formatOption1864);  
			stream_ARGUMENTS.add(ARGUMENTS115);

			// AST REWRITE
			// elements: ARGUMENTS, FORMAT
			// token labels: 
			// rule labels: retval
			// token list labels: 
			// rule list labels: 
			// wildcard labels: 
			retval.tree = root_0;
			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);

			root_0 = (Object)adaptor.nil();
			// 519:26: -> ^( FORMAT ARGUMENTS )
			{
				// CSS.g:519:29: ^( FORMAT ARGUMENTS )
				{
				Object root_1 = (Object)adaptor.nil();
				root_1 = (Object)adaptor.becomeRoot(stream_FORMAT.nextNode(), root_1);
				adaptor.addChild(root_1, stream_ARGUMENTS.nextNode());
				adaptor.addChild(root_0, root_1);
				}

			}


			retval.tree = root_0;

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "formatOption"


	public static class attributeSelector_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "attributeSelector"
	// CSS.g:522:1: attributeSelector : SQUARE_OPEN attributeName ( attributeOperator )* ( attributeValue )* SQUARE_END ;
	public final CSSParser.attributeSelector_return attributeSelector() throws RecognitionException {
		CSSParser.attributeSelector_return retval = new CSSParser.attributeSelector_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token SQUARE_OPEN116=null;
		Token SQUARE_END120=null;
		ParserRuleReturnScope attributeName117 =null;
		ParserRuleReturnScope attributeOperator118 =null;
		ParserRuleReturnScope attributeValue119 =null;

		Object SQUARE_OPEN116_tree=null;
		Object SQUARE_END120_tree=null;

		try {
			// CSS.g:523:5: ( SQUARE_OPEN attributeName ( attributeOperator )* ( attributeValue )* SQUARE_END )
			// CSS.g:523:9: SQUARE_OPEN attributeName ( attributeOperator )* ( attributeValue )* SQUARE_END
			{
			root_0 = (Object)adaptor.nil();


			SQUARE_OPEN116=(Token)match(input,SQUARE_OPEN,FOLLOW_SQUARE_OPEN_in_attributeSelector1892); 
			SQUARE_OPEN116_tree = (Object)adaptor.create(SQUARE_OPEN116);
			adaptor.addChild(root_0, SQUARE_OPEN116_tree);

			pushFollow(FOLLOW_attributeName_in_attributeSelector1894);
			attributeName117=attributeName();
			state._fsp--;

			adaptor.addChild(root_0, attributeName117.getTree());

			// CSS.g:523:35: ( attributeOperator )*
			loop24:
			while (true) {
				int alt24=2;
				int LA24_0 = input.LA(1);
				if ( (LA24_0==BEGINS_WITH||LA24_0==CONTAINS||(LA24_0 >= ENDS_WITH && LA24_0 <= EQUALS)||LA24_0==HREFLANG_MATCH||LA24_0==LIST_MATCH) ) {
					alt24=1;
				}

				switch (alt24) {
				case 1 :
					// CSS.g:523:35: attributeOperator
					{
					pushFollow(FOLLOW_attributeOperator_in_attributeSelector1896);
					attributeOperator118=attributeOperator();
					state._fsp--;

					adaptor.addChild(root_0, attributeOperator118.getTree());

					}
					break;

				default :
					break loop24;
				}
			}

			// CSS.g:523:54: ( attributeValue )*
			loop25:
			while (true) {
				int alt25=2;
				int LA25_0 = input.LA(1);
				if ( (LA25_0==ID||LA25_0==STRING) ) {
					alt25=1;
				}

				switch (alt25) {
				case 1 :
					// CSS.g:523:54: attributeValue
					{
					pushFollow(FOLLOW_attributeValue_in_attributeSelector1899);
					attributeValue119=attributeValue();
					state._fsp--;

					adaptor.addChild(root_0, attributeValue119.getTree());

					}
					break;

				default :
					break loop25;
				}
			}

			SQUARE_END120=(Token)match(input,SQUARE_END,FOLLOW_SQUARE_END_in_attributeSelector1902); 
			SQUARE_END120_tree = (Object)adaptor.create(SQUARE_END120);
			adaptor.addChild(root_0, SQUARE_END120_tree);

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "attributeSelector"


	public static class attributeName_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "attributeName"
	// CSS.g:526:1: attributeName : ID ;
	public final CSSParser.attributeName_return attributeName() throws RecognitionException {
		CSSParser.attributeName_return retval = new CSSParser.attributeName_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token ID121=null;

		Object ID121_tree=null;

		try {
			// CSS.g:527:5: ( ID )
			// CSS.g:527:10: ID
			{
			root_0 = (Object)adaptor.nil();


			ID121=(Token)match(input,ID,FOLLOW_ID_in_attributeName1926); 
			ID121_tree = (Object)adaptor.create(ID121);
			adaptor.addChild(root_0, ID121_tree);

			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "attributeName"


	public static class attributeOperator_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "attributeOperator"
	// CSS.g:530:1: attributeOperator : ( BEGINS_WITH | ENDS_WITH | CONTAINS | LIST_MATCH | HREFLANG_MATCH | EQUALS );
	public final CSSParser.attributeOperator_return attributeOperator() throws RecognitionException {
		CSSParser.attributeOperator_return retval = new CSSParser.attributeOperator_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token set122=null;

		Object set122_tree=null;

		try {
			// CSS.g:531:5: ( BEGINS_WITH | ENDS_WITH | CONTAINS | LIST_MATCH | HREFLANG_MATCH | EQUALS )
			// CSS.g:
			{
			root_0 = (Object)adaptor.nil();


			set122=input.LT(1);
			if ( input.LA(1)==BEGINS_WITH||input.LA(1)==CONTAINS||(input.LA(1) >= ENDS_WITH && input.LA(1) <= EQUALS)||input.LA(1)==HREFLANG_MATCH||input.LA(1)==LIST_MATCH ) {
				input.consume();
				adaptor.addChild(root_0, (Object)adaptor.create(set122));
				state.errorRecovery=false;
			}
			else {
				MismatchedSetException mse = new MismatchedSetException(null,input);
				throw mse;
			}
			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "attributeOperator"


	public static class attributeValue_return extends ParserRuleReturnScope {
		Object tree;
		@Override
		public Object getTree() { return tree; }
	};


	// $ANTLR start "attributeValue"
	// CSS.g:539:1: attributeValue : ( STRING | ID );
	public final CSSParser.attributeValue_return attributeValue() throws RecognitionException {
		CSSParser.attributeValue_return retval = new CSSParser.attributeValue_return();
		retval.start = input.LT(1);

		Object root_0 = null;

		Token set123=null;

		Object set123_tree=null;

		try {
			// CSS.g:540:5: ( STRING | ID )
			// CSS.g:
			{
			root_0 = (Object)adaptor.nil();


			set123=input.LT(1);
			if ( input.LA(1)==ID||input.LA(1)==STRING ) {
				input.consume();
				adaptor.addChild(root_0, (Object)adaptor.create(set123));
				state.errorRecovery=false;
			}
			else {
				MismatchedSetException mse = new MismatchedSetException(null,input);
				throw mse;
			}
			}

			retval.stop = input.LT(-1);

			retval.tree = (Object)adaptor.rulePostProcessing(root_0);
			adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

		}
		catch (RecognitionException re) {
			reportError(re);
			recover(input,re);
			retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);
		}
		finally {
			// do for sure before leaving
		}
		return retval;
	}
	// $ANTLR end "attributeValue"

	// Delegated rules



	public static final BitSet FOLLOW_namespaceStatement_in_stylesheet149 = new BitSet(new long[]{0x01000004818207C0L,0x0000000000000300L});
	public static final BitSet FOLLOW_fontFace_in_stylesheet153 = new BitSet(new long[]{0x01000004818207C0L,0x0000000000000300L});
	public static final BitSet FOLLOW_keyframes_in_stylesheet157 = new BitSet(new long[]{0x01000004818207C0L,0x0000000000000300L});
	public static final BitSet FOLLOW_mediaQuery_in_stylesheet161 = new BitSet(new long[]{0x01000004818207C0L,0x0000000000000300L});
	public static final BitSet FOLLOW_ruleset_in_stylesheet165 = new BitSet(new long[]{0x01000004818207C0L,0x0000000000000300L});
	public static final BitSet FOLLOW_EOF_in_stylesheet170 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_AT_NAMESPACE_in_namespaceStatement191 = new BitSet(new long[]{0x0000000400000000L,0x0000000000000400L});
	public static final BitSet FOLLOW_ID_in_namespaceStatement193 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000400L});
	public static final BitSet FOLLOW_STRING_in_namespaceStatement196 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000040L});
	public static final BitSet FOLLOW_SEMI_COLONS_in_namespaceStatement198 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_AT_KEYFRAMES_in_keyframes241 = new BitSet(new long[]{0x0000000400000000L});
	public static final BitSet FOLLOW_ID_in_keyframes243 = new BitSet(new long[]{0x0000000000002000L});
	public static final BitSet FOLLOW_BLOCK_OPEN_in_keyframes245 = new BitSet(new long[]{0x0100000481821000L,0x0000000000000300L});
	public static final BitSet FOLLOW_ruleset_in_keyframes247 = new BitSet(new long[]{0x0100000481821000L,0x0000000000000300L});
	public static final BitSet FOLLOW_BLOCK_END_in_keyframes250 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_AT_WEBKIT_KEYFRAMES_in_keyframes276 = new BitSet(new long[]{0x0000000400000000L});
	public static final BitSet FOLLOW_ID_in_keyframes278 = new BitSet(new long[]{0x0000000000002000L});
	public static final BitSet FOLLOW_BLOCK_OPEN_in_keyframes280 = new BitSet(new long[]{0x0100000481821000L,0x0000000000000300L});
	public static final BitSet FOLLOW_ruleset_in_keyframes282 = new BitSet(new long[]{0x0100000481821000L,0x0000000000000300L});
	public static final BitSet FOLLOW_BLOCK_END_in_keyframes285 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_AT_MEDIA_in_mediaQuery324 = new BitSet(new long[]{0x0400000400040020L});
	public static final BitSet FOLLOW_medium_in_mediaQuery326 = new BitSet(new long[]{0x0000000000002000L});
	public static final BitSet FOLLOW_BLOCK_OPEN_in_mediaQuery328 = new BitSet(new long[]{0x0100000481821000L,0x0000000000000300L});
	public static final BitSet FOLLOW_ruleset_in_mediaQuery330 = new BitSet(new long[]{0x0100000481821000L,0x0000000000000300L});
	public static final BitSet FOLLOW_BLOCK_END_in_mediaQuery333 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_mediumCondition_in_medium373 = new BitSet(new long[]{0x0400000400040022L,0x0000000000020000L});
	public static final BitSet FOLLOW_81_in_medium416 = new BitSet(new long[]{0x0400000400040020L});
	public static final BitSet FOLLOW_mediumCondition_in_medium431 = new BitSet(new long[]{0x0400000400040022L,0x0000000000020000L});
	public static final BitSet FOLLOW_mediumCondition_in_medium447 = new BitSet(new long[]{0x0400000400040022L,0x0000000000020000L});
	public static final BitSet FOLLOW_ID_in_mediumCondition498 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_ONLY_in_mediumCondition508 = new BitSet(new long[]{0x0000000400000000L});
	public static final BitSet FOLLOW_ID_in_mediumCondition510 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_ARGUMENTS_in_mediumCondition524 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_COMMA_in_mediumCondition534 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_AT_FONT_FACE_in_fontFace563 = new BitSet(new long[]{0x0000000000002000L});
	public static final BitSet FOLLOW_declarationsBlock_in_fontFace565 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_selectorGroup_in_ruleset596 = new BitSet(new long[]{0x0000000000002000L});
	public static final BitSet FOLLOW_declarationsBlock_in_ruleset598 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_compoundSelector_in_selectorGroup632 = new BitSet(new long[]{0x0000000000040002L});
	public static final BitSet FOLLOW_COMMA_in_selectorGroup636 = new BitSet(new long[]{0x0100000481820000L,0x0000000000000300L});
	public static final BitSet FOLLOW_compoundSelector_in_selectorGroup638 = new BitSet(new long[]{0x0000000000040002L});
	public static final BitSet FOLLOW_simpleSelectorFraction_in_compoundSelector703 = new BitSet(new long[]{0x4100000481828002L,0x0000000000000300L});
	public static final BitSet FOLLOW_PRECEDED_in_compoundSelector707 = new BitSet(new long[]{0x0100000481820002L,0x0000000000000300L});
	public static final BitSet FOLLOW_CHILD_in_compoundSelector711 = new BitSet(new long[]{0x0100000481820002L,0x0000000000000300L});
	public static final BitSet FOLLOW_condition_in_simpleSelectorFraction784 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_element_in_simpleSelectorFraction795 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_DOT_in_condition821 = new BitSet(new long[]{0x0000000400000000L});
	public static final BitSet FOLLOW_ID_in_condition824 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_HASH_WORD_in_condition836 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_COLON_in_condition849 = new BitSet(new long[]{0x0020000000000000L});
	public static final BitSet FOLLOW_NOT_in_condition852 = new BitSet(new long[]{0x0000000000000020L});
	public static final BitSet FOLLOW_ARGUMENTS_in_condition854 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_COLON_in_condition867 = new BitSet(new long[]{0x0000000400000000L});
	public static final BitSet FOLLOW_ID_in_condition870 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_DOUBLE_COLON_in_condition883 = new BitSet(new long[]{0x0000000400000000L});
	public static final BitSet FOLLOW_ID_in_condition886 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_attributeSelector_in_condition899 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_ID_in_element933 = new BitSet(new long[]{0x2000000000000000L});
	public static final BitSet FOLLOW_PIPE_in_element935 = new BitSet(new long[]{0x0000000400000000L});
	public static final BitSet FOLLOW_ID_in_element938 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_NUMBER_WITH_PERCENT_in_element948 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_ID_in_element970 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_STAR_in_element990 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_BLOCK_OPEN_in_declarationsBlock1019 = new BitSet(new long[]{0x0000000400201000L,0x0000000000000040L});
	public static final BitSet FOLLOW_SEMI_COLONS_in_declarationsBlock1047 = new BitSet(new long[]{0x0000000400200000L});
	public static final BitSet FOLLOW_declaration_in_declarationsBlock1065 = new BitSet(new long[]{0x0000000000001000L,0x0000000000000040L});
	public static final BitSet FOLLOW_SEMI_COLONS_in_declarationsBlock1099 = new BitSet(new long[]{0x0000000400200000L});
	public static final BitSet FOLLOW_declaration_in_declarationsBlock1118 = new BitSet(new long[]{0x0000000000001000L,0x0000000000000040L});
	public static final BitSet FOLLOW_SEMI_COLONS_in_declarationsBlock1148 = new BitSet(new long[]{0x0000000000001000L});
	public static final BitSet FOLLOW_BLOCK_END_in_declarationsBlock1171 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_ID_in_declaration1211 = new BitSet(new long[]{0x0000000000020000L});
	public static final BitSet FOLLOW_COLON_in_declaration1213 = new BitSet(new long[]{0x8B1C000CC2014010L,0x000000000000E42FL});
	public static final BitSet FOLLOW_value_in_declaration1215 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_DASHED_ID_in_declaration1235 = new BitSet(new long[]{0x0000000000020000L});
	public static final BitSet FOLLOW_COLON_in_declaration1237 = new BitSet(new long[]{0x8B1C000CC2014010L,0x000000000000E42FL});
	public static final BitSet FOLLOW_value_in_declaration1239 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_multiValue_in_value1285 = new BitSet(new long[]{0x0000000000040002L});
	public static final BitSet FOLLOW_COMMA_in_value1289 = new BitSet(new long[]{0x8B1C000CC2014010L,0x000000000000E42FL});
	public static final BitSet FOLLOW_multiValue_in_value1291 = new BitSet(new long[]{0x0000000000040002L});
	public static final BitSet FOLLOW_singleValue_in_multiValue1372 = new BitSet(new long[]{0x8B1C000CC2014012L,0x000000000000E42FL});
	public static final BitSet FOLLOW_singleValue_in_multiValue1376 = new BitSet(new long[]{0x8B1C000CC2014012L,0x000000000000E42FL});
	public static final BitSet FOLLOW_NUMBER_WITH_PERCENT_in_singleValue1446 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_NUMBER_WITH_UNIT_in_singleValue1456 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_HASH_WORD_in_singleValue1466 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_CLASS_REFERENCE_in_singleValue1476 = new BitSet(new long[]{0x0000000000000020L});
	public static final BitSet FOLLOW_ARGUMENTS_in_singleValue1478 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_PROPERTY_REFERENCE_in_singleValue1508 = new BitSet(new long[]{0x0000000000000020L});
	public static final BitSet FOLLOW_ARGUMENTS_in_singleValue1510 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_EMBED_in_singleValue1540 = new BitSet(new long[]{0x0000000000000020L});
	public static final BitSet FOLLOW_ARGUMENTS_in_singleValue1542 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_URL_in_singleValue1572 = new BitSet(new long[]{0x0000000000000020L});
	public static final BitSet FOLLOW_ARGUMENTS_in_singleValue1574 = new BitSet(new long[]{0x0000000020000002L});
	public static final BitSet FOLLOW_formatOption_in_singleValue1576 = new BitSet(new long[]{0x0000000020000002L});
	public static final BitSet FOLLOW_LOCAL_in_singleValue1600 = new BitSet(new long[]{0x0000000000000020L});
	public static final BitSet FOLLOW_ARGUMENTS_in_singleValue1602 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_CALC_in_singleValue1629 = new BitSet(new long[]{0x0000000000000020L});
	public static final BitSet FOLLOW_ARGUMENTS_in_singleValue1631 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_VAR_in_singleValue1658 = new BitSet(new long[]{0x0000000000000020L});
	public static final BitSet FOLLOW_ARGUMENTS_in_singleValue1660 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_FUNCTIONS_in_singleValue1687 = new BitSet(new long[]{0x0000000000000020L});
	public static final BitSet FOLLOW_ARGUMENTS_in_singleValue1689 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_ALPHA_VALUE_in_singleValue1716 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_SCALE_VALUE_in_singleValue1726 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_RECT_VALUE_in_singleValue1736 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_ROTATE_VALUE_in_singleValue1746 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_TRANSLATE3D_VALUE_in_singleValue1756 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_MATRIX_VALUE_in_singleValue1766 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_MATRIX3D_VALUE_in_singleValue1776 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_RGB_in_singleValue1786 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_RGBA_in_singleValue1796 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_STRING_in_singleValue1806 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_ID_in_singleValue1822 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_OPERATOR_in_singleValue1832 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_IMPORTANT_in_singleValue1842 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_FORMAT_in_formatOption1862 = new BitSet(new long[]{0x0000000000000020L});
	public static final BitSet FOLLOW_ARGUMENTS_in_formatOption1864 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_SQUARE_OPEN_in_attributeSelector1892 = new BitSet(new long[]{0x0000000400000000L});
	public static final BitSet FOLLOW_attributeName_in_attributeSelector1894 = new BitSet(new long[]{0x000200060C100800L,0x0000000000000480L});
	public static final BitSet FOLLOW_attributeOperator_in_attributeSelector1896 = new BitSet(new long[]{0x000200060C100800L,0x0000000000000480L});
	public static final BitSet FOLLOW_attributeValue_in_attributeSelector1899 = new BitSet(new long[]{0x0000000400000000L,0x0000000000000480L});
	public static final BitSet FOLLOW_SQUARE_END_in_attributeSelector1902 = new BitSet(new long[]{0x0000000000000002L});
	public static final BitSet FOLLOW_ID_in_attributeName1926 = new BitSet(new long[]{0x0000000000000002L});
}