/*
* generated by Xtext
*/
grammar InternalCSS;

options {
	superClass=AbstractInternalContentAssistParser;
	
}

@lexer::header {
package org.eclipse.e4.ui.contentassist.antlr.internal;

// Hack: Use our own Lexer superclass by means of import. 
// Currently there is no other way to specify the superclass for the lexer.
import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.Lexer;
}

@parser::header {
package org.eclipse.e4.ui.contentassist.antlr.internal; 

import java.io.InputStream;
import org.eclipse.xtext.*;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.parser.impl.*;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.DFA;
import org.eclipse.e4.services.CSSGrammarAccess;

}

@parser::members {
 
 	private CSSGrammarAccess grammarAccess;
 	
    public void setGrammarAccess(CSSGrammarAccess grammarAccess) {
    	this.grammarAccess = grammarAccess;
    }
    
    @Override
    protected Grammar getGrammar() {
    	return grammarAccess.getGrammar();
    }
    
    @Override
    protected String getValueForTokenName(String tokenName) {
    	return tokenName;
    }

}




// Entry rule entryRulestylesheet
entryRulestylesheet 
:
{ before(grammarAccess.getStylesheetRule()); }
	 rulestylesheet
{ after(grammarAccess.getStylesheetRule()); } 
	 EOF 
;

// Rule stylesheet
rulestylesheet
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getStylesheetAccess().getGroup()); }
(rule__Stylesheet__Group__0)
{ after(grammarAccess.getStylesheetAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleRules
entryRuleRules 
:
{ before(grammarAccess.getRulesRule()); }
	 ruleRules
{ after(grammarAccess.getRulesRule()); } 
	 EOF 
;

// Rule Rules
ruleRules
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getRulesAccess().getGroup()); }
(rule__Rules__Group__0)
{ after(grammarAccess.getRulesAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRulecss_import
entryRulecss_import 
:
{ before(grammarAccess.getCss_importRule()); }
	 rulecss_import
{ after(grammarAccess.getCss_importRule()); } 
	 EOF 
;

// Rule css_import
rulecss_import
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getCss_importAccess().getGroup()); }
(rule__Css_import__Group__0)
{ after(grammarAccess.getCss_importAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleselector
entryRuleselector 
@init {
	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
}
:
{ before(grammarAccess.getSelectorRule()); }
	 ruleselector
{ after(grammarAccess.getSelectorRule()); } 
	 EOF 
;
finally {
	myHiddenTokenState.restore();
}

// Rule selector
ruleselector
    @init {
		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getSelectorAccess().getGroup()); }
(rule__Selector__Group__0)
{ after(grammarAccess.getSelectorAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
	myHiddenTokenState.restore();
}



// Entry rule entryRulesimple_selector
entryRulesimple_selector 
:
{ before(grammarAccess.getSimple_selectorRule()); }
	 rulesimple_selector
{ after(grammarAccess.getSimple_selectorRule()); } 
	 EOF 
;

// Rule simple_selector
rulesimple_selector
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getSimple_selectorAccess().getAlternatives()); }
(rule__Simple_selector__Alternatives)
{ after(grammarAccess.getSimple_selectorAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRulepseudo
entryRulepseudo 
:
{ before(grammarAccess.getPseudoRule()); }
	 rulepseudo
{ after(grammarAccess.getPseudoRule()); } 
	 EOF 
;

// Rule pseudo
rulepseudo
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getPseudoAccess().getAlternatives()); }
(rule__Pseudo__Alternatives)
{ after(grammarAccess.getPseudoAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleelement_name
entryRuleelement_name 
:
{ before(grammarAccess.getElement_nameRule()); }
	 ruleelement_name
{ after(grammarAccess.getElement_nameRule()); } 
	 EOF 
;

// Rule element_name
ruleelement_name
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getElement_nameAccess().getAlternatives()); }
(rule__Element_name__Alternatives)
{ after(grammarAccess.getElement_nameAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuledeclaration
entryRuledeclaration 
:
{ before(grammarAccess.getDeclarationRule()); }
	 ruledeclaration
{ after(grammarAccess.getDeclarationRule()); } 
	 EOF 
;

// Rule declaration
ruledeclaration
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getDeclarationAccess().getGroup()); }
(rule__Declaration__Group__0)
{ after(grammarAccess.getDeclarationAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleexpr
entryRuleexpr 
:
{ before(grammarAccess.getExprRule()); }
	 ruleexpr
{ after(grammarAccess.getExprRule()); } 
	 EOF 
;

// Rule expr
ruleexpr
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getExprAccess().getGroup()); }
(rule__Expr__Group__0)
{ after(grammarAccess.getExprAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleterm
entryRuleterm 
:
{ before(grammarAccess.getTermRule()); }
	 ruleterm
{ after(grammarAccess.getTermRule()); } 
	 EOF 
;

// Rule term
ruleterm
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getTermAccess().getAlternatives()); }
(rule__Term__Alternatives)
{ after(grammarAccess.getTermAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRulefunction
entryRulefunction 
:
{ before(grammarAccess.getFunctionRule()); }
	 rulefunction
{ after(grammarAccess.getFunctionRule()); } 
	 EOF 
;

// Rule function
rulefunction
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getFunctionAccess().getGroup()); }
(rule__Function__Group__0)
{ after(grammarAccess.getFunctionAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleURI
entryRuleURI 
:
{ before(grammarAccess.getURIRule()); }
	 ruleURI
{ after(grammarAccess.getURIRule()); } 
	 EOF 
;

// Rule URI
ruleURI
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getURIAccess().getGroup()); }
(rule__URI__Group__0)
{ after(grammarAccess.getURIAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleunary_numbers
entryRuleunary_numbers 
:
{ before(grammarAccess.getUnary_numbersRule()); }
	 ruleunary_numbers
{ after(grammarAccess.getUnary_numbersRule()); } 
	 EOF 
;

// Rule unary_numbers
ruleunary_numbers
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getUnary_numbersAccess().getAlternatives()); }
(rule__Unary_numbers__Alternatives)
{ after(grammarAccess.getUnary_numbersAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRulePERCENTAGE
entryRulePERCENTAGE 
:
{ before(grammarAccess.getPERCENTAGERule()); }
	 rulePERCENTAGE
{ after(grammarAccess.getPERCENTAGERule()); } 
	 EOF 
;

// Rule PERCENTAGE
rulePERCENTAGE
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getPERCENTAGEAccess().getGroup()); }
(rule__PERCENTAGE__Group__0)
{ after(grammarAccess.getPERCENTAGEAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleEMS
entryRuleEMS 
:
{ before(grammarAccess.getEMSRule()); }
	 ruleEMS
{ after(grammarAccess.getEMSRule()); } 
	 EOF 
;

// Rule EMS
ruleEMS
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getEMSAccess().getGroup()); }
(rule__EMS__Group__0)
{ after(grammarAccess.getEMSAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleEXS
entryRuleEXS 
:
{ before(grammarAccess.getEXSRule()); }
	 ruleEXS
{ after(grammarAccess.getEXSRule()); } 
	 EOF 
;

// Rule EXS
ruleEXS
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getEXSAccess().getGroup()); }
(rule__EXS__Group__0)
{ after(grammarAccess.getEXSAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleLENGTH
entryRuleLENGTH 
@init {
	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
}
:
{ before(grammarAccess.getLENGTHRule()); }
	 ruleLENGTH
{ after(grammarAccess.getLENGTHRule()); } 
	 EOF 
;
finally {
	myHiddenTokenState.restore();
}

// Rule LENGTH
ruleLENGTH
    @init {
		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getLENGTHAccess().getGroup()); }
(rule__LENGTH__Group__0)
{ after(grammarAccess.getLENGTHAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
	myHiddenTokenState.restore();
}



// Entry rule entryRuleANGLE
entryRuleANGLE 
:
{ before(grammarAccess.getANGLERule()); }
	 ruleANGLE
{ after(grammarAccess.getANGLERule()); } 
	 EOF 
;

// Rule ANGLE
ruleANGLE
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getANGLEAccess().getGroup()); }
(rule__ANGLE__Group__0)
{ after(grammarAccess.getANGLEAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleTIME
entryRuleTIME 
:
{ before(grammarAccess.getTIMERule()); }
	 ruleTIME
{ after(grammarAccess.getTIMERule()); } 
	 EOF 
;

// Rule TIME
ruleTIME
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getTIMEAccess().getGroup()); }
(rule__TIME__Group__0)
{ after(grammarAccess.getTIMEAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRuleFREQ
entryRuleFREQ 
:
{ before(grammarAccess.getFREQRule()); }
	 ruleFREQ
{ after(grammarAccess.getFREQRule()); } 
	 EOF 
;

// Rule FREQ
ruleFREQ
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getFREQAccess().getGroup()); }
(rule__FREQ__Group__0)
{ after(grammarAccess.getFREQAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRulecss_hash_class
entryRulecss_hash_class 
:
{ before(grammarAccess.getCss_hash_classRule()); }
	 rulecss_hash_class
{ after(grammarAccess.getCss_hash_classRule()); } 
	 EOF 
;

// Rule css_hash_class
rulecss_hash_class
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getCss_hash_classAccess().getGroup()); }
(rule__Css_hash_class__Group__0)
{ after(grammarAccess.getCss_hash_classAccess().getGroup()); }
)

;
finally {
	restoreStackSize(stackSize);
}



// Entry rule entryRulecombinator
entryRulecombinator 
@init {
	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens("RULE_WS");
}
:
{ before(grammarAccess.getCombinatorRule()); }
	 rulecombinator
{ after(grammarAccess.getCombinatorRule()); } 
	 EOF 
;
finally {
	myHiddenTokenState.restore();
}

// Rule combinator
rulecombinator
    @init {
		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens("RULE_WS");
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getCombinatorAccess().getAlternatives()); }
(rule__Combinator__Alternatives)
{ after(grammarAccess.getCombinatorAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
	myHiddenTokenState.restore();
}



// Entry rule entryRuleunary_operator
entryRuleunary_operator 
:
{ before(grammarAccess.getUnary_operatorRule()); }
	 ruleunary_operator
{ after(grammarAccess.getUnary_operatorRule()); } 
	 EOF 
;

// Rule unary_operator
ruleunary_operator
    @init {
		int stackSize = keepStackSize();
    }
	:
(
{ before(grammarAccess.getUnary_operatorAccess().getAlternatives()); }
(rule__Unary_operator__Alternatives)
{ after(grammarAccess.getUnary_operatorAccess().getAlternatives()); }
)

;
finally {
	restoreStackSize(stackSize);
}




rule__Css_import__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getCss_importAccess().getString_nameAssignment_1_0()); }
(rule__Css_import__String_nameAssignment_1_0)
{ after(grammarAccess.getCss_importAccess().getString_nameAssignment_1_0()); }
)

    |(
{ before(grammarAccess.getCss_importAccess().getURIParserRuleCall_1_1()); }
	ruleURI
{ after(grammarAccess.getCss_importAccess().getURIParserRuleCall_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSelectorAccess().getGroup_1_0()); }
(rule__Selector__Group_1_0__0)
{ after(grammarAccess.getSelectorAccess().getGroup_1_0()); }
)

    |(
{ before(grammarAccess.getSelectorAccess().getGroup_1_1()); }
(rule__Selector__Group_1_1__0)
{ after(grammarAccess.getSelectorAccess().getGroup_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Simple_selector__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSimple_selectorAccess().getGroup_0()); }
(rule__Simple_selector__Group_0__0)
{ after(grammarAccess.getSimple_selectorAccess().getGroup_0()); }
)

    |(
(
{ before(grammarAccess.getSimple_selectorAccess().getIdAssignment_1()); }
(rule__Simple_selector__IdAssignment_1)
{ after(grammarAccess.getSimple_selectorAccess().getIdAssignment_1()); }
)
(
{ before(grammarAccess.getSimple_selectorAccess().getIdAssignment_1()); }
(rule__Simple_selector__IdAssignment_1)*
{ after(grammarAccess.getSimple_selectorAccess().getIdAssignment_1()); }
)
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Pseudo__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getPseudoAccess().getGroup_0()); }
(rule__Pseudo__Group_0__0)
{ after(grammarAccess.getPseudoAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getPseudoAccess().getGroup_1()); }
(rule__Pseudo__Group_1__0)
{ after(grammarAccess.getPseudoAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Element_name__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getElement_nameAccess().getNameAssignment_0()); }
(rule__Element_name__NameAssignment_0)
{ after(grammarAccess.getElement_nameAccess().getNameAssignment_0()); }
)

    |(
{ before(grammarAccess.getElement_nameAccess().getNameAssignment_1()); }
(rule__Element_name__NameAssignment_1)
{ after(grammarAccess.getElement_nameAccess().getNameAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Expr__OperatorsAlternatives_1_0_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getExprAccess().getOperatorsSolidusKeyword_1_0_0_0()); }

	'/' 

{ after(grammarAccess.getExprAccess().getOperatorsSolidusKeyword_1_0_0_0()); }
)

    |(
{ before(grammarAccess.getExprAccess().getOperatorsCommaKeyword_1_0_0_1()); }

	',' 

{ after(grammarAccess.getExprAccess().getOperatorsCommaKeyword_1_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Term__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTermAccess().getGroup_0()); }
(rule__Term__Group_0__0)
{ after(grammarAccess.getTermAccess().getGroup_0()); }
)

    |(
{ before(grammarAccess.getTermAccess().getNameAssignment_1()); }
(rule__Term__NameAssignment_1)
{ after(grammarAccess.getTermAccess().getNameAssignment_1()); }
)

    |(
{ before(grammarAccess.getTermAccess().getIdAssignment_2()); }
(rule__Term__IdAssignment_2)
{ after(grammarAccess.getTermAccess().getIdAssignment_2()); }
)

    |(
{ before(grammarAccess.getTermAccess().getUriAssignment_3()); }
(rule__Term__UriAssignment_3)
{ after(grammarAccess.getTermAccess().getUriAssignment_3()); }
)

    |(
{ before(grammarAccess.getTermAccess().getColorAssignment_4()); }
(rule__Term__ColorAssignment_4)
{ after(grammarAccess.getTermAccess().getColorAssignment_4()); }
)

    |(
{ before(grammarAccess.getTermAccess().getFunctionAssignment_5()); }
(rule__Term__FunctionAssignment_5)
{ after(grammarAccess.getTermAccess().getFunctionAssignment_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__URI__Alternatives_3
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getNameAssignment_3_0()); }
(rule__URI__NameAssignment_3_0)
{ after(grammarAccess.getURIAccess().getNameAssignment_3_0()); }
)

    |(
{ before(grammarAccess.getURIAccess().getGroup_3_1()); }
(rule__URI__Group_3_1__0)
{ after(grammarAccess.getURIAccess().getGroup_3_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__URI__Alternatives_3_1_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getReverseSolidusKeyword_3_1_0_0()); }

	'\\' 

{ after(grammarAccess.getURIAccess().getReverseSolidusKeyword_3_1_0_0()); }
)

    |(
{ before(grammarAccess.getURIAccess().getSolidusKeyword_3_1_0_1()); }

	'/' 

{ after(grammarAccess.getURIAccess().getSolidusKeyword_3_1_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Unary_numbers__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getUnary_numbersAccess().getINTTerminalRuleCall_0()); }
	RULE_INT
{ after(grammarAccess.getUnary_numbersAccess().getINTTerminalRuleCall_0()); }
)

    |(
{ before(grammarAccess.getUnary_numbersAccess().getPERCENTAGEParserRuleCall_1()); }
	rulePERCENTAGE
{ after(grammarAccess.getUnary_numbersAccess().getPERCENTAGEParserRuleCall_1()); }
)

    |(
{ before(grammarAccess.getUnary_numbersAccess().getLENGTHParserRuleCall_2()); }
	ruleLENGTH
{ after(grammarAccess.getUnary_numbersAccess().getLENGTHParserRuleCall_2()); }
)

    |(
{ before(grammarAccess.getUnary_numbersAccess().getEMSParserRuleCall_3()); }
	ruleEMS
{ after(grammarAccess.getUnary_numbersAccess().getEMSParserRuleCall_3()); }
)

    |(
{ before(grammarAccess.getUnary_numbersAccess().getEXSParserRuleCall_4()); }
	ruleEXS
{ after(grammarAccess.getUnary_numbersAccess().getEXSParserRuleCall_4()); }
)

    |(
{ before(grammarAccess.getUnary_numbersAccess().getANGLEParserRuleCall_5()); }
	ruleANGLE
{ after(grammarAccess.getUnary_numbersAccess().getANGLEParserRuleCall_5()); }
)

    |(
{ before(grammarAccess.getUnary_numbersAccess().getTIMEParserRuleCall_6()); }
	ruleTIME
{ after(grammarAccess.getUnary_numbersAccess().getTIMEParserRuleCall_6()); }
)

    |(
{ before(grammarAccess.getUnary_numbersAccess().getFREQParserRuleCall_7()); }
	ruleFREQ
{ after(grammarAccess.getUnary_numbersAccess().getFREQParserRuleCall_7()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__LENGTH__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLENGTHAccess().getPxKeyword_1_0()); }

	'px' 

{ after(grammarAccess.getLENGTHAccess().getPxKeyword_1_0()); }
)

    |(
{ before(grammarAccess.getLENGTHAccess().getCmKeyword_1_1()); }

	'cm' 

{ after(grammarAccess.getLENGTHAccess().getCmKeyword_1_1()); }
)

    |(
{ before(grammarAccess.getLENGTHAccess().getMmKeyword_1_2()); }

	'mm' 

{ after(grammarAccess.getLENGTHAccess().getMmKeyword_1_2()); }
)

    |(
{ before(grammarAccess.getLENGTHAccess().getInKeyword_1_3()); }

	'in' 

{ after(grammarAccess.getLENGTHAccess().getInKeyword_1_3()); }
)

    |(
{ before(grammarAccess.getLENGTHAccess().getPtKeyword_1_4()); }

	'pt' 

{ after(grammarAccess.getLENGTHAccess().getPtKeyword_1_4()); }
)

    |(
{ before(grammarAccess.getLENGTHAccess().getPcKeyword_1_5()); }

	'pc' 

{ after(grammarAccess.getLENGTHAccess().getPcKeyword_1_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__ANGLE__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getANGLEAccess().getDegKeyword_1_0()); }

	'deg' 

{ after(grammarAccess.getANGLEAccess().getDegKeyword_1_0()); }
)

    |(
{ before(grammarAccess.getANGLEAccess().getRadKeyword_1_1()); }

	'rad' 

{ after(grammarAccess.getANGLEAccess().getRadKeyword_1_1()); }
)

    |(
{ before(grammarAccess.getANGLEAccess().getGradKeyword_1_2()); }

	'grad' 

{ after(grammarAccess.getANGLEAccess().getGradKeyword_1_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__TIME__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTIMEAccess().getMsKeyword_1_0()); }

	'ms' 

{ after(grammarAccess.getTIMEAccess().getMsKeyword_1_0()); }
)

    |(
{ before(grammarAccess.getTIMEAccess().getSKeyword_1_1()); }

	's' 

{ after(grammarAccess.getTIMEAccess().getSKeyword_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__FREQ__Alternatives_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFREQAccess().getHzKeyword_1_0()); }

	'hz' 

{ after(grammarAccess.getFREQAccess().getHzKeyword_1_0()); }
)

    |(
{ before(grammarAccess.getFREQAccess().getKhzKeyword_1_1()); }

	'khz' 

{ after(grammarAccess.getFREQAccess().getKhzKeyword_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Css_hash_class__TypeAlternatives_0_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getCss_hash_classAccess().getTypeNumberSignKeyword_0_0_0()); }

	'#' 

{ after(grammarAccess.getCss_hash_classAccess().getTypeNumberSignKeyword_0_0_0()); }
)

    |(
{ before(grammarAccess.getCss_hash_classAccess().getTypeFullStopKeyword_0_0_1()); }

	'.' 

{ after(grammarAccess.getCss_hash_classAccess().getTypeFullStopKeyword_0_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Combinator__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getCombinatorAccess().getPlusSignKeyword_0()); }

	'+' 

{ after(grammarAccess.getCombinatorAccess().getPlusSignKeyword_0()); }
)

    |(
{ before(grammarAccess.getCombinatorAccess().getGreaterThanSignKeyword_1()); }

	'>' 

{ after(grammarAccess.getCombinatorAccess().getGreaterThanSignKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Unary_operator__Alternatives
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getUnary_operatorAccess().getHyphenMinusKeyword_0()); }

	'-' 

{ after(grammarAccess.getUnary_operatorAccess().getHyphenMinusKeyword_0()); }
)

    |(
{ before(grammarAccess.getUnary_operatorAccess().getPlusSignKeyword_1()); }

	'+' 

{ after(grammarAccess.getUnary_operatorAccess().getPlusSignKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}



rule__Stylesheet__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Stylesheet__Group__0__Impl
	rule__Stylesheet__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Stylesheet__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStylesheetAccess().getLocationAssignment_0()); }
(rule__Stylesheet__LocationAssignment_0)?
{ after(grammarAccess.getStylesheetAccess().getLocationAssignment_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Stylesheet__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Stylesheet__Group__1__Impl
	rule__Stylesheet__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Stylesheet__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStylesheetAccess().getImportNameAssignment_1()); }
(rule__Stylesheet__ImportNameAssignment_1)*
{ after(grammarAccess.getStylesheetAccess().getImportNameAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Stylesheet__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Stylesheet__Group__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Stylesheet__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStylesheetAccess().getRulesetAssignment_2()); }
(rule__Stylesheet__RulesetAssignment_2)*
{ after(grammarAccess.getStylesheetAccess().getRulesetAssignment_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__Rules__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Rules__Group__0__Impl
	rule__Rules__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getSelectorsAssignment_0()); }
(rule__Rules__SelectorsAssignment_0)
{ after(grammarAccess.getRulesAccess().getSelectorsAssignment_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Rules__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Rules__Group__1__Impl
	rule__Rules__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getGroup_1()); }
(rule__Rules__Group_1__0)*
{ after(grammarAccess.getRulesAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Rules__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Rules__Group__2__Impl
	rule__Rules__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getLeftCurlyBracketKeyword_2()); }

	'{' 

{ after(grammarAccess.getRulesAccess().getLeftCurlyBracketKeyword_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Rules__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Rules__Group__3__Impl
	rule__Rules__Group__4
;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getDeclarationsAssignment_3()); }
(rule__Rules__DeclarationsAssignment_3)?
{ after(grammarAccess.getRulesAccess().getDeclarationsAssignment_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Rules__Group__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Rules__Group__4__Impl
	rule__Rules__Group__5
;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__Group__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getGroup_4()); }
(rule__Rules__Group_4__0)*
{ after(grammarAccess.getRulesAccess().getGroup_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Rules__Group__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Rules__Group__5__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__Group__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getRightCurlyBracketKeyword_5()); }

	'}' 

{ after(grammarAccess.getRulesAccess().getRightCurlyBracketKeyword_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}














rule__Rules__Group_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Rules__Group_1__0__Impl
	rule__Rules__Group_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__Group_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getCommaKeyword_1_0()); }

	',' 

{ after(grammarAccess.getRulesAccess().getCommaKeyword_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Rules__Group_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Rules__Group_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__Group_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getSelectorsAssignment_1_1()); }
(rule__Rules__SelectorsAssignment_1_1)
{ after(grammarAccess.getRulesAccess().getSelectorsAssignment_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Rules__Group_4__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Rules__Group_4__0__Impl
	rule__Rules__Group_4__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__Group_4__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getSemicolonKeyword_4_0()); }

	';' 

{ after(grammarAccess.getRulesAccess().getSemicolonKeyword_4_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Rules__Group_4__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Rules__Group_4__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__Group_4__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getDeclarationsAssignment_4_1()); }
(rule__Rules__DeclarationsAssignment_4_1)?
{ after(grammarAccess.getRulesAccess().getDeclarationsAssignment_4_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Css_import__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Css_import__Group__0__Impl
	rule__Css_import__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Css_import__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getCss_importAccess().getImportKeyword_0()); }

	'@import' 

{ after(grammarAccess.getCss_importAccess().getImportKeyword_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Css_import__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Css_import__Group__1__Impl
	rule__Css_import__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Css_import__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getCss_importAccess().getAlternatives_1()); }
(rule__Css_import__Alternatives_1)
{ after(grammarAccess.getCss_importAccess().getAlternatives_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Css_import__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Css_import__Group__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Css_import__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getCss_importAccess().getSemicolonKeyword_2()); }

	';' 

{ after(grammarAccess.getCss_importAccess().getSemicolonKeyword_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__Selector__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Selector__Group__0__Impl
	rule__Selector__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSelectorAccess().getSimpleselectorsAssignment_0()); }
(rule__Selector__SimpleselectorsAssignment_0)
{ after(grammarAccess.getSelectorAccess().getSimpleselectorsAssignment_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Selector__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Selector__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSelectorAccess().getAlternatives_1()); }
(rule__Selector__Alternatives_1)?
{ after(grammarAccess.getSelectorAccess().getAlternatives_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Selector__Group_1_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Selector__Group_1_0__0__Impl
	rule__Selector__Group_1_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__Group_1_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSelectorAccess().getCombinatorAssignment_1_0_0()); }
(rule__Selector__CombinatorAssignment_1_0_0)
{ after(grammarAccess.getSelectorAccess().getCombinatorAssignment_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Selector__Group_1_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Selector__Group_1_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__Group_1_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSelectorAccess().getSelectorAssignment_1_0_1()); }
(rule__Selector__SelectorAssignment_1_0_1)
{ after(grammarAccess.getSelectorAccess().getSelectorAssignment_1_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Selector__Group_1_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Selector__Group_1_1__0__Impl
	rule__Selector__Group_1_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__Group_1_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
(
{ before(grammarAccess.getSelectorAccess().getWSTerminalRuleCall_1_1_0()); }
(	RULE_WS)
{ after(grammarAccess.getSelectorAccess().getWSTerminalRuleCall_1_1_0()); }
)
(
{ before(grammarAccess.getSelectorAccess().getWSTerminalRuleCall_1_1_0()); }
(	RULE_WS)*
{ after(grammarAccess.getSelectorAccess().getWSTerminalRuleCall_1_1_0()); }
)
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Selector__Group_1_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Selector__Group_1_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__Group_1_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSelectorAccess().getGroup_1_1_1()); }
(rule__Selector__Group_1_1_1__0)?
{ after(grammarAccess.getSelectorAccess().getGroup_1_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Selector__Group_1_1_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Selector__Group_1_1_1__0__Impl
	rule__Selector__Group_1_1_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__Group_1_1_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSelectorAccess().getCombinatorAssignment_1_1_1_0()); }
(rule__Selector__CombinatorAssignment_1_1_1_0)?
{ after(grammarAccess.getSelectorAccess().getCombinatorAssignment_1_1_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Selector__Group_1_1_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Selector__Group_1_1_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__Group_1_1_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSelectorAccess().getSelectorAssignment_1_1_1_1()); }
(rule__Selector__SelectorAssignment_1_1_1_1)
{ after(grammarAccess.getSelectorAccess().getSelectorAssignment_1_1_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Simple_selector__Group_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Simple_selector__Group_0__0__Impl
	rule__Simple_selector__Group_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Simple_selector__Group_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSimple_selectorAccess().getElementAssignment_0_0()); }
(rule__Simple_selector__ElementAssignment_0_0)
{ after(grammarAccess.getSimple_selectorAccess().getElementAssignment_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Simple_selector__Group_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Simple_selector__Group_0__1__Impl
	rule__Simple_selector__Group_0__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Simple_selector__Group_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSimple_selectorAccess().getIdAssignment_0_1()); }
(rule__Simple_selector__IdAssignment_0_1)*
{ after(grammarAccess.getSimple_selectorAccess().getIdAssignment_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Simple_selector__Group_0__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Simple_selector__Group_0__2__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Simple_selector__Group_0__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSimple_selectorAccess().getPseudoAssignment_0_2()); }
(rule__Simple_selector__PseudoAssignment_0_2)*
{ after(grammarAccess.getSimple_selectorAccess().getPseudoAssignment_0_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}








rule__Pseudo__Group_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Pseudo__Group_0__0__Impl
	rule__Pseudo__Group_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Pseudo__Group_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getPseudoAccess().getColonKeyword_0_0()); }

	':' 

{ after(grammarAccess.getPseudoAccess().getColonKeyword_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Pseudo__Group_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Pseudo__Group_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Pseudo__Group_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getPseudoAccess().getNameAssignment_0_1()); }
(rule__Pseudo__NameAssignment_0_1)
{ after(grammarAccess.getPseudoAccess().getNameAssignment_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Pseudo__Group_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Pseudo__Group_1__0__Impl
	rule__Pseudo__Group_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Pseudo__Group_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getPseudoAccess().getFunctionAssignment_1_0()); }
(rule__Pseudo__FunctionAssignment_1_0)
{ after(grammarAccess.getPseudoAccess().getFunctionAssignment_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Pseudo__Group_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Pseudo__Group_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Pseudo__Group_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getPseudoAccess().getNameAssignment_1_1()); }
(rule__Pseudo__NameAssignment_1_1)?
{ after(grammarAccess.getPseudoAccess().getNameAssignment_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Declaration__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Declaration__Group__0__Impl
	rule__Declaration__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Declaration__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDeclarationAccess().getPropertyAssignment_0()); }
(rule__Declaration__PropertyAssignment_0)
{ after(grammarAccess.getDeclarationAccess().getPropertyAssignment_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Declaration__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Declaration__Group__1__Impl
	rule__Declaration__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Declaration__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDeclarationAccess().getColonKeyword_1()); }

	':' 

{ after(grammarAccess.getDeclarationAccess().getColonKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Declaration__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Declaration__Group__2__Impl
	rule__Declaration__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__Declaration__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDeclarationAccess().getExprAssignment_2()); }
(rule__Declaration__ExprAssignment_2)
{ after(grammarAccess.getDeclarationAccess().getExprAssignment_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Declaration__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Declaration__Group__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Declaration__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDeclarationAccess().getPriorityAssignment_3()); }
(rule__Declaration__PriorityAssignment_3)?
{ after(grammarAccess.getDeclarationAccess().getPriorityAssignment_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__Expr__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Expr__Group__0__Impl
	rule__Expr__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Expr__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getExprAccess().getTermAssignment_0()); }
(rule__Expr__TermAssignment_0)
{ after(grammarAccess.getExprAccess().getTermAssignment_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Expr__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Expr__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Expr__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getExprAccess().getGroup_1()); }
(rule__Expr__Group_1__0)*
{ after(grammarAccess.getExprAccess().getGroup_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Expr__Group_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Expr__Group_1__0__Impl
	rule__Expr__Group_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Expr__Group_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getExprAccess().getOperatorsAssignment_1_0()); }
(rule__Expr__OperatorsAssignment_1_0)?
{ after(grammarAccess.getExprAccess().getOperatorsAssignment_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Expr__Group_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Expr__Group_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Expr__Group_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getExprAccess().getTermAssignment_1_1()); }
(rule__Expr__TermAssignment_1_1)
{ after(grammarAccess.getExprAccess().getTermAssignment_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Term__Group_0__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Term__Group_0__0__Impl
	rule__Term__Group_0__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Term__Group_0__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTermAccess().getUnaryAssignment_0_0()); }
(rule__Term__UnaryAssignment_0_0)?
{ after(grammarAccess.getTermAccess().getUnaryAssignment_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Term__Group_0__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Term__Group_0__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Term__Group_0__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTermAccess().getNumberAssignment_0_1()); }
(rule__Term__NumberAssignment_0_1)
{ after(grammarAccess.getTermAccess().getNumberAssignment_0_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Function__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Function__Group__0__Impl
	rule__Function__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Function__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFunctionAccess().getNameAssignment_0()); }
(rule__Function__NameAssignment_0)
{ after(grammarAccess.getFunctionAccess().getNameAssignment_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Function__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Function__Group__1__Impl
	rule__Function__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__Function__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFunctionAccess().getLeftParenthesisKeyword_1()); }

	'(' 

{ after(grammarAccess.getFunctionAccess().getLeftParenthesisKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Function__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Function__Group__2__Impl
	rule__Function__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__Function__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFunctionAccess().getExprAssignment_2()); }
(rule__Function__ExprAssignment_2)
{ after(grammarAccess.getFunctionAccess().getExprAssignment_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Function__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Function__Group__3__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Function__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFunctionAccess().getRightParenthesisKeyword_3()); }

	')' 

{ after(grammarAccess.getFunctionAccess().getRightParenthesisKeyword_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}










rule__URI__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__URI__Group__0__Impl
	rule__URI__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__URI__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getUrlKeyword_0()); }

	'url' 

{ after(grammarAccess.getURIAccess().getUrlKeyword_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__URI__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__URI__Group__1__Impl
	rule__URI__Group__2
;
finally {
	restoreStackSize(stackSize);
}

rule__URI__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getLeftParenthesisKeyword_1()); }

	'(' 

{ after(grammarAccess.getURIAccess().getLeftParenthesisKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__URI__Group__2
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__URI__Group__2__Impl
	rule__URI__Group__3
;
finally {
	restoreStackSize(stackSize);
}

rule__URI__Group__2__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getURIAction_2()); }
(

)
{ after(grammarAccess.getURIAccess().getURIAction_2()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__URI__Group__3
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__URI__Group__3__Impl
	rule__URI__Group__4
;
finally {
	restoreStackSize(stackSize);
}

rule__URI__Group__3__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getAlternatives_3()); }
(rule__URI__Alternatives_3)*
{ after(grammarAccess.getURIAccess().getAlternatives_3()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__URI__Group__4
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__URI__Group__4__Impl
	rule__URI__Group__5
;
finally {
	restoreStackSize(stackSize);
}

rule__URI__Group__4__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getGroup_4()); }
(rule__URI__Group_4__0)?
{ after(grammarAccess.getURIAccess().getGroup_4()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__URI__Group__5
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__URI__Group__5__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__URI__Group__5__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getRightParenthesisKeyword_5()); }

	')' 

{ after(grammarAccess.getURIAccess().getRightParenthesisKeyword_5()); }
)

;
finally {
	restoreStackSize(stackSize);
}














rule__URI__Group_3_1__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__URI__Group_3_1__0__Impl
	rule__URI__Group_3_1__1
;
finally {
	restoreStackSize(stackSize);
}

rule__URI__Group_3_1__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getAlternatives_3_1_0()); }
(rule__URI__Alternatives_3_1_0)
{ after(grammarAccess.getURIAccess().getAlternatives_3_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__URI__Group_3_1__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__URI__Group_3_1__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__URI__Group_3_1__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getIdAssignment_3_1_1()); }
(rule__URI__IdAssignment_3_1_1)
{ after(grammarAccess.getURIAccess().getIdAssignment_3_1_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__URI__Group_4__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__URI__Group_4__0__Impl
	rule__URI__Group_4__1
;
finally {
	restoreStackSize(stackSize);
}

rule__URI__Group_4__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getFullStopKeyword_4_0()); }

	'.' 

{ after(grammarAccess.getURIAccess().getFullStopKeyword_4_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__URI__Group_4__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__URI__Group_4__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__URI__Group_4__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getIdAssignment_4_1()); }
(rule__URI__IdAssignment_4_1)
{ after(grammarAccess.getURIAccess().getIdAssignment_4_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__PERCENTAGE__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__PERCENTAGE__Group__0__Impl
	rule__PERCENTAGE__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__PERCENTAGE__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getPERCENTAGEAccess().getINTTerminalRuleCall_0()); }
	RULE_INT
{ after(grammarAccess.getPERCENTAGEAccess().getINTTerminalRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__PERCENTAGE__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__PERCENTAGE__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__PERCENTAGE__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getPERCENTAGEAccess().getPercentSignKeyword_1()); }

	'%' 

{ after(grammarAccess.getPERCENTAGEAccess().getPercentSignKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__EMS__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__EMS__Group__0__Impl
	rule__EMS__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__EMS__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getEMSAccess().getINTTerminalRuleCall_0()); }
	RULE_INT
{ after(grammarAccess.getEMSAccess().getINTTerminalRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__EMS__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__EMS__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__EMS__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getEMSAccess().getEmKeyword_1()); }

	'em' 

{ after(grammarAccess.getEMSAccess().getEmKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__EXS__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__EXS__Group__0__Impl
	rule__EXS__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__EXS__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getEXSAccess().getINTTerminalRuleCall_0()); }
	RULE_INT
{ after(grammarAccess.getEXSAccess().getINTTerminalRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__EXS__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__EXS__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__EXS__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getEXSAccess().getExKeyword_1()); }

	'ex' 

{ after(grammarAccess.getEXSAccess().getExKeyword_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__LENGTH__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__LENGTH__Group__0__Impl
	rule__LENGTH__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__LENGTH__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLENGTHAccess().getINTTerminalRuleCall_0()); }
	RULE_INT
{ after(grammarAccess.getLENGTHAccess().getINTTerminalRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__LENGTH__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__LENGTH__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__LENGTH__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getLENGTHAccess().getAlternatives_1()); }
(rule__LENGTH__Alternatives_1)
{ after(grammarAccess.getLENGTHAccess().getAlternatives_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__ANGLE__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__ANGLE__Group__0__Impl
	rule__ANGLE__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__ANGLE__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getANGLEAccess().getINTTerminalRuleCall_0()); }
	RULE_INT
{ after(grammarAccess.getANGLEAccess().getINTTerminalRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__ANGLE__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__ANGLE__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__ANGLE__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getANGLEAccess().getAlternatives_1()); }
(rule__ANGLE__Alternatives_1)
{ after(grammarAccess.getANGLEAccess().getAlternatives_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__TIME__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__TIME__Group__0__Impl
	rule__TIME__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__TIME__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTIMEAccess().getINTTerminalRuleCall_0()); }
	RULE_INT
{ after(grammarAccess.getTIMEAccess().getINTTerminalRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__TIME__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__TIME__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__TIME__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTIMEAccess().getAlternatives_1()); }
(rule__TIME__Alternatives_1)
{ after(grammarAccess.getTIMEAccess().getAlternatives_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__FREQ__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FREQ__Group__0__Impl
	rule__FREQ__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__FREQ__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFREQAccess().getINTTerminalRuleCall_0()); }
	RULE_INT
{ after(grammarAccess.getFREQAccess().getINTTerminalRuleCall_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__FREQ__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__FREQ__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__FREQ__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFREQAccess().getAlternatives_1()); }
(rule__FREQ__Alternatives_1)
{ after(grammarAccess.getFREQAccess().getAlternatives_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}






rule__Css_hash_class__Group__0
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Css_hash_class__Group__0__Impl
	rule__Css_hash_class__Group__1
;
finally {
	restoreStackSize(stackSize);
}

rule__Css_hash_class__Group__0__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getCss_hash_classAccess().getTypeAssignment_0()); }
(rule__Css_hash_class__TypeAssignment_0)
{ after(grammarAccess.getCss_hash_classAccess().getTypeAssignment_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


rule__Css_hash_class__Group__1
    @init {
		int stackSize = keepStackSize();
    }
:
	rule__Css_hash_class__Group__1__Impl
;
finally {
	restoreStackSize(stackSize);
}

rule__Css_hash_class__Group__1__Impl
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getCss_hash_classAccess().getNameAssignment_1()); }
(rule__Css_hash_class__NameAssignment_1)
{ after(grammarAccess.getCss_hash_classAccess().getNameAssignment_1()); }
)

;
finally {
	restoreStackSize(stackSize);
}







rule__Stylesheet__LocationAssignment_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStylesheetAccess().getLocationSTRINGTerminalRuleCall_0_0()); }
	RULE_STRING{ after(grammarAccess.getStylesheetAccess().getLocationSTRINGTerminalRuleCall_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Stylesheet__ImportNameAssignment_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStylesheetAccess().getImportNameCss_importParserRuleCall_1_0()); }
	rulecss_import{ after(grammarAccess.getStylesheetAccess().getImportNameCss_importParserRuleCall_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Stylesheet__RulesetAssignment_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getStylesheetAccess().getRulesetRulesParserRuleCall_2_0()); }
	ruleRules{ after(grammarAccess.getStylesheetAccess().getRulesetRulesParserRuleCall_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__SelectorsAssignment_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getSelectorsSelectorParserRuleCall_0_0()); }
	ruleselector{ after(grammarAccess.getRulesAccess().getSelectorsSelectorParserRuleCall_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__SelectorsAssignment_1_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getSelectorsSelectorParserRuleCall_1_1_0()); }
	ruleselector{ after(grammarAccess.getRulesAccess().getSelectorsSelectorParserRuleCall_1_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__DeclarationsAssignment_3
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getDeclarationsDeclarationParserRuleCall_3_0()); }
	ruledeclaration{ after(grammarAccess.getRulesAccess().getDeclarationsDeclarationParserRuleCall_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Rules__DeclarationsAssignment_4_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getRulesAccess().getDeclarationsDeclarationParserRuleCall_4_1_0()); }
	ruledeclaration{ after(grammarAccess.getRulesAccess().getDeclarationsDeclarationParserRuleCall_4_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Css_import__String_nameAssignment_1_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getCss_importAccess().getString_nameSTRINGTerminalRuleCall_1_0_0()); }
	RULE_STRING{ after(grammarAccess.getCss_importAccess().getString_nameSTRINGTerminalRuleCall_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__SimpleselectorsAssignment_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSelectorAccess().getSimpleselectorsSimple_selectorParserRuleCall_0_0()); }
	rulesimple_selector{ after(grammarAccess.getSelectorAccess().getSimpleselectorsSimple_selectorParserRuleCall_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__CombinatorAssignment_1_0_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSelectorAccess().getCombinatorCombinatorParserRuleCall_1_0_0_0()); }
	rulecombinator{ after(grammarAccess.getSelectorAccess().getCombinatorCombinatorParserRuleCall_1_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__SelectorAssignment_1_0_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSelectorAccess().getSelectorSelectorParserRuleCall_1_0_1_0()); }
	ruleselector{ after(grammarAccess.getSelectorAccess().getSelectorSelectorParserRuleCall_1_0_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__CombinatorAssignment_1_1_1_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSelectorAccess().getCombinatorCombinatorParserRuleCall_1_1_1_0_0()); }
	rulecombinator{ after(grammarAccess.getSelectorAccess().getCombinatorCombinatorParserRuleCall_1_1_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Selector__SelectorAssignment_1_1_1_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSelectorAccess().getSelectorSelectorParserRuleCall_1_1_1_1_0()); }
	ruleselector{ after(grammarAccess.getSelectorAccess().getSelectorSelectorParserRuleCall_1_1_1_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Simple_selector__ElementAssignment_0_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSimple_selectorAccess().getElementElement_nameParserRuleCall_0_0_0()); }
	ruleelement_name{ after(grammarAccess.getSimple_selectorAccess().getElementElement_nameParserRuleCall_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Simple_selector__IdAssignment_0_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSimple_selectorAccess().getIdCss_hash_classParserRuleCall_0_1_0()); }
	rulecss_hash_class{ after(grammarAccess.getSimple_selectorAccess().getIdCss_hash_classParserRuleCall_0_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Simple_selector__PseudoAssignment_0_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSimple_selectorAccess().getPseudoPseudoParserRuleCall_0_2_0()); }
	rulepseudo{ after(grammarAccess.getSimple_selectorAccess().getPseudoPseudoParserRuleCall_0_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Simple_selector__IdAssignment_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getSimple_selectorAccess().getIdCss_hash_classParserRuleCall_1_0()); }
	rulecss_hash_class{ after(grammarAccess.getSimple_selectorAccess().getIdCss_hash_classParserRuleCall_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Pseudo__NameAssignment_0_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getPseudoAccess().getNameIdentTerminalRuleCall_0_1_0()); }
	RULE_IDENT{ after(grammarAccess.getPseudoAccess().getNameIdentTerminalRuleCall_0_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Pseudo__FunctionAssignment_1_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getPseudoAccess().getFunctionFunctionParserRuleCall_1_0_0()); }
	rulefunction{ after(grammarAccess.getPseudoAccess().getFunctionFunctionParserRuleCall_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Pseudo__NameAssignment_1_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getPseudoAccess().getNameIdentTerminalRuleCall_1_1_0()); }
	RULE_IDENT{ after(grammarAccess.getPseudoAccess().getNameIdentTerminalRuleCall_1_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Element_name__NameAssignment_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getElement_nameAccess().getNameIdentTerminalRuleCall_0_0()); }
	RULE_IDENT{ after(grammarAccess.getElement_nameAccess().getNameIdentTerminalRuleCall_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Element_name__NameAssignment_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getElement_nameAccess().getNameAsteriskKeyword_1_0()); }
(
{ before(grammarAccess.getElement_nameAccess().getNameAsteriskKeyword_1_0()); }

	'*' 

{ after(grammarAccess.getElement_nameAccess().getNameAsteriskKeyword_1_0()); }
)

{ after(grammarAccess.getElement_nameAccess().getNameAsteriskKeyword_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Declaration__PropertyAssignment_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDeclarationAccess().getPropertyIdentTerminalRuleCall_0_0()); }
	RULE_IDENT{ after(grammarAccess.getDeclarationAccess().getPropertyIdentTerminalRuleCall_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Declaration__ExprAssignment_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDeclarationAccess().getExprExprParserRuleCall_2_0()); }
	ruleexpr{ after(grammarAccess.getDeclarationAccess().getExprExprParserRuleCall_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Declaration__PriorityAssignment_3
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getDeclarationAccess().getPriorityImportantKeyword_3_0()); }
(
{ before(grammarAccess.getDeclarationAccess().getPriorityImportantKeyword_3_0()); }

	'!important' 

{ after(grammarAccess.getDeclarationAccess().getPriorityImportantKeyword_3_0()); }
)

{ after(grammarAccess.getDeclarationAccess().getPriorityImportantKeyword_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Expr__TermAssignment_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getExprAccess().getTermTermParserRuleCall_0_0()); }
	ruleterm{ after(grammarAccess.getExprAccess().getTermTermParserRuleCall_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Expr__OperatorsAssignment_1_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getExprAccess().getOperatorsAlternatives_1_0_0()); }
(rule__Expr__OperatorsAlternatives_1_0_0)
{ after(grammarAccess.getExprAccess().getOperatorsAlternatives_1_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Expr__TermAssignment_1_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getExprAccess().getTermTermParserRuleCall_1_1_0()); }
	ruleterm{ after(grammarAccess.getExprAccess().getTermTermParserRuleCall_1_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Term__UnaryAssignment_0_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTermAccess().getUnaryUnary_operatorParserRuleCall_0_0_0()); }
	ruleunary_operator{ after(grammarAccess.getTermAccess().getUnaryUnary_operatorParserRuleCall_0_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Term__NumberAssignment_0_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTermAccess().getNumberUnary_numbersParserRuleCall_0_1_0()); }
	ruleunary_numbers{ after(grammarAccess.getTermAccess().getNumberUnary_numbersParserRuleCall_0_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Term__NameAssignment_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTermAccess().getNameSTRINGTerminalRuleCall_1_0()); }
	RULE_STRING{ after(grammarAccess.getTermAccess().getNameSTRINGTerminalRuleCall_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Term__IdAssignment_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTermAccess().getIdIdentTerminalRuleCall_2_0()); }
	RULE_IDENT{ after(grammarAccess.getTermAccess().getIdIdentTerminalRuleCall_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Term__UriAssignment_3
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTermAccess().getUriURIParserRuleCall_3_0()); }
	ruleURI{ after(grammarAccess.getTermAccess().getUriURIParserRuleCall_3_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Term__ColorAssignment_4
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTermAccess().getColorHexdigitsTerminalRuleCall_4_0()); }
	RULE_HEXDIGITS{ after(grammarAccess.getTermAccess().getColorHexdigitsTerminalRuleCall_4_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Term__FunctionAssignment_5
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getTermAccess().getFunctionFunctionParserRuleCall_5_0()); }
	rulefunction{ after(grammarAccess.getTermAccess().getFunctionFunctionParserRuleCall_5_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Function__NameAssignment_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFunctionAccess().getNameIdentTerminalRuleCall_0_0()); }
	RULE_IDENT{ after(grammarAccess.getFunctionAccess().getNameIdentTerminalRuleCall_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Function__ExprAssignment_2
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getFunctionAccess().getExprExprParserRuleCall_2_0()); }
	ruleexpr{ after(grammarAccess.getFunctionAccess().getExprExprParserRuleCall_2_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__URI__NameAssignment_3_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getNameSTRINGTerminalRuleCall_3_0_0()); }
	RULE_STRING{ after(grammarAccess.getURIAccess().getNameSTRINGTerminalRuleCall_3_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__URI__IdAssignment_3_1_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getIdIdentTerminalRuleCall_3_1_1_0()); }
	RULE_IDENT{ after(grammarAccess.getURIAccess().getIdIdentTerminalRuleCall_3_1_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__URI__IdAssignment_4_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getURIAccess().getIdIdentTerminalRuleCall_4_1_0()); }
	RULE_IDENT{ after(grammarAccess.getURIAccess().getIdIdentTerminalRuleCall_4_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Css_hash_class__TypeAssignment_0
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getCss_hash_classAccess().getTypeAlternatives_0_0()); }
(rule__Css_hash_class__TypeAlternatives_0_0)
{ after(grammarAccess.getCss_hash_classAccess().getTypeAlternatives_0_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}

rule__Css_hash_class__NameAssignment_1
    @init {
		int stackSize = keepStackSize();
    }
:
(
{ before(grammarAccess.getCss_hash_classAccess().getNameIdentTerminalRuleCall_1_0()); }
	RULE_IDENT{ after(grammarAccess.getCss_hash_classAccess().getNameIdentTerminalRuleCall_1_0()); }
)

;
finally {
	restoreStackSize(stackSize);
}


RULE_HEXDIGITS : '#' ('0'..'9'|'a'..'f'|'A'..'F')+;

RULE_IDENT : ('_'|'-'|'a'..'z'|'A'..'Z') ('_'|'-'|'a'..'z'|'A'..'Z'|'0'..'9')*;

RULE_ID : '^'? ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;

RULE_INT : ('0'..'9')+;

RULE_STRING : ('"' ('\\' ('b'|'t'|'n'|'f'|'r'|'u'|'"'|'\''|'\\')|~(('\\'|'"')))* '"'|'\'' ('\\' ('b'|'t'|'n'|'f'|'r'|'u'|'"'|'\''|'\\')|~(('\\'|'\'')))* '\'');

RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';

RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;

RULE_WS : (' '|'\t'|'\r'|'\n')+;

RULE_ANY_OTHER : .;


