1   // $ANTLR 3.5.2 org/daisy/pipeline/css/sass/impl/SassPostProcess.g 2025-01-27 18:34:25
2    package org.daisy.pipeline.css.sass.impl; 
3   
4   import org.antlr.runtime.*;
5   import java.util.Stack;
6   import java.util.List;
7   import java.util.ArrayList;
8   
9   /**
10   * In order to fully support stacked pseudo-elements and
11   * pseudo-classes on pseudo-elements (also in combination
12   * with @extend), we have previously pre-processed the SASS before it
13   * was compiled to CSS, and now a CSS post-processing step is
14   * required.
15   *
16   * Before the SASS was compiled, pseudo-elements were replaced with a
17   * child selector followed by a pseudo-class. E.g. `::after' became
18   * `>:after`. This needs to be reverted now.
19   *
20   * This simple parser does not fully parse the CSS. It only parses the
21   * selectors in order to be able to modify them. Everything else
22   * (declarations, at-rules, etc.) is left intact and unparsed.
23   */
24  @SuppressWarnings("all")
25  public class SassPostProcessParser extends Parser {
26  	public static final String[] tokenNames = new String[] {
27  		"<invalid>", "<EOR>", "<DOWN>", "<UP>", "ANY", "APOS", "ASTERISK", "AT", 
28  		"BAR", "COLON", "COMMA", "COMMENT", "COMMENT_MACR", "ESCAPE_CHAR", "GREATER", 
29  		"HAS", "HASH", "IDENT", "IDENT_START", "LBRACE", "LCURLY", "LPAREN", "MEDIA", 
30  		"NAME", "NAME_CHAR", "NEWLINE_CHAR", "NON_ASCII", "NOT", "PERIOD", "PLUS", 
31  		"QUOT", "RBRACE", "RCURLY", "RPAREN", "SEMICOLON", "SPACE", "SPACE_CHAR", 
32  		"STRING", "STRING_CHAR", "STRING_MACR", "TILDE", "XML_COMMENT_CLOSE", 
33  		"XML_COMMENT_OPEN"
34  	};
35  	public static final int EOF=-1;
36  	public static final int ANY=4;
37  	public static final int APOS=5;
38  	public static final int ASTERISK=6;
39  	public static final int AT=7;
40  	public static final int BAR=8;
41  	public static final int COLON=9;
42  	public static final int COMMA=10;
43  	public static final int COMMENT=11;
44  	public static final int COMMENT_MACR=12;
45  	public static final int ESCAPE_CHAR=13;
46  	public static final int GREATER=14;
47  	public static final int HAS=15;
48  	public static final int HASH=16;
49  	public static final int IDENT=17;
50  	public static final int IDENT_START=18;
51  	public static final int LBRACE=19;
52  	public static final int LCURLY=20;
53  	public static final int LPAREN=21;
54  	public static final int MEDIA=22;
55  	public static final int NAME=23;
56  	public static final int NAME_CHAR=24;
57  	public static final int NEWLINE_CHAR=25;
58  	public static final int NON_ASCII=26;
59  	public static final int NOT=27;
60  	public static final int PERIOD=28;
61  	public static final int PLUS=29;
62  	public static final int QUOT=30;
63  	public static final int RBRACE=31;
64  	public static final int RCURLY=32;
65  	public static final int RPAREN=33;
66  	public static final int SEMICOLON=34;
67  	public static final int SPACE=35;
68  	public static final int SPACE_CHAR=36;
69  	public static final int STRING=37;
70  	public static final int STRING_CHAR=38;
71  	public static final int STRING_MACR=39;
72  	public static final int TILDE=40;
73  	public static final int XML_COMMENT_CLOSE=41;
74  	public static final int XML_COMMENT_OPEN=42;
75  
76  	// delegates
77  	public Parser[] getDelegates() {
78  		return new Parser[] {};
79  	}
80  
81  	// delegators
82  
83  
84  	public SassPostProcessParser(TokenStream input) {
85  		this(input, new RecognizerSharedState());
86  	}
87  	public SassPostProcessParser(TokenStream input, RecognizerSharedState state) {
88  		super(input, state);
89  	}
90  
91  	@Override public String[] getTokenNames() { return SassPostProcessParser.tokenNames; }
92  	@Override public String getGrammarFileName() { return "org/daisy/pipeline/css/sass/impl/SassPostProcess.g"; }
93  
94  
95  	    private static class StringBuilder {
96  	        protected java.lang.StringBuilder sb = new java.lang.StringBuilder();
97  	        protected java.util.List<Object> list = new java.util.ArrayList<>();
98  	        public void append(Token token) {
99  	            append(token.getText());
100 	            list.add(token);
101 	        }
102 	        public void append(Object o) {
103 	            sb.append(o);
104 	            list.add(o);
105 	        }
106 	        @Override
107 	        public String toString() {
108 	            return sb.toString();
109 	        }
110 	    }
111 	    private static class SelectorRule extends StringBuilder {
112 	        private boolean hasSelector = false;
113 	        public void append(SelectorGroup selector) {
114 	            if (!selector.invalid()) {
115 	                hasSelector = true;
116 	                super.append(selector);
117 	            }
118 	        }
119 	        public void append(Object o) {
120 	            if (hasSelector)
121 	                super.append(o);
122 	        }
123 	        public boolean invalid() {
124 	            return !hasSelector;
125 	        }
126 	    }
127 	    private static class SelectorGroup extends StringBuilder {
128 	        private String pendingSeparator = null;
129 	        private boolean skipSeparator = true;
130 	        public void append(Token separator) {
131 	            if (!skipSeparator) {
132 	                if (pendingSeparator == null)
133 	                    pendingSeparator = separator.getText();
134 	                else
135 	                    pendingSeparator += separator.getText();
136 	            }
137 	        }
138 	        public void append(Selector selector) {
139 	            if (!selector.invalid()) {
140 	                if (pendingSeparator != null)
141 	                    append(pendingSeparator);
142 	                super.append(selector);
143 	                skipSeparator = false;
144 	            }
145 	            pendingSeparator = null;
146 	        }
147 	        public boolean invalid() {
148 	            return sb.length() == 0;
149 	        }
150 	    }
151 	    private static class Selector extends StringBuilder {
152 	        private boolean invalid = false;
153 	        protected Combinator lastCombinator = null;
154 	        public void append(Combinator combinator) {
155 	            lastCombinator = combinator;
156 	        }
157 	        public void append(SimpleSelector selector) {
158 	            invalid |= selector.invalid();
159 	            // drop the child combinator that should always preceed a pseudo-element
160 	            if (selector.isPseudoElement()) {
161 	                if (lastCombinator == null || lastCombinator.type != Combinator.CHILD)
162 	                    invalid = true;
163 	                else
164 	                    // remove trailing space from previous simple selector
165 	                    sb = new java.lang.StringBuilder(sb.toString().replaceAll("\\s+$", ""));
166 	            } else if (lastCombinator != null)
167 	                super.append(lastCombinator);
168 	            lastCombinator = null;
169 	            super.append(selector);
170 	        }
171 	        public boolean invalid() {
172 	            return invalid || sb.length() == 0;
173 	        }
174 	    }
175 	    private static class RelativeSelector extends Selector {
176 	        public void append(Selector selector) {
177 	            for (Object o : selector.list)
178 	                if (o instanceof Combinator)
179 	                    append((Combinator)o);
180 	                else if (o instanceof SimpleSelector)
181 	                    append((SimpleSelector)o);
182 	        }
183 	    }
184 	    private static class Combinator extends StringBuilder {
185 	        public static final int CHILD = GREATER;
186 	        public static final int DESCENDANT = SPACE;
187 	        public static final int ADJACENT = PLUS;
188 	        public static final int SIBLING = TILDE;
189 	        public final int type;
190 	        public Combinator(int type) {
191 	            this.type = type;
192 	        }
193 	        public Combinator(Token token) {
194 	            this(token.getType());
195 	            append(token);
196 	        }
197 	    }
198 	    private static class SimpleSelector extends StringBuilder {
199 	        private int size = 0;
200 	        private PseudoElement pseudoElement = null;
201 	        private boolean hasEmptyNegationSelector = false;
202 	        private boolean hasOnlyPseudoClasses = true;
203 	        private boolean invalid = false;
204 	        public void append(SelectorPart selector) {
205 	            // an empty negation pseudo class will always match
206 	            if (selector instanceof NegationSelector
207 	                && ((NegationSelector)selector).invalid())
208 	                hasEmptyNegationSelector = true;
209 	            else if (selector instanceof RelationalSelector
210 	                     && ((RelationalSelector)selector).invalid())
211 	                invalid = true;
212 	            else {
213 	                size++;
214 	                // if a selector contains a pseudo-element there may
215 	                // be only one and if other parts are present they
216 	                // must be pseudo classes
217 	                if (selector instanceof PseudoElement) {
218 	                    invalid |= !hasOnlyPseudoClasses;
219 	                    pseudoElement = (PseudoElement)selector;
220 	                } else if (!(selector instanceof PseudoClass)) {
221 	                    hasOnlyPseudoClasses = false;
222 	                    invalid |= (pseudoElement != null);
223 	                }
224 	                super.append(selector);
225 	            }
226 	        }
227 	        public boolean invalid() {
228 	            return invalid || (size == 0 && !hasEmptyNegationSelector);
229 	        }
230 	        public boolean isPseudoElement() {
231 	            return !invalid && pseudoElement != null;
232 	        }
233 	        @Override
234 	        public String toString() {
235 	            if (size == 0 && !invalid())
236 	                return "*";
237 	            else if (pseudoElement == null || size == 1)
238 	                return super.toString();
239 	            else {
240 	                // SASS may switch order of pseudo element and pseudo
241 	                // classes; move pseudo element to the beginning
242 	                String s = pseudoElement.toString();
243 	                for (Object o : list)
244 	                    if (o instanceof PseudoClass)
245 	                        s += o.toString();
246 	                    else if (o instanceof Token)
247 	                        // SPACE
248 	                        s += ((Token)o).getText();
249 	                return s;
250 	            }
251 	        }
252 	    }
253 	    private static class NegationSelector extends PseudoClass {
254 	        private SelectorGroup selector = null;
255 	        public void append(SimpleSelector ss) {
256 	            if (selector == null)
257 	                selector = new SelectorGroup();
258 	            Selector s = new Selector();
259 	            s.append(ss);
260 	            selector.append(s);
261 	        }
262 	        public void append(Token t) {
263 	            if (selector == null)
264 	                // NOT SPACE?
265 	                super.append(t);
266 	            else if (t.getType() == RPAREN)
267 	                ; // RPAREN
268 	            else
269 	                // COMMA SPACE?
270 	                selector.append(t);
271 	        }
272 	        public boolean invalid() {
273 	            return selector != null ? selector.invalid() : true;
274 	        }
275 	        @Override
276 	        public String toString() {
277 	            String s = super.toString();
278 	            if (selector != null) {
279 	                s += selector.toString();
280 	                s += ")";
281 	            }
282 	            return s;
283 	        }
284 	    }
285 	    private static class RelationalSelector extends PseudoClass {
286 	        private SelectorGroup selector = null;
287 	        public void append(RelativeSelector s) {
288 	            if (selector == null)
289 	                selector = new SelectorGroup();
290 	            selector.append(s);
291 	        }
292 	        public void append(Token t) {
293 	            if (selector == null)
294 	                // HAS SPACE?
295 	                super.append(t);
296 	            else if (t.getType() == RPAREN)
297 	                ; // RPAREN
298 	            else
299 	                // COMMA SPACE?
300 	                selector.append(t);
301 	        }
302 	        public boolean invalid() {
303 	            return selector != null ? selector.invalid() : true;
304 	        }
305 	        @Override
306 	        public String toString() {
307 	            String s = super.toString();
308 	            if (selector != null) {
309 	                s += selector.toString();
310 	                s += ")";
311 	            }
312 	            return s;
313 	        }
314 	    }
315 	    private static class SelectorPart extends StringBuilder {}
316 	    private static class PseudoElement extends SelectorPart {}
317 	    private static class PseudoClass extends SelectorPart {}
318 
319 
320 
321 	// $ANTLR start "start"
322 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:256:1: start : stylesheet ;
323 	public final void start() throws RecognitionException {
324 		try {
325 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:256:7: ( stylesheet )
326 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:256:9: stylesheet
327 			{
328 			pushFollow(FOLLOW_stylesheet_in_start48);
329 			stylesheet();
330 			state._fsp--;
331 
332 			}
333 
334 		}
335 		catch (RecognitionException re) {
336 			reportError(re);
337 			recover(input,re);
338 		}
339 		finally {
340 			// do for sure before leaving
341 		}
342 	}
343 	// $ANTLR end "start"
344 
345 
346 	protected static class stylesheet_scope {
347 		StringBuilder sb;
348 	}
349 	protected Stack<stylesheet_scope> stylesheet_stack = new Stack<stylesheet_scope>();
350 
351 
352 	// $ANTLR start "stylesheet"
353 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:258:1: stylesheet returns [String str] : (t= ( SPACE | XML_COMMENT_OPEN | XML_COMMENT_CLOSE ) |t= COMMENT | media_rule | at_rule | (r= selector_rule ) )* ;
354 	public final String stylesheet() throws RecognitionException {
355 		stylesheet_stack.push(new stylesheet_scope());
356 		String str = null;
357 
358 
359 		Token t=null;
360 		SelectorRule r =null;
361 
362 
363 		    stylesheet_stack.peek().sb = new StringBuilder();
364 
365 		try {
366 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:268:5: ( (t= ( SPACE | XML_COMMENT_OPEN | XML_COMMENT_CLOSE ) |t= COMMENT | media_rule | at_rule | (r= selector_rule ) )* )
367 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:268:7: (t= ( SPACE | XML_COMMENT_OPEN | XML_COMMENT_CLOSE ) |t= COMMENT | media_rule | at_rule | (r= selector_rule ) )*
368 			{
369 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:268:7: (t= ( SPACE | XML_COMMENT_OPEN | XML_COMMENT_CLOSE ) |t= COMMENT | media_rule | at_rule | (r= selector_rule ) )*
370 			loop1:
371 			while (true) {
372 				int alt1=6;
373 				switch ( input.LA(1) ) {
374 				case SPACE:
375 				case XML_COMMENT_CLOSE:
376 				case XML_COMMENT_OPEN:
377 					{
378 					alt1=1;
379 					}
380 					break;
381 				case COMMENT:
382 					{
383 					alt1=2;
384 					}
385 					break;
386 				case MEDIA:
387 					{
388 					alt1=3;
389 					}
390 					break;
391 				case AT:
392 					{
393 					alt1=4;
394 					}
395 					break;
396 				case ASTERISK:
397 				case BAR:
398 				case COLON:
399 				case HAS:
400 				case HASH:
401 				case IDENT:
402 				case LBRACE:
403 				case NOT:
404 				case PERIOD:
405 					{
406 					alt1=5;
407 					}
408 					break;
409 				}
410 				switch (alt1) {
411 				case 1 :
412 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:268:9: t= ( SPACE | XML_COMMENT_OPEN | XML_COMMENT_CLOSE )
413 					{
414 					t=input.LT(1);
415 					if ( input.LA(1)==SPACE||(input.LA(1) >= XML_COMMENT_CLOSE && input.LA(1) <= XML_COMMENT_OPEN) ) {
416 						input.consume();
417 						state.errorRecovery=false;
418 					}
419 					else {
420 						MismatchedSetException mse = new MismatchedSetException(null,input);
421 						throw mse;
422 					}
423 					 stylesheet_stack.peek().sb.append(t); 
424 					}
425 					break;
426 				case 2 :
427 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:271:9: t= COMMENT
428 					{
429 					t=(Token)match(input,COMMENT,FOLLOW_COMMENT_in_stylesheet126); 
430 					 stylesheet_stack.peek().sb.append(t); 
431 					}
432 					break;
433 				case 3 :
434 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:272:9: media_rule
435 					{
436 					pushFollow(FOLLOW_media_rule_in_stylesheet150);
437 					media_rule();
438 					state._fsp--;
439 
440 					}
441 					break;
442 				case 4 :
443 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:273:9: at_rule
444 					{
445 					pushFollow(FOLLOW_at_rule_in_stylesheet160);
446 					at_rule();
447 					state._fsp--;
448 
449 					}
450 					break;
451 				case 5 :
452 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:274:9: (r= selector_rule )
453 					{
454 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:274:9: (r= selector_rule )
455 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:274:11: r= selector_rule
456 					{
457 					pushFollow(FOLLOW_selector_rule_in_stylesheet174);
458 					r=selector_rule();
459 					state._fsp--;
460 
461 					 if (!r.invalid())
462 					                                  stylesheet_stack.peek().sb.append(r); 
463 					}
464 
465 					}
466 					break;
467 
468 				default :
469 					break loop1;
470 				}
471 			}
472 
473 			}
474 
475 
476 			    str = stylesheet_stack.peek().sb.toString();
477 
478 		}
479 		catch (RecognitionException re) {
480 			reportError(re);
481 			recover(input,re);
482 		}
483 		finally {
484 			// do for sure before leaving
485 			stylesheet_stack.pop();
486 		}
487 		return str;
488 	}
489 	// $ANTLR end "stylesheet"
490 
491 
492 
493 	// $ANTLR start "at_rule"
494 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:279:1: at_rule : (t= AT ) (t= (~ ( LCURLY | SEMICOLON ) ) )+ ( (t= SEMICOLON ) | (t= LCURLY ) ( at_rule | (t= (~ ( AT | RCURLY ) ) ) )* (t= RCURLY ) ) ;
495 	public final void at_rule() throws RecognitionException {
496 		Token t=null;
497 
498 		try {
499 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:280:5: ( (t= AT ) (t= (~ ( LCURLY | SEMICOLON ) ) )+ ( (t= SEMICOLON ) | (t= LCURLY ) ( at_rule | (t= (~ ( AT | RCURLY ) ) ) )* (t= RCURLY ) ) )
500 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:280:7: (t= AT ) (t= (~ ( LCURLY | SEMICOLON ) ) )+ ( (t= SEMICOLON ) | (t= LCURLY ) ( at_rule | (t= (~ ( AT | RCURLY ) ) ) )* (t= RCURLY ) )
501 			{
502 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:280:7: (t= AT )
503 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:280:9: t= AT
504 			{
505 			t=(Token)match(input,AT,FOLLOW_AT_in_at_rule212); 
506 			 stylesheet_stack.peek().sb.append(t); 
507 			}
508 
509 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:281:7: (t= (~ ( LCURLY | SEMICOLON ) ) )+
510 			int cnt2=0;
511 			loop2:
512 			while (true) {
513 				int alt2=2;
514 				int LA2_0 = input.LA(1);
515 				if ( ((LA2_0 >= ANY && LA2_0 <= LBRACE)||(LA2_0 >= LPAREN && LA2_0 <= RPAREN)||(LA2_0 >= SPACE && LA2_0 <= XML_COMMENT_OPEN)) ) {
516 					alt2=1;
517 				}
518 
519 				switch (alt2) {
520 				case 1 :
521 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:281:9: t= (~ ( LCURLY | SEMICOLON ) )
522 					{
523 					t=input.LT(1);
524 					if ( (input.LA(1) >= ANY && input.LA(1) <= LBRACE)||(input.LA(1) >= LPAREN && input.LA(1) <= RPAREN)||(input.LA(1) >= SPACE && input.LA(1) <= XML_COMMENT_OPEN) ) {
525 						input.consume();
526 						state.errorRecovery=false;
527 					}
528 					else {
529 						MismatchedSetException mse = new MismatchedSetException(null,input);
530 						throw mse;
531 					}
532 					 stylesheet_stack.peek().sb.append(t); 
533 					}
534 					break;
535 
536 				default :
537 					if ( cnt2 >= 1 ) break loop2;
538 					EarlyExitException eee = new EarlyExitException(2, input);
539 					throw eee;
540 				}
541 				cnt2++;
542 			}
543 
544 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:283:7: ( (t= SEMICOLON ) | (t= LCURLY ) ( at_rule | (t= (~ ( AT | RCURLY ) ) ) )* (t= RCURLY ) )
545 			int alt4=2;
546 			int LA4_0 = input.LA(1);
547 			if ( (LA4_0==SEMICOLON) ) {
548 				alt4=1;
549 			}
550 			else if ( (LA4_0==LCURLY) ) {
551 				alt4=2;
552 			}
553 
554 			else {
555 				NoViableAltException nvae =
556 					new NoViableAltException("", 4, 0, input);
557 				throw nvae;
558 			}
559 
560 			switch (alt4) {
561 				case 1 :
562 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:283:9: (t= SEMICOLON )
563 					{
564 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:283:9: (t= SEMICOLON )
565 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:283:11: t= SEMICOLON
566 					{
567 					t=(Token)match(input,SEMICOLON,FOLLOW_SEMICOLON_in_at_rule291); 
568 					 stylesheet_stack.peek().sb.append(t); 
569 					}
570 
571 					}
572 					break;
573 				case 2 :
574 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:284:9: (t= LCURLY ) ( at_rule | (t= (~ ( AT | RCURLY ) ) ) )* (t= RCURLY )
575 					{
576 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:284:9: (t= LCURLY )
577 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:284:11: t= LCURLY
578 					{
579 					t=(Token)match(input,LCURLY,FOLLOW_LCURLY_in_at_rule318); 
580 					 stylesheet_stack.peek().sb.append(t); 
581 					}
582 
583 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:285:9: ( at_rule | (t= (~ ( AT | RCURLY ) ) ) )*
584 					loop3:
585 					while (true) {
586 						int alt3=3;
587 						int LA3_0 = input.LA(1);
588 						if ( (LA3_0==AT) ) {
589 							alt3=1;
590 						}
591 						else if ( ((LA3_0 >= ANY && LA3_0 <= ASTERISK)||(LA3_0 >= BAR && LA3_0 <= RBRACE)||(LA3_0 >= RPAREN && LA3_0 <= XML_COMMENT_OPEN)) ) {
592 							alt3=2;
593 						}
594 
595 						switch (alt3) {
596 						case 1 :
597 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:285:11: at_rule
598 							{
599 							pushFollow(FOLLOW_at_rule_in_at_rule346);
600 							at_rule();
601 							state._fsp--;
602 
603 							}
604 							break;
605 						case 2 :
606 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:286:11: (t= (~ ( AT | RCURLY ) ) )
607 							{
608 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:286:11: (t= (~ ( AT | RCURLY ) ) )
609 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:286:13: t= (~ ( AT | RCURLY ) )
610 							{
611 							t=input.LT(1);
612 							if ( (input.LA(1) >= ANY && input.LA(1) <= ASTERISK)||(input.LA(1) >= BAR && input.LA(1) <= RBRACE)||(input.LA(1) >= RPAREN && input.LA(1) <= XML_COMMENT_OPEN) ) {
613 								input.consume();
614 								state.errorRecovery=false;
615 							}
616 							else {
617 								MismatchedSetException mse = new MismatchedSetException(null,input);
618 								throw mse;
619 							}
620 							 stylesheet_stack.peek().sb.append(t); 
621 							}
622 
623 							}
624 							break;
625 
626 						default :
627 							break loop3;
628 						}
629 					}
630 
631 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:289:9: (t= RCURLY )
632 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:289:11: t= RCURLY
633 					{
634 					t=(Token)match(input,RCURLY,FOLLOW_RCURLY_in_at_rule420); 
635 					 stylesheet_stack.peek().sb.append(t); 
636 					}
637 
638 					}
639 					break;
640 
641 			}
642 
643 			}
644 
645 		}
646 		catch (RecognitionException re) {
647 			reportError(re);
648 			recover(input,re);
649 		}
650 		finally {
651 			// do for sure before leaving
652 		}
653 	}
654 	// $ANTLR end "at_rule"
655 
656 
657 
658 	// $ANTLR start "media_rule"
659 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:293:1: media_rule : (t= MEDIA ) (t= (~ LCURLY ) )+ (t= LCURLY ) (s= stylesheet ) (t= RCURLY ) ;
660 	public final void media_rule() throws RecognitionException {
661 		Token t=null;
662 		String s =null;
663 
664 		try {
665 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:294:6: ( (t= MEDIA ) (t= (~ LCURLY ) )+ (t= LCURLY ) (s= stylesheet ) (t= RCURLY ) )
666 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:294:8: (t= MEDIA ) (t= (~ LCURLY ) )+ (t= LCURLY ) (s= stylesheet ) (t= RCURLY )
667 			{
668 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:294:8: (t= MEDIA )
669 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:294:10: t= MEDIA
670 			{
671 			t=(Token)match(input,MEDIA,FOLLOW_MEDIA_in_media_rule466); 
672 			 stylesheet_stack.peek().sb.append(t); 
673 			}
674 
675 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:295:8: (t= (~ LCURLY ) )+
676 			int cnt5=0;
677 			loop5:
678 			while (true) {
679 				int alt5=2;
680 				int LA5_0 = input.LA(1);
681 				if ( ((LA5_0 >= ANY && LA5_0 <= LBRACE)||(LA5_0 >= LPAREN && LA5_0 <= XML_COMMENT_OPEN)) ) {
682 					alt5=1;
683 				}
684 
685 				switch (alt5) {
686 				case 1 :
687 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:295:10: t= (~ LCURLY )
688 					{
689 					t=input.LT(1);
690 					if ( (input.LA(1) >= ANY && input.LA(1) <= LBRACE)||(input.LA(1) >= LPAREN && input.LA(1) <= XML_COMMENT_OPEN) ) {
691 						input.consume();
692 						state.errorRecovery=false;
693 					}
694 					else {
695 						MismatchedSetException mse = new MismatchedSetException(null,input);
696 						throw mse;
697 					}
698 					 stylesheet_stack.peek().sb.append(t); 
699 					}
700 					break;
701 
702 				default :
703 					if ( cnt5 >= 1 ) break loop5;
704 					EarlyExitException eee = new EarlyExitException(5, input);
705 					throw eee;
706 				}
707 				cnt5++;
708 			}
709 
710 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:296:8: (t= LCURLY )
711 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:296:10: t= LCURLY
712 			{
713 			t=(Token)match(input,LCURLY,FOLLOW_LCURLY_in_media_rule528); 
714 			 stylesheet_stack.peek().sb.append(t); 
715 			}
716 
717 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:297:8: (s= stylesheet )
718 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:297:10: s= stylesheet
719 			{
720 			pushFollow(FOLLOW_stylesheet_in_media_rule558);
721 			s=stylesheet();
722 			state._fsp--;
723 
724 			 stylesheet_stack.peek().sb.append(s); 
725 			}
726 
727 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:298:8: (t= RCURLY )
728 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:298:10: t= RCURLY
729 			{
730 			t=(Token)match(input,RCURLY,FOLLOW_RCURLY_in_media_rule584); 
731 			 stylesheet_stack.peek().sb.append(t); 
732 			}
733 
734 			}
735 
736 		}
737 		catch (RecognitionException re) {
738 			reportError(re);
739 			recover(input,re);
740 		}
741 		finally {
742 			// do for sure before leaving
743 		}
744 	}
745 	// $ANTLR end "media_rule"
746 
747 
748 
749 	// $ANTLR start "selector_rule"
750 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:301:1: selector_rule returns [SelectorRule rule] : (s= selector_group ) (t= LCURLY ) (t= (~ RCURLY ) )* (t= RCURLY ) ;
751 	public final SelectorRule selector_rule() throws RecognitionException {
752 		SelectorRule rule = null;
753 
754 
755 		Token t=null;
756 		SelectorGroup s =null;
757 
758 
759 		    rule = new SelectorRule();
760 
761 		try {
762 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:305:5: ( (s= selector_group ) (t= LCURLY ) (t= (~ RCURLY ) )* (t= RCURLY ) )
763 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:305:7: (s= selector_group ) (t= LCURLY ) (t= (~ RCURLY ) )* (t= RCURLY )
764 			{
765 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:305:7: (s= selector_group )
766 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:305:9: s= selector_group
767 			{
768 			pushFollow(FOLLOW_selector_group_in_selector_rule631);
769 			s=selector_group();
770 			state._fsp--;
771 
772 			 rule.append(s); 
773 			}
774 
775 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:306:7: (t= LCURLY )
776 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:306:9: t= LCURLY
777 			{
778 			t=(Token)match(input,LCURLY,FOLLOW_LCURLY_in_selector_rule651); 
779 			 rule.append(t); 
780 			}
781 
782 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:307:7: (t= (~ RCURLY ) )*
783 			loop6:
784 			while (true) {
785 				int alt6=2;
786 				int LA6_0 = input.LA(1);
787 				if ( ((LA6_0 >= ANY && LA6_0 <= RBRACE)||(LA6_0 >= RPAREN && LA6_0 <= XML_COMMENT_OPEN)) ) {
788 					alt6=1;
789 				}
790 
791 				switch (alt6) {
792 				case 1 :
793 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:307:9: t= (~ RCURLY )
794 					{
795 					t=input.LT(1);
796 					if ( (input.LA(1) >= ANY && input.LA(1) <= RBRACE)||(input.LA(1) >= RPAREN && input.LA(1) <= XML_COMMENT_OPEN) ) {
797 						input.consume();
798 						state.errorRecovery=false;
799 					}
800 					else {
801 						MismatchedSetException mse = new MismatchedSetException(null,input);
802 						throw mse;
803 					}
804 					 rule.append(t); 
805 					}
806 					break;
807 
808 				default :
809 					break loop6;
810 				}
811 			}
812 
813 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:308:7: (t= RCURLY )
814 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:308:9: t= RCURLY
815 			{
816 			t=(Token)match(input,RCURLY,FOLLOW_RCURLY_in_selector_rule708); 
817 			 rule.append(t); 
818 			}
819 
820 			}
821 
822 		}
823 		catch (RecognitionException re) {
824 			reportError(re);
825 			recover(input,re);
826 		}
827 		finally {
828 			// do for sure before leaving
829 		}
830 		return rule;
831 	}
832 	// $ANTLR end "selector_rule"
833 
834 
835 
836 	// $ANTLR start "selector_group"
837 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:311:1: selector_group returns [SelectorGroup sel] : (s= selector ) ( (t= COMMA ) (t= SPACE )? (s= selector ) )* ;
838 	public final SelectorGroup selector_group() throws RecognitionException {
839 		SelectorGroup sel = null;
840 
841 
842 		Token t=null;
843 		Selector s =null;
844 
845 
846 		    sel = new SelectorGroup();
847 
848 		try {
849 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:315:5: ( (s= selector ) ( (t= COMMA ) (t= SPACE )? (s= selector ) )* )
850 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:315:7: (s= selector ) ( (t= COMMA ) (t= SPACE )? (s= selector ) )*
851 			{
852 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:315:7: (s= selector )
853 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:315:9: s= selector
854 			{
855 			pushFollow(FOLLOW_selector_in_selector_group754);
856 			s=selector();
857 			state._fsp--;
858 
859 			 sel.append(s); 
860 			}
861 
862 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:316:7: ( (t= COMMA ) (t= SPACE )? (s= selector ) )*
863 			loop8:
864 			while (true) {
865 				int alt8=2;
866 				int LA8_0 = input.LA(1);
867 				if ( (LA8_0==COMMA) ) {
868 					alt8=1;
869 				}
870 
871 				switch (alt8) {
872 				case 1 :
873 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:316:9: (t= COMMA ) (t= SPACE )? (s= selector )
874 					{
875 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:316:9: (t= COMMA )
876 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:316:11: t= COMMA
877 					{
878 					t=(Token)match(input,COMMA,FOLLOW_COMMA_in_selector_group782); 
879 					 sel.append(t); 
880 					}
881 
882 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:317:9: (t= SPACE )?
883 					int alt7=2;
884 					int LA7_0 = input.LA(1);
885 					if ( (LA7_0==SPACE) ) {
886 						alt7=1;
887 					}
888 					switch (alt7) {
889 						case 1 :
890 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:317:11: t= SPACE
891 							{
892 							t=(Token)match(input,SPACE,FOLLOW_SPACE_in_selector_group811); 
893 							 sel.append(t); 
894 							}
895 							break;
896 
897 					}
898 
899 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:318:9: (s= selector )
900 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:318:11: s= selector
901 					{
902 					pushFollow(FOLLOW_selector_in_selector_group841);
903 					s=selector();
904 					state._fsp--;
905 
906 					 sel.append(s); 
907 					}
908 
909 					}
910 					break;
911 
912 				default :
913 					break loop8;
914 				}
915 			}
916 
917 			}
918 
919 		}
920 		catch (RecognitionException re) {
921 			reportError(re);
922 			recover(input,re);
923 		}
924 		finally {
925 			// do for sure before leaving
926 		}
927 		return sel;
928 	}
929 	// $ANTLR end "selector_group"
930 
931 
932 
933 	// $ANTLR start "selector"
934 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:322:1: selector returns [Selector sel] : (s= simple_selector ) ( (c= combinator ) (s= simple_selector ) )* ;
935 	public final Selector selector() throws RecognitionException {
936 		Selector sel = null;
937 
938 
939 		SimpleSelector s =null;
940 		Combinator c =null;
941 
942 
943 		    sel = new Selector();
944 
945 		try {
946 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:326:5: ( (s= simple_selector ) ( (c= combinator ) (s= simple_selector ) )* )
947 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:326:7: (s= simple_selector ) ( (c= combinator ) (s= simple_selector ) )*
948 			{
949 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:326:7: (s= simple_selector )
950 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:326:9: s= simple_selector
951 			{
952 			pushFollow(FOLLOW_simple_selector_in_selector894);
953 			s=simple_selector();
954 			state._fsp--;
955 
956 			 sel.append(s); 
957 			}
958 
959 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:327:7: ( (c= combinator ) (s= simple_selector ) )*
960 			loop9:
961 			while (true) {
962 				int alt9=2;
963 				int LA9_0 = input.LA(1);
964 				if ( (LA9_0==GREATER||LA9_0==PLUS||LA9_0==SPACE||LA9_0==TILDE) ) {
965 					alt9=1;
966 				}
967 
968 				switch (alt9) {
969 				case 1 :
970 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:327:9: (c= combinator ) (s= simple_selector )
971 					{
972 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:327:9: (c= combinator )
973 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:327:11: c= combinator
974 					{
975 					pushFollow(FOLLOW_combinator_in_selector915);
976 					c=combinator();
977 					state._fsp--;
978 
979 					 sel.append(c); 
980 					}
981 
982 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:328:9: (s= simple_selector )
983 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:328:11: s= simple_selector
984 					{
985 					pushFollow(FOLLOW_simple_selector_in_selector939);
986 					s=simple_selector();
987 					state._fsp--;
988 
989 					 sel.append(s); 
990 					}
991 
992 					}
993 					break;
994 
995 				default :
996 					break loop9;
997 				}
998 			}
999 
1000 			}
1001 
1002 		}
1003 		catch (RecognitionException re) {
1004 			reportError(re);
1005 			recover(input,re);
1006 		}
1007 		finally {
1008 			// do for sure before leaving
1009 		}
1010 		return sel;
1011 	}
1012 	// $ANTLR end "selector"
1013 
1014 
1015 
1016 	// $ANTLR start "combinator"
1017 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:332:1: combinator returns [Combinator c] : ( (t= ( GREATER | PLUS | TILDE ) ) (t= SPACE )? | (t= SPACE ) );
1018 	public final Combinator combinator() throws RecognitionException {
1019 		Combinator c = null;
1020 
1021 
1022 		Token t=null;
1023 
1024 		try {
1025 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:333:5: ( (t= ( GREATER | PLUS | TILDE ) ) (t= SPACE )? | (t= SPACE ) )
1026 			int alt11=2;
1027 			int LA11_0 = input.LA(1);
1028 			if ( (LA11_0==GREATER||LA11_0==PLUS||LA11_0==TILDE) ) {
1029 				alt11=1;
1030 			}
1031 			else if ( (LA11_0==SPACE) ) {
1032 				alt11=2;
1033 			}
1034 
1035 			else {
1036 				NoViableAltException nvae =
1037 					new NoViableAltException("", 11, 0, input);
1038 				throw nvae;
1039 			}
1040 
1041 			switch (alt11) {
1042 				case 1 :
1043 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:333:7: (t= ( GREATER | PLUS | TILDE ) ) (t= SPACE )?
1044 					{
1045 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:333:7: (t= ( GREATER | PLUS | TILDE ) )
1046 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:333:9: t= ( GREATER | PLUS | TILDE )
1047 					{
1048 					t=input.LT(1);
1049 					if ( input.LA(1)==GREATER||input.LA(1)==PLUS||input.LA(1)==TILDE ) {
1050 						input.consume();
1051 						state.errorRecovery=false;
1052 					}
1053 					else {
1054 						MismatchedSetException mse = new MismatchedSetException(null,input);
1055 						throw mse;
1056 					}
1057 					 c = new Combinator(t); 
1058 					}
1059 
1060 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:336:7: (t= SPACE )?
1061 					int alt10=2;
1062 					int LA10_0 = input.LA(1);
1063 					if ( (LA10_0==SPACE) ) {
1064 						alt10=1;
1065 					}
1066 					switch (alt10) {
1067 						case 1 :
1068 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:336:9: t= SPACE
1069 							{
1070 							t=(Token)match(input,SPACE,FOLLOW_SPACE_in_combinator1035); 
1071 							 c.append(t);           
1072 							}
1073 							break;
1074 
1075 					}
1076 
1077 					}
1078 					break;
1079 				case 2 :
1080 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:337:7: (t= SPACE )
1081 					{
1082 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:337:7: (t= SPACE )
1083 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:337:9: t= SPACE
1084 					{
1085 					t=(Token)match(input,SPACE,FOLLOW_SPACE_in_combinator1065); 
1086 					 c = new Combinator(t); 
1087 					}
1088 
1089 					}
1090 					break;
1091 
1092 			}
1093 		}
1094 		catch (RecognitionException re) {
1095 			reportError(re);
1096 			recover(input,re);
1097 		}
1098 		finally {
1099 			// do for sure before leaving
1100 		}
1101 		return c;
1102 	}
1103 	// $ANTLR end "combinator"
1104 
1105 
1106 
1107 	// $ANTLR start "relative_selector"
1108 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:340:1: relative_selector returns [RelativeSelector sel] : ( (t= ( GREATER | PLUS | TILDE ) ) (t= SPACE )? )? (s= selector ) ;
1109 	public final RelativeSelector relative_selector() throws RecognitionException {
1110 		RelativeSelector sel = null;
1111 
1112 
1113 		Token t=null;
1114 		Selector s =null;
1115 
1116 
1117 		    sel = new RelativeSelector();
1118 		    Combinator c = null;
1119 
1120 		try {
1121 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:345:5: ( ( (t= ( GREATER | PLUS | TILDE ) ) (t= SPACE )? )? (s= selector ) )
1122 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:345:7: ( (t= ( GREATER | PLUS | TILDE ) ) (t= SPACE )? )? (s= selector )
1123 			{
1124 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:345:7: ( (t= ( GREATER | PLUS | TILDE ) ) (t= SPACE )? )?
1125 			int alt13=2;
1126 			int LA13_0 = input.LA(1);
1127 			if ( (LA13_0==GREATER||LA13_0==PLUS||LA13_0==TILDE) ) {
1128 				alt13=1;
1129 			}
1130 			switch (alt13) {
1131 				case 1 :
1132 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:345:9: (t= ( GREATER | PLUS | TILDE ) ) (t= SPACE )?
1133 					{
1134 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:345:9: (t= ( GREATER | PLUS | TILDE ) )
1135 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:345:11: t= ( GREATER | PLUS | TILDE )
1136 					{
1137 					t=input.LT(1);
1138 					if ( input.LA(1)==GREATER||input.LA(1)==PLUS||input.LA(1)==TILDE ) {
1139 						input.consume();
1140 						state.errorRecovery=false;
1141 					}
1142 					else {
1143 						MismatchedSetException mse = new MismatchedSetException(null,input);
1144 						throw mse;
1145 					}
1146 					 c = new Combinator(t); 
1147 					}
1148 
1149 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:348:9: (t= SPACE )?
1150 					int alt12=2;
1151 					int LA12_0 = input.LA(1);
1152 					if ( (LA12_0==SPACE) ) {
1153 						alt12=1;
1154 					}
1155 					switch (alt12) {
1156 						case 1 :
1157 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:348:11: t= SPACE
1158 							{
1159 							t=(Token)match(input,SPACE,FOLLOW_SPACE_in_relative_selector1173); 
1160 							 c.append(t);           
1161 							}
1162 							break;
1163 
1164 					}
1165 
1166 					}
1167 					break;
1168 
1169 			}
1170 
1171 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:350:7: (s= selector )
1172 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:350:9: s= selector
1173 			{
1174 			pushFollow(FOLLOW_selector_in_relative_selector1212);
1175 			s=selector();
1176 			state._fsp--;
1177 
1178 			 if (c == null)
1179 			                                   c = new Combinator(SPACE);
1180 			                               sel.append(c);
1181 			                               sel.append(s);         
1182 			}
1183 
1184 			}
1185 
1186 		}
1187 		catch (RecognitionException re) {
1188 			reportError(re);
1189 			recover(input,re);
1190 		}
1191 		finally {
1192 			// do for sure before leaving
1193 		}
1194 		return sel;
1195 	}
1196 	// $ANTLR end "relative_selector"
1197 
1198 
1199 
1200 	// $ANTLR start "simple_selector"
1201 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:356:1: simple_selector returns [SimpleSelector sel] : ( (s= type_selector ) (s= selector_part )* | (s= selector_part )+ ) (t= SPACE )? ;
1202 	public final SimpleSelector simple_selector() throws RecognitionException {
1203 		SimpleSelector sel = null;
1204 
1205 
1206 		Token t=null;
1207 		SelectorPart s =null;
1208 
1209 
1210 		    sel = new SimpleSelector();
1211 
1212 		try {
1213 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:360:5: ( ( (s= type_selector ) (s= selector_part )* | (s= selector_part )+ ) (t= SPACE )? )
1214 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:360:7: ( (s= type_selector ) (s= selector_part )* | (s= selector_part )+ ) (t= SPACE )?
1215 			{
1216 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:360:7: ( (s= type_selector ) (s= selector_part )* | (s= selector_part )+ )
1217 			int alt16=2;
1218 			int LA16_0 = input.LA(1);
1219 			if ( (LA16_0==ASTERISK||LA16_0==BAR||LA16_0==IDENT) ) {
1220 				alt16=1;
1221 			}
1222 			else if ( (LA16_0==COLON||(LA16_0 >= HAS && LA16_0 <= HASH)||LA16_0==LBRACE||(LA16_0 >= NOT && LA16_0 <= PERIOD)) ) {
1223 				alt16=2;
1224 			}
1225 
1226 			else {
1227 				NoViableAltException nvae =
1228 					new NoViableAltException("", 16, 0, input);
1229 				throw nvae;
1230 			}
1231 
1232 			switch (alt16) {
1233 				case 1 :
1234 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:360:9: (s= type_selector ) (s= selector_part )*
1235 					{
1236 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:360:9: (s= type_selector )
1237 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:360:11: s= type_selector
1238 					{
1239 					pushFollow(FOLLOW_type_selector_in_simple_selector1258);
1240 					s=type_selector();
1241 					state._fsp--;
1242 
1243 					 sel.append(s); 
1244 					}
1245 
1246 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:361:9: (s= selector_part )*
1247 					loop14:
1248 					while (true) {
1249 						int alt14=2;
1250 						int LA14_0 = input.LA(1);
1251 						if ( (LA14_0==COLON||(LA14_0 >= HAS && LA14_0 <= HASH)||LA14_0==LBRACE||(LA14_0 >= NOT && LA14_0 <= PERIOD)) ) {
1252 							alt14=1;
1253 						}
1254 
1255 						switch (alt14) {
1256 						case 1 :
1257 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:361:11: s= selector_part
1258 							{
1259 							pushFollow(FOLLOW_selector_part_in_simple_selector1279);
1260 							s=selector_part();
1261 							state._fsp--;
1262 
1263 							 sel.append(s); 
1264 							}
1265 							break;
1266 
1267 						default :
1268 							break loop14;
1269 						}
1270 					}
1271 
1272 					}
1273 					break;
1274 				case 2 :
1275 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:362:9: (s= selector_part )+
1276 					{
1277 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:362:9: (s= selector_part )+
1278 					int cnt15=0;
1279 					loop15:
1280 					while (true) {
1281 						int alt15=2;
1282 						int LA15_0 = input.LA(1);
1283 						if ( (LA15_0==COLON||(LA15_0 >= HAS && LA15_0 <= HASH)||LA15_0==LBRACE||(LA15_0 >= NOT && LA15_0 <= PERIOD)) ) {
1284 							alt15=1;
1285 						}
1286 
1287 						switch (alt15) {
1288 						case 1 :
1289 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:362:11: s= selector_part
1290 							{
1291 							pushFollow(FOLLOW_selector_part_in_simple_selector1301);
1292 							s=selector_part();
1293 							state._fsp--;
1294 
1295 							 sel.append(s); 
1296 							}
1297 							break;
1298 
1299 						default :
1300 							if ( cnt15 >= 1 ) break loop15;
1301 							EarlyExitException eee = new EarlyExitException(15, input);
1302 							throw eee;
1303 						}
1304 						cnt15++;
1305 					}
1306 
1307 					}
1308 					break;
1309 
1310 			}
1311 
1312 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:364:7: (t= SPACE )?
1313 			int alt17=2;
1314 			int LA17_0 = input.LA(1);
1315 			if ( (LA17_0==SPACE) ) {
1316 				int LA17_1 = input.LA(2);
1317 				if ( (LA17_1==COMMA||LA17_1==GREATER||LA17_1==LCURLY||LA17_1==PLUS||LA17_1==RPAREN||LA17_1==SPACE||LA17_1==TILDE) ) {
1318 					alt17=1;
1319 				}
1320 			}
1321 			switch (alt17) {
1322 				case 1 :
1323 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:364:9: t= SPACE
1324 					{
1325 					t=(Token)match(input,SPACE,FOLLOW_SPACE_in_simple_selector1329); 
1326 					 sel.append(t); 
1327 					}
1328 					break;
1329 
1330 			}
1331 
1332 			}
1333 
1334 		}
1335 		catch (RecognitionException re) {
1336 			reportError(re);
1337 			recover(input,re);
1338 		}
1339 		finally {
1340 			// do for sure before leaving
1341 		}
1342 		return sel;
1343 	}
1344 	// $ANTLR end "simple_selector"
1345 
1346 
1347 
1348 	// $ANTLR start "selector_part"
1349 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:367:1: selector_part returns [SelectorPart sel] : ( (s= id_selector ) | (s= class_selector ) | (s= attribute_selector ) | (s= pseudo_element ) | (s= pseudo_class ) );
1350 	public final SelectorPart selector_part() throws RecognitionException {
1351 		SelectorPart sel = null;
1352 
1353 
1354 		SelectorPart s =null;
1355 
1356 		try {
1357 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:368:5: ( (s= id_selector ) | (s= class_selector ) | (s= attribute_selector ) | (s= pseudo_element ) | (s= pseudo_class ) )
1358 			int alt18=5;
1359 			switch ( input.LA(1) ) {
1360 			case HASH:
1361 				{
1362 				alt18=1;
1363 				}
1364 				break;
1365 			case PERIOD:
1366 				{
1367 				alt18=2;
1368 				}
1369 				break;
1370 			case LBRACE:
1371 				{
1372 				alt18=3;
1373 				}
1374 				break;
1375 			case COLON:
1376 				{
1377 				int LA18_4 = input.LA(2);
1378 				if ( (LA18_4==COLON) ) {
1379 					alt18=4;
1380 				}
1381 				else if ( (LA18_4==IDENT||LA18_4==NAME) ) {
1382 					alt18=5;
1383 				}
1384 
1385 				else {
1386 					int nvaeMark = input.mark();
1387 					try {
1388 						input.consume();
1389 						NoViableAltException nvae =
1390 							new NoViableAltException("", 18, 4, input);
1391 						throw nvae;
1392 					} finally {
1393 						input.rewind(nvaeMark);
1394 					}
1395 				}
1396 
1397 				}
1398 				break;
1399 			case HAS:
1400 			case NOT:
1401 				{
1402 				alt18=5;
1403 				}
1404 				break;
1405 			default:
1406 				NoViableAltException nvae =
1407 					new NoViableAltException("", 18, 0, input);
1408 				throw nvae;
1409 			}
1410 			switch (alt18) {
1411 				case 1 :
1412 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:368:7: (s= id_selector )
1413 					{
1414 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:368:7: (s= id_selector )
1415 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:368:9: s= id_selector
1416 					{
1417 					pushFollow(FOLLOW_id_selector_in_selector_part1372);
1418 					s=id_selector();
1419 					state._fsp--;
1420 
1421 					 sel = s; 
1422 					}
1423 
1424 					}
1425 					break;
1426 				case 2 :
1427 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:369:7: (s= class_selector )
1428 					{
1429 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:369:7: (s= class_selector )
1430 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:369:9: s= class_selector
1431 					{
1432 					pushFollow(FOLLOW_class_selector_in_selector_part1395);
1433 					s=class_selector();
1434 					state._fsp--;
1435 
1436 					 sel = s; 
1437 					}
1438 
1439 					}
1440 					break;
1441 				case 3 :
1442 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:370:7: (s= attribute_selector )
1443 					{
1444 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:370:7: (s= attribute_selector )
1445 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:370:9: s= attribute_selector
1446 					{
1447 					pushFollow(FOLLOW_attribute_selector_in_selector_part1415);
1448 					s=attribute_selector();
1449 					state._fsp--;
1450 
1451 					 sel = s; 
1452 					}
1453 
1454 					}
1455 					break;
1456 				case 4 :
1457 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:371:7: (s= pseudo_element )
1458 					{
1459 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:371:7: (s= pseudo_element )
1460 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:371:9: s= pseudo_element
1461 					{
1462 					pushFollow(FOLLOW_pseudo_element_in_selector_part1431);
1463 					s=pseudo_element();
1464 					state._fsp--;
1465 
1466 					 sel = s; 
1467 					}
1468 
1469 					}
1470 					break;
1471 				case 5 :
1472 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:372:7: (s= pseudo_class )
1473 					{
1474 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:372:7: (s= pseudo_class )
1475 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:372:9: s= pseudo_class
1476 					{
1477 					pushFollow(FOLLOW_pseudo_class_in_selector_part1451);
1478 					s=pseudo_class();
1479 					state._fsp--;
1480 
1481 					 sel = s; 
1482 					}
1483 
1484 					}
1485 					break;
1486 
1487 			}
1488 		}
1489 		catch (RecognitionException re) {
1490 			reportError(re);
1491 			recover(input,re);
1492 		}
1493 		finally {
1494 			// do for sure before leaving
1495 		}
1496 		return sel;
1497 	}
1498 	// $ANTLR end "selector_part"
1499 
1500 
1501 
1502 	// $ANTLR start "type_selector"
1503 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:375:1: type_selector returns [SelectorPart sel] : ( prefix )? (t= ( IDENT | ASTERISK ) ) ;
1504 	public final SelectorPart type_selector() throws RecognitionException {
1505 		SelectorPart sel = null;
1506 
1507 
1508 		Token t=null;
1509 
1510 
1511 		    sel = new SelectorPart();
1512 
1513 		try {
1514 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:379:5: ( ( prefix )? (t= ( IDENT | ASTERISK ) ) )
1515 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:379:7: ( prefix )? (t= ( IDENT | ASTERISK ) )
1516 			{
1517 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:379:7: ( prefix )?
1518 			int alt19=2;
1519 			int LA19_0 = input.LA(1);
1520 			if ( (LA19_0==ASTERISK||LA19_0==IDENT) ) {
1521 				int LA19_1 = input.LA(2);
1522 				if ( (LA19_1==BAR) ) {
1523 					alt19=1;
1524 				}
1525 			}
1526 			else if ( (LA19_0==BAR) ) {
1527 				alt19=1;
1528 			}
1529 			switch (alt19) {
1530 				case 1 :
1531 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:379:7: prefix
1532 					{
1533 					pushFollow(FOLLOW_prefix_in_type_selector1487);
1534 					prefix();
1535 					state._fsp--;
1536 
1537 					}
1538 					break;
1539 
1540 			}
1541 
1542 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:379:15: (t= ( IDENT | ASTERISK ) )
1543 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:379:17: t= ( IDENT | ASTERISK )
1544 			{
1545 			t=input.LT(1);
1546 			if ( input.LA(1)==ASTERISK||input.LA(1)==IDENT ) {
1547 				input.consume();
1548 				state.errorRecovery=false;
1549 			}
1550 			else {
1551 				MismatchedSetException mse = new MismatchedSetException(null,input);
1552 				throw mse;
1553 			}
1554 			 sel.append(t); 
1555 			}
1556 
1557 			}
1558 
1559 		}
1560 		catch (RecognitionException re) {
1561 			reportError(re);
1562 			recover(input,re);
1563 		}
1564 		finally {
1565 			// do for sure before leaving
1566 		}
1567 		return sel;
1568 	}
1569 	// $ANTLR end "type_selector"
1570 
1571 
1572 
1573 	// $ANTLR start "prefix"
1574 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:383:1: prefix returns [String str] : (t= ( IDENT | ASTERISK ) )? (t= BAR ) ;
1575 	public final String prefix() throws RecognitionException {
1576 		String str = null;
1577 
1578 
1579 		Token t=null;
1580 
1581 
1582 		    StringBuilder sb = new StringBuilder();
1583 
1584 		try {
1585 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:390:5: ( (t= ( IDENT | ASTERISK ) )? (t= BAR ) )
1586 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:390:7: (t= ( IDENT | ASTERISK ) )? (t= BAR )
1587 			{
1588 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:390:7: (t= ( IDENT | ASTERISK ) )?
1589 			int alt20=2;
1590 			int LA20_0 = input.LA(1);
1591 			if ( (LA20_0==ASTERISK||LA20_0==IDENT) ) {
1592 				alt20=1;
1593 			}
1594 			switch (alt20) {
1595 				case 1 :
1596 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:390:9: t= ( IDENT | ASTERISK )
1597 					{
1598 					t=input.LT(1);
1599 					if ( input.LA(1)==ASTERISK||input.LA(1)==IDENT ) {
1600 						input.consume();
1601 						state.errorRecovery=false;
1602 					}
1603 					else {
1604 						MismatchedSetException mse = new MismatchedSetException(null,input);
1605 						throw mse;
1606 					}
1607 					 sb.append(t); 
1608 					}
1609 					break;
1610 
1611 			}
1612 
1613 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:392:7: (t= BAR )
1614 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:392:9: t= BAR
1615 			{
1616 			t=(Token)match(input,BAR,FOLLOW_BAR_in_prefix1595); 
1617 			 sb.append(t); 
1618 			}
1619 
1620 			}
1621 
1622 
1623 			    str = sb.toString();
1624 
1625 		}
1626 		catch (RecognitionException re) {
1627 			reportError(re);
1628 			recover(input,re);
1629 		}
1630 		finally {
1631 			// do for sure before leaving
1632 		}
1633 		return str;
1634 	}
1635 	// $ANTLR end "prefix"
1636 
1637 
1638 
1639 	// $ANTLR start "id_selector"
1640 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:395:1: id_selector returns [SelectorPart sel] : (t= HASH ) (t= ( IDENT | NAME ) ) ;
1641 	public final SelectorPart id_selector() throws RecognitionException {
1642 		SelectorPart sel = null;
1643 
1644 
1645 		Token t=null;
1646 
1647 
1648 		    sel = new SelectorPart();
1649 
1650 		try {
1651 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:399:5: ( (t= HASH ) (t= ( IDENT | NAME ) ) )
1652 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:399:7: (t= HASH ) (t= ( IDENT | NAME ) )
1653 			{
1654 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:399:7: (t= HASH )
1655 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:399:9: t= HASH
1656 			{
1657 			t=(Token)match(input,HASH,FOLLOW_HASH_in_id_selector1643); 
1658 			 sel.append(t); 
1659 			}
1660 
1661 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:400:7: (t= ( IDENT | NAME ) )
1662 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:400:9: t= ( IDENT | NAME )
1663 			{
1664 			t=input.LT(1);
1665 			if ( input.LA(1)==IDENT||input.LA(1)==NAME ) {
1666 				input.consume();
1667 				state.errorRecovery=false;
1668 			}
1669 			else {
1670 				MismatchedSetException mse = new MismatchedSetException(null,input);
1671 				throw mse;
1672 			}
1673 			 sel.append(t); 
1674 			}
1675 
1676 			}
1677 
1678 		}
1679 		catch (RecognitionException re) {
1680 			reportError(re);
1681 			recover(input,re);
1682 		}
1683 		finally {
1684 			// do for sure before leaving
1685 		}
1686 		return sel;
1687 	}
1688 	// $ANTLR end "id_selector"
1689 
1690 
1691 
1692 	// $ANTLR start "class_selector"
1693 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:403:1: class_selector returns [SelectorPart sel] : (t= PERIOD ) (t= IDENT ) ;
1694 	public final SelectorPart class_selector() throws RecognitionException {
1695 		SelectorPart sel = null;
1696 
1697 
1698 		Token t=null;
1699 
1700 
1701 		    sel = new SelectorPart();
1702 
1703 		try {
1704 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:407:5: ( (t= PERIOD ) (t= IDENT ) )
1705 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:407:7: (t= PERIOD ) (t= IDENT )
1706 			{
1707 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:407:7: (t= PERIOD )
1708 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:407:9: t= PERIOD
1709 			{
1710 			t=(Token)match(input,PERIOD,FOLLOW_PERIOD_in_class_selector1715); 
1711 			 sel.append(t); 
1712 			}
1713 
1714 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:408:7: (t= IDENT )
1715 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:408:9: t= IDENT
1716 			{
1717 			t=(Token)match(input,IDENT,FOLLOW_IDENT_in_class_selector1742); 
1718 			 sel.append(t); 
1719 			}
1720 
1721 			}
1722 
1723 		}
1724 		catch (RecognitionException re) {
1725 			reportError(re);
1726 			recover(input,re);
1727 		}
1728 		finally {
1729 			// do for sure before leaving
1730 		}
1731 		return sel;
1732 	}
1733 	// $ANTLR end "class_selector"
1734 
1735 
1736 
1737 	// $ANTLR start "attribute_selector"
1738 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:411:1: attribute_selector returns [SelectorPart sel] : (t= LBRACE ) (t= (~ RBRACE ) )+ (t= RBRACE ) ;
1739 	public final SelectorPart attribute_selector() throws RecognitionException {
1740 		SelectorPart sel = null;
1741 
1742 
1743 		Token t=null;
1744 
1745 
1746 		    sel = new SelectorPart();
1747 
1748 		try {
1749 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:415:5: ( (t= LBRACE ) (t= (~ RBRACE ) )+ (t= RBRACE ) )
1750 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:415:7: (t= LBRACE ) (t= (~ RBRACE ) )+ (t= RBRACE )
1751 			{
1752 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:415:7: (t= LBRACE )
1753 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:415:9: t= LBRACE
1754 			{
1755 			t=(Token)match(input,LBRACE,FOLLOW_LBRACE_in_attribute_selector1788); 
1756 			 sel.append(t); 
1757 			}
1758 
1759 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:416:7: (t= (~ RBRACE ) )+
1760 			int cnt21=0;
1761 			loop21:
1762 			while (true) {
1763 				int alt21=2;
1764 				int LA21_0 = input.LA(1);
1765 				if ( ((LA21_0 >= ANY && LA21_0 <= QUOT)||(LA21_0 >= RCURLY && LA21_0 <= XML_COMMENT_OPEN)) ) {
1766 					alt21=1;
1767 				}
1768 
1769 				switch (alt21) {
1770 				case 1 :
1771 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:416:9: t= (~ RBRACE )
1772 					{
1773 					t=input.LT(1);
1774 					if ( (input.LA(1) >= ANY && input.LA(1) <= QUOT)||(input.LA(1) >= RCURLY && input.LA(1) <= XML_COMMENT_OPEN) ) {
1775 						input.consume();
1776 						state.errorRecovery=false;
1777 					}
1778 					else {
1779 						MismatchedSetException mse = new MismatchedSetException(null,input);
1780 						throw mse;
1781 					}
1782 					 sel.append(t); 
1783 					}
1784 					break;
1785 
1786 				default :
1787 					if ( cnt21 >= 1 ) break loop21;
1788 					EarlyExitException eee = new EarlyExitException(21, input);
1789 					throw eee;
1790 				}
1791 				cnt21++;
1792 			}
1793 
1794 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:417:7: (t= RBRACE )
1795 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:417:9: t= RBRACE
1796 			{
1797 			t=(Token)match(input,RBRACE,FOLLOW_RBRACE_in_attribute_selector1843); 
1798 			 sel.append(t); 
1799 			}
1800 
1801 			}
1802 
1803 		}
1804 		catch (RecognitionException re) {
1805 			reportError(re);
1806 			recover(input,re);
1807 		}
1808 		finally {
1809 			// do for sure before leaving
1810 		}
1811 		return sel;
1812 	}
1813 	// $ANTLR end "attribute_selector"
1814 
1815 
1816 
1817 	// $ANTLR start "pseudo_element"
1818 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:420:1: pseudo_element returns [SelectorPart sel] : (t= COLON ) (t= COLON ) (t= ( IDENT | NAME ) ) ( (t= LPAREN ) (t= (~ RPAREN ) )* (t= RPAREN ) )? ;
1819 	public final SelectorPart pseudo_element() throws RecognitionException {
1820 		SelectorPart sel = null;
1821 
1822 
1823 		Token t=null;
1824 
1825 
1826 		    sel = new PseudoElement();
1827 
1828 		try {
1829 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:424:5: ( (t= COLON ) (t= COLON ) (t= ( IDENT | NAME ) ) ( (t= LPAREN ) (t= (~ RPAREN ) )* (t= RPAREN ) )? )
1830 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:424:7: (t= COLON ) (t= COLON ) (t= ( IDENT | NAME ) ) ( (t= LPAREN ) (t= (~ RPAREN ) )* (t= RPAREN ) )?
1831 			{
1832 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:424:7: (t= COLON )
1833 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:424:9: t= COLON
1834 			{
1835 			t=(Token)match(input,COLON,FOLLOW_COLON_in_pseudo_element1888); 
1836 			 sel.append(t); 
1837 			}
1838 
1839 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:425:7: (t= COLON )
1840 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:425:9: t= COLON
1841 			{
1842 			t=(Token)match(input,COLON,FOLLOW_COLON_in_pseudo_element1916); 
1843 			 sel.append(t); 
1844 			}
1845 
1846 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:426:7: (t= ( IDENT | NAME ) )
1847 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:426:9: t= ( IDENT | NAME )
1848 			{
1849 			t=input.LT(1);
1850 			if ( input.LA(1)==IDENT||input.LA(1)==NAME ) {
1851 				input.consume();
1852 				state.errorRecovery=false;
1853 			}
1854 			else {
1855 				MismatchedSetException mse = new MismatchedSetException(null,input);
1856 				throw mse;
1857 			}
1858 			 sel.append(t); 
1859 			}
1860 
1861 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:427:7: ( (t= LPAREN ) (t= (~ RPAREN ) )* (t= RPAREN ) )?
1862 			int alt23=2;
1863 			int LA23_0 = input.LA(1);
1864 			if ( (LA23_0==LPAREN) ) {
1865 				alt23=1;
1866 			}
1867 			switch (alt23) {
1868 				case 1 :
1869 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:427:9: (t= LPAREN ) (t= (~ RPAREN ) )* (t= RPAREN )
1870 					{
1871 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:427:9: (t= LPAREN )
1872 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:427:11: t= LPAREN
1873 					{
1874 					t=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_pseudo_element1971); 
1875 					 sel.append(t); 
1876 					}
1877 
1878 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:428:9: (t= (~ RPAREN ) )*
1879 					loop22:
1880 					while (true) {
1881 						int alt22=2;
1882 						int LA22_0 = input.LA(1);
1883 						if ( ((LA22_0 >= ANY && LA22_0 <= RCURLY)||(LA22_0 >= SEMICOLON && LA22_0 <= XML_COMMENT_OPEN)) ) {
1884 							alt22=1;
1885 						}
1886 
1887 						switch (alt22) {
1888 						case 1 :
1889 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:428:11: t= (~ RPAREN )
1890 							{
1891 							t=input.LT(1);
1892 							if ( (input.LA(1) >= ANY && input.LA(1) <= RCURLY)||(input.LA(1) >= SEMICOLON && input.LA(1) <= XML_COMMENT_OPEN) ) {
1893 								input.consume();
1894 								state.errorRecovery=false;
1895 							}
1896 							else {
1897 								MismatchedSetException mse = new MismatchedSetException(null,input);
1898 								throw mse;
1899 							}
1900 							 sel.append(t); 
1901 							}
1902 							break;
1903 
1904 						default :
1905 							break loop22;
1906 						}
1907 					}
1908 
1909 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:429:9: (t= RPAREN )
1910 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:429:11: t= RPAREN
1911 					{
1912 					t=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_pseudo_element2026); 
1913 					 sel.append(t); 
1914 					}
1915 
1916 					}
1917 					break;
1918 
1919 			}
1920 
1921 			}
1922 
1923 		}
1924 		catch (RecognitionException re) {
1925 			reportError(re);
1926 			recover(input,re);
1927 		}
1928 		finally {
1929 			// do for sure before leaving
1930 		}
1931 		return sel;
1932 	}
1933 	// $ANTLR end "pseudo_element"
1934 
1935 
1936 
1937 	// $ANTLR start "pseudo_class"
1938 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:433:1: pseudo_class returns [SelectorPart sel] : ( (ns= negation_selector ) | (rs= relational_selector ) | (t= COLON ) (t= ( IDENT | NAME ) ) ( (t= LPAREN ) (t= (~ RPAREN ) )* (t= RPAREN ) )? );
1939 	public final SelectorPart pseudo_class() throws RecognitionException {
1940 		SelectorPart sel = null;
1941 
1942 
1943 		Token t=null;
1944 		NegationSelector ns =null;
1945 		RelationalSelector rs =null;
1946 
1947 
1948 		    sel = new PseudoClass();
1949 
1950 		try {
1951 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:437:5: ( (ns= negation_selector ) | (rs= relational_selector ) | (t= COLON ) (t= ( IDENT | NAME ) ) ( (t= LPAREN ) (t= (~ RPAREN ) )* (t= RPAREN ) )? )
1952 			int alt26=3;
1953 			switch ( input.LA(1) ) {
1954 			case NOT:
1955 				{
1956 				alt26=1;
1957 				}
1958 				break;
1959 			case HAS:
1960 				{
1961 				alt26=2;
1962 				}
1963 				break;
1964 			case COLON:
1965 				{
1966 				alt26=3;
1967 				}
1968 				break;
1969 			default:
1970 				NoViableAltException nvae =
1971 					new NoViableAltException("", 26, 0, input);
1972 				throw nvae;
1973 			}
1974 			switch (alt26) {
1975 				case 1 :
1976 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:437:7: (ns= negation_selector )
1977 					{
1978 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:437:7: (ns= negation_selector )
1979 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:437:9: ns= negation_selector
1980 					{
1981 					pushFollow(FOLLOW_negation_selector_in_pseudo_class2080);
1982 					ns=negation_selector();
1983 					state._fsp--;
1984 
1985 					 sel = ns;      
1986 					}
1987 
1988 					}
1989 					break;
1990 				case 2 :
1991 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:438:7: (rs= relational_selector )
1992 					{
1993 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:438:7: (rs= relational_selector )
1994 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:438:9: rs= relational_selector
1995 					{
1996 					pushFollow(FOLLOW_relational_selector_in_pseudo_class2099);
1997 					rs=relational_selector();
1998 					state._fsp--;
1999 
2000 					 sel = rs;      
2001 					}
2002 
2003 					}
2004 					break;
2005 				case 3 :
2006 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:439:7: (t= COLON ) (t= ( IDENT | NAME ) ) ( (t= LPAREN ) (t= (~ RPAREN ) )* (t= RPAREN ) )?
2007 					{
2008 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:439:7: (t= COLON )
2009 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:439:9: t= COLON
2010 					{
2011 					t=(Token)match(input,COLON,FOLLOW_COLON_in_pseudo_class2116); 
2012 					 sel.append(t); 
2013 					}
2014 
2015 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:440:7: (t= ( IDENT | NAME ) )
2016 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:440:9: t= ( IDENT | NAME )
2017 					{
2018 					t=input.LT(1);
2019 					if ( input.LA(1)==IDENT||input.LA(1)==NAME ) {
2020 						input.consume();
2021 						state.errorRecovery=false;
2022 					}
2023 					else {
2024 						MismatchedSetException mse = new MismatchedSetException(null,input);
2025 						throw mse;
2026 					}
2027 					 sel.append(t); 
2028 					}
2029 
2030 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:441:7: ( (t= LPAREN ) (t= (~ RPAREN ) )* (t= RPAREN ) )?
2031 					int alt25=2;
2032 					int LA25_0 = input.LA(1);
2033 					if ( (LA25_0==LPAREN) ) {
2034 						alt25=1;
2035 					}
2036 					switch (alt25) {
2037 						case 1 :
2038 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:441:9: (t= LPAREN ) (t= (~ RPAREN ) )* (t= RPAREN )
2039 							{
2040 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:441:9: (t= LPAREN )
2041 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:441:11: t= LPAREN
2042 							{
2043 							t=(Token)match(input,LPAREN,FOLLOW_LPAREN_in_pseudo_class2179); 
2044 							 sel.append(t); 
2045 							}
2046 
2047 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:442:9: (t= (~ RPAREN ) )*
2048 							loop24:
2049 							while (true) {
2050 								int alt24=2;
2051 								int LA24_0 = input.LA(1);
2052 								if ( ((LA24_0 >= ANY && LA24_0 <= RCURLY)||(LA24_0 >= SEMICOLON && LA24_0 <= XML_COMMENT_OPEN)) ) {
2053 									alt24=1;
2054 								}
2055 
2056 								switch (alt24) {
2057 								case 1 :
2058 									// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:442:11: t= (~ RPAREN )
2059 									{
2060 									t=input.LT(1);
2061 									if ( (input.LA(1) >= ANY && input.LA(1) <= RCURLY)||(input.LA(1) >= SEMICOLON && input.LA(1) <= XML_COMMENT_OPEN) ) {
2062 										input.consume();
2063 										state.errorRecovery=false;
2064 									}
2065 									else {
2066 										MismatchedSetException mse = new MismatchedSetException(null,input);
2067 										throw mse;
2068 									}
2069 									 sel.append(t); 
2070 									}
2071 									break;
2072 
2073 								default :
2074 									break loop24;
2075 								}
2076 							}
2077 
2078 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:443:9: (t= RPAREN )
2079 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:443:11: t= RPAREN
2080 							{
2081 							t=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_pseudo_class2242); 
2082 							 sel.append(t); 
2083 							}
2084 
2085 							}
2086 							break;
2087 
2088 					}
2089 
2090 					}
2091 					break;
2092 
2093 			}
2094 		}
2095 		catch (RecognitionException re) {
2096 			reportError(re);
2097 			recover(input,re);
2098 		}
2099 		finally {
2100 			// do for sure before leaving
2101 		}
2102 		return sel;
2103 	}
2104 	// $ANTLR end "pseudo_class"
2105 
2106 
2107 
2108 	// $ANTLR start "negation_selector"
2109 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:447:1: negation_selector returns [NegationSelector sel] : (t= NOT ) (t= SPACE )? (s= simple_selector ) ( (t= COMMA ) (t= SPACE )? (s= simple_selector ) )* (t= RPAREN ) ;
2110 	public final NegationSelector negation_selector() throws RecognitionException {
2111 		NegationSelector sel = null;
2112 
2113 
2114 		Token t=null;
2115 		SimpleSelector s =null;
2116 
2117 
2118 		    sel = new NegationSelector();
2119 
2120 		try {
2121 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:451:5: ( (t= NOT ) (t= SPACE )? (s= simple_selector ) ( (t= COMMA ) (t= SPACE )? (s= simple_selector ) )* (t= RPAREN ) )
2122 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:451:7: (t= NOT ) (t= SPACE )? (s= simple_selector ) ( (t= COMMA ) (t= SPACE )? (s= simple_selector ) )* (t= RPAREN )
2123 			{
2124 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:451:7: (t= NOT )
2125 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:451:9: t= NOT
2126 			{
2127 			t=(Token)match(input,NOT,FOLLOW_NOT_in_negation_selector2300); 
2128 			 sel.append(t); 
2129 			}
2130 
2131 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:452:7: (t= SPACE )?
2132 			int alt27=2;
2133 			int LA27_0 = input.LA(1);
2134 			if ( (LA27_0==SPACE) ) {
2135 				alt27=1;
2136 			}
2137 			switch (alt27) {
2138 				case 1 :
2139 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:452:9: t= SPACE
2140 					{
2141 					t=(Token)match(input,SPACE,FOLLOW_SPACE_in_negation_selector2332); 
2142 					 sel.append(t); 
2143 					}
2144 					break;
2145 
2146 			}
2147 
2148 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:453:7: (s= simple_selector )
2149 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:453:9: s= simple_selector
2150 			{
2151 			pushFollow(FOLLOW_simple_selector_in_negation_selector2363);
2152 			s=simple_selector();
2153 			state._fsp--;
2154 
2155 			 sel.append(s); 
2156 			}
2157 
2158 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:454:7: ( (t= COMMA ) (t= SPACE )? (s= simple_selector ) )*
2159 			loop29:
2160 			while (true) {
2161 				int alt29=2;
2162 				int LA29_0 = input.LA(1);
2163 				if ( (LA29_0==COMMA) ) {
2164 					alt29=1;
2165 				}
2166 
2167 				switch (alt29) {
2168 				case 1 :
2169 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:454:9: (t= COMMA ) (t= SPACE )? (s= simple_selector )
2170 					{
2171 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:454:9: (t= COMMA )
2172 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:454:11: t= COMMA
2173 					{
2174 					t=(Token)match(input,COMMA,FOLLOW_COMMA_in_negation_selector2385); 
2175 					 sel.append(t); 
2176 					}
2177 
2178 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:455:9: (t= SPACE )?
2179 					int alt28=2;
2180 					int LA28_0 = input.LA(1);
2181 					if ( (LA28_0==SPACE) ) {
2182 						alt28=1;
2183 					}
2184 					switch (alt28) {
2185 						case 1 :
2186 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:455:11: t= SPACE
2187 							{
2188 							t=(Token)match(input,SPACE,FOLLOW_SPACE_in_negation_selector2415); 
2189 							 sel.append(t); 
2190 							}
2191 							break;
2192 
2193 					}
2194 
2195 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:456:9: (s= simple_selector )
2196 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:456:11: s= simple_selector
2197 					{
2198 					pushFollow(FOLLOW_simple_selector_in_negation_selector2446);
2199 					s=simple_selector();
2200 					state._fsp--;
2201 
2202 					 sel.append(s); 
2203 					}
2204 
2205 					}
2206 					break;
2207 
2208 				default :
2209 					break loop29;
2210 				}
2211 			}
2212 
2213 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:458:7: (t= RPAREN )
2214 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:458:9: t= RPAREN
2215 			{
2216 			t=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_negation_selector2475); 
2217 			 sel.append(t); 
2218 			}
2219 
2220 			}
2221 
2222 		}
2223 		catch (RecognitionException re) {
2224 			reportError(re);
2225 			recover(input,re);
2226 		}
2227 		finally {
2228 			// do for sure before leaving
2229 		}
2230 		return sel;
2231 	}
2232 	// $ANTLR end "negation_selector"
2233 
2234 
2235 
2236 	// $ANTLR start "relational_selector"
2237 	// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:461:1: relational_selector returns [RelationalSelector sel] : (t= HAS ) (t= SPACE )? (s= relative_selector ) ( (t= COMMA ) (t= SPACE )? (s= relative_selector ) )* (t= RPAREN ) ;
2238 	public final RelationalSelector relational_selector() throws RecognitionException {
2239 		RelationalSelector sel = null;
2240 
2241 
2242 		Token t=null;
2243 		RelativeSelector s =null;
2244 
2245 
2246 		    sel = new RelationalSelector();
2247 
2248 		try {
2249 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:465:5: ( (t= HAS ) (t= SPACE )? (s= relative_selector ) ( (t= COMMA ) (t= SPACE )? (s= relative_selector ) )* (t= RPAREN ) )
2250 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:465:7: (t= HAS ) (t= SPACE )? (s= relative_selector ) ( (t= COMMA ) (t= SPACE )? (s= relative_selector ) )* (t= RPAREN )
2251 			{
2252 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:465:7: (t= HAS )
2253 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:465:9: t= HAS
2254 			{
2255 			t=(Token)match(input,HAS,FOLLOW_HAS_in_relational_selector2522); 
2256 			 sel.append(t); 
2257 			}
2258 
2259 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:466:7: (t= SPACE )?
2260 			int alt30=2;
2261 			int LA30_0 = input.LA(1);
2262 			if ( (LA30_0==SPACE) ) {
2263 				alt30=1;
2264 			}
2265 			switch (alt30) {
2266 				case 1 :
2267 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:466:9: t= SPACE
2268 					{
2269 					t=(Token)match(input,SPACE,FOLLOW_SPACE_in_relational_selector2554); 
2270 					 sel.append(t); 
2271 					}
2272 					break;
2273 
2274 			}
2275 
2276 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:467:7: (s= relative_selector )
2277 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:467:9: s= relative_selector
2278 			{
2279 			pushFollow(FOLLOW_relative_selector_in_relational_selector2585);
2280 			s=relative_selector();
2281 			state._fsp--;
2282 
2283 			 sel.append(s); 
2284 			}
2285 
2286 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:468:7: ( (t= COMMA ) (t= SPACE )? (s= relative_selector ) )*
2287 			loop32:
2288 			while (true) {
2289 				int alt32=2;
2290 				int LA32_0 = input.LA(1);
2291 				if ( (LA32_0==COMMA) ) {
2292 					alt32=1;
2293 				}
2294 
2295 				switch (alt32) {
2296 				case 1 :
2297 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:468:9: (t= COMMA ) (t= SPACE )? (s= relative_selector )
2298 					{
2299 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:468:9: (t= COMMA )
2300 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:468:11: t= COMMA
2301 					{
2302 					t=(Token)match(input,COMMA,FOLLOW_COMMA_in_relational_selector2605); 
2303 					 sel.append(t); 
2304 					}
2305 
2306 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:469:9: (t= SPACE )?
2307 					int alt31=2;
2308 					int LA31_0 = input.LA(1);
2309 					if ( (LA31_0==SPACE) ) {
2310 						alt31=1;
2311 					}
2312 					switch (alt31) {
2313 						case 1 :
2314 							// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:469:11: t= SPACE
2315 							{
2316 							t=(Token)match(input,SPACE,FOLLOW_SPACE_in_relational_selector2635); 
2317 							 sel.append(t); 
2318 							}
2319 							break;
2320 
2321 					}
2322 
2323 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:470:9: (s= relative_selector )
2324 					// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:470:11: s= relative_selector
2325 					{
2326 					pushFollow(FOLLOW_relative_selector_in_relational_selector2666);
2327 					s=relative_selector();
2328 					state._fsp--;
2329 
2330 					 sel.append(s); 
2331 					}
2332 
2333 					}
2334 					break;
2335 
2336 				default :
2337 					break loop32;
2338 				}
2339 			}
2340 
2341 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:472:7: (t= RPAREN )
2342 			// org/daisy/pipeline/css/sass/impl/SassPostProcess.g:472:9: t= RPAREN
2343 			{
2344 			t=(Token)match(input,RPAREN,FOLLOW_RPAREN_in_relational_selector2693); 
2345 			 sel.append(t); 
2346 			}
2347 
2348 			}
2349 
2350 		}
2351 		catch (RecognitionException re) {
2352 			reportError(re);
2353 			recover(input,re);
2354 		}
2355 		finally {
2356 			// do for sure before leaving
2357 		}
2358 		return sel;
2359 	}
2360 	// $ANTLR end "relational_selector"
2361 
2362 	// Delegated rules
2363 
2364 
2365 
2366 	public static final BitSet FOLLOW_stylesheet_in_start48 = new BitSet(new long[]{0x0000000000000002L});
2367 	public static final BitSet FOLLOW_set_in_stylesheet84 = new BitSet(new long[]{0x00000608184B8BC2L});
2368 	public static final BitSet FOLLOW_COMMENT_in_stylesheet126 = new BitSet(new long[]{0x00000608184B8BC2L});
2369 	public static final BitSet FOLLOW_media_rule_in_stylesheet150 = new BitSet(new long[]{0x00000608184B8BC2L});
2370 	public static final BitSet FOLLOW_at_rule_in_stylesheet160 = new BitSet(new long[]{0x00000608184B8BC2L});
2371 	public static final BitSet FOLLOW_selector_rule_in_stylesheet174 = new BitSet(new long[]{0x00000608184B8BC2L});
2372 	public static final BitSet FOLLOW_AT_in_at_rule212 = new BitSet(new long[]{0x000007FBFFEFFFF0L});
2373 	public static final BitSet FOLLOW_set_in_at_rule246 = new BitSet(new long[]{0x000007FFFFFFFFF0L});
2374 	public static final BitSet FOLLOW_SEMICOLON_in_at_rule291 = new BitSet(new long[]{0x0000000000000002L});
2375 	public static final BitSet FOLLOW_LCURLY_in_at_rule318 = new BitSet(new long[]{0x000007FFFFFFFFF0L});
2376 	public static final BitSet FOLLOW_at_rule_in_at_rule346 = new BitSet(new long[]{0x000007FFFFFFFFF0L});
2377 	public static final BitSet FOLLOW_set_in_at_rule362 = new BitSet(new long[]{0x000007FFFFFFFFF0L});
2378 	public static final BitSet FOLLOW_RCURLY_in_at_rule420 = new BitSet(new long[]{0x0000000000000002L});
2379 	public static final BitSet FOLLOW_MEDIA_in_media_rule466 = new BitSet(new long[]{0x000007FFFFEFFFF0L});
2380 	public static final BitSet FOLLOW_set_in_media_rule497 = new BitSet(new long[]{0x000007FFFFFFFFF0L});
2381 	public static final BitSet FOLLOW_LCURLY_in_media_rule528 = new BitSet(new long[]{0x00000609184B8BC0L});
2382 	public static final BitSet FOLLOW_stylesheet_in_media_rule558 = new BitSet(new long[]{0x0000000100000000L});
2383 	public static final BitSet FOLLOW_RCURLY_in_media_rule584 = new BitSet(new long[]{0x0000000000000002L});
2384 	public static final BitSet FOLLOW_selector_group_in_selector_rule631 = new BitSet(new long[]{0x0000000000100000L});
2385 	public static final BitSet FOLLOW_LCURLY_in_selector_rule651 = new BitSet(new long[]{0x000007FFFFFFFFF0L});
2386 	public static final BitSet FOLLOW_set_in_selector_rule679 = new BitSet(new long[]{0x000007FFFFFFFFF0L});
2387 	public static final BitSet FOLLOW_RCURLY_in_selector_rule708 = new BitSet(new long[]{0x0000000000000002L});
2388 	public static final BitSet FOLLOW_selector_in_selector_group754 = new BitSet(new long[]{0x0000000000000402L});
2389 	public static final BitSet FOLLOW_COMMA_in_selector_group782 = new BitSet(new long[]{0x00000008180B8340L});
2390 	public static final BitSet FOLLOW_SPACE_in_selector_group811 = new BitSet(new long[]{0x00000000180B8340L});
2391 	public static final BitSet FOLLOW_selector_in_selector_group841 = new BitSet(new long[]{0x0000000000000402L});
2392 	public static final BitSet FOLLOW_simple_selector_in_selector894 = new BitSet(new long[]{0x0000010820004002L});
2393 	public static final BitSet FOLLOW_combinator_in_selector915 = new BitSet(new long[]{0x00000000180B8340L});
2394 	public static final BitSet FOLLOW_simple_selector_in_selector939 = new BitSet(new long[]{0x0000010820004002L});
2395 	public static final BitSet FOLLOW_set_in_combinator980 = new BitSet(new long[]{0x0000000800000002L});
2396 	public static final BitSet FOLLOW_SPACE_in_combinator1035 = new BitSet(new long[]{0x0000000000000002L});
2397 	public static final BitSet FOLLOW_SPACE_in_combinator1065 = new BitSet(new long[]{0x0000000000000002L});
2398 	public static final BitSet FOLLOW_set_in_relative_selector1114 = new BitSet(new long[]{0x00000008180B8340L});
2399 	public static final BitSet FOLLOW_SPACE_in_relative_selector1173 = new BitSet(new long[]{0x00000000180B8340L});
2400 	public static final BitSet FOLLOW_selector_in_relative_selector1212 = new BitSet(new long[]{0x0000000000000002L});
2401 	public static final BitSet FOLLOW_type_selector_in_simple_selector1258 = new BitSet(new long[]{0x0000000818098202L});
2402 	public static final BitSet FOLLOW_selector_part_in_simple_selector1279 = new BitSet(new long[]{0x0000000818098202L});
2403 	public static final BitSet FOLLOW_selector_part_in_simple_selector1301 = new BitSet(new long[]{0x0000000818098202L});
2404 	public static final BitSet FOLLOW_SPACE_in_simple_selector1329 = new BitSet(new long[]{0x0000000000000002L});
2405 	public static final BitSet FOLLOW_id_selector_in_selector_part1372 = new BitSet(new long[]{0x0000000000000002L});
2406 	public static final BitSet FOLLOW_class_selector_in_selector_part1395 = new BitSet(new long[]{0x0000000000000002L});
2407 	public static final BitSet FOLLOW_attribute_selector_in_selector_part1415 = new BitSet(new long[]{0x0000000000000002L});
2408 	public static final BitSet FOLLOW_pseudo_element_in_selector_part1431 = new BitSet(new long[]{0x0000000000000002L});
2409 	public static final BitSet FOLLOW_pseudo_class_in_selector_part1451 = new BitSet(new long[]{0x0000000000000002L});
2410 	public static final BitSet FOLLOW_prefix_in_type_selector1487 = new BitSet(new long[]{0x0000000000020040L});
2411 	public static final BitSet FOLLOW_set_in_type_selector1494 = new BitSet(new long[]{0x0000000000000002L});
2412 	public static final BitSet FOLLOW_set_in_prefix1556 = new BitSet(new long[]{0x0000000000000100L});
2413 	public static final BitSet FOLLOW_BAR_in_prefix1595 = new BitSet(new long[]{0x0000000000000002L});
2414 	public static final BitSet FOLLOW_HASH_in_id_selector1643 = new BitSet(new long[]{0x0000000000820000L});
2415 	public static final BitSet FOLLOW_set_in_id_selector1672 = new BitSet(new long[]{0x0000000000000002L});
2416 	public static final BitSet FOLLOW_PERIOD_in_class_selector1715 = new BitSet(new long[]{0x0000000000020000L});
2417 	public static final BitSet FOLLOW_IDENT_in_class_selector1742 = new BitSet(new long[]{0x0000000000000002L});
2418 	public static final BitSet FOLLOW_LBRACE_in_attribute_selector1788 = new BitSet(new long[]{0x000007FF7FFFFFF0L});
2419 	public static final BitSet FOLLOW_set_in_attribute_selector1815 = new BitSet(new long[]{0x000007FFFFFFFFF0L});
2420 	public static final BitSet FOLLOW_RBRACE_in_attribute_selector1843 = new BitSet(new long[]{0x0000000000000002L});
2421 	public static final BitSet FOLLOW_COLON_in_pseudo_element1888 = new BitSet(new long[]{0x0000000000000200L});
2422 	public static final BitSet FOLLOW_COLON_in_pseudo_element1916 = new BitSet(new long[]{0x0000000000820000L});
2423 	public static final BitSet FOLLOW_set_in_pseudo_element1944 = new BitSet(new long[]{0x0000000000200002L});
2424 	public static final BitSet FOLLOW_LPAREN_in_pseudo_element1971 = new BitSet(new long[]{0x000007FFFFFFFFF0L});
2425 	public static final BitSet FOLLOW_set_in_pseudo_element1998 = new BitSet(new long[]{0x000007FFFFFFFFF0L});
2426 	public static final BitSet FOLLOW_RPAREN_in_pseudo_element2026 = new BitSet(new long[]{0x0000000000000002L});
2427 	public static final BitSet FOLLOW_negation_selector_in_pseudo_class2080 = new BitSet(new long[]{0x0000000000000002L});
2428 	public static final BitSet FOLLOW_relational_selector_in_pseudo_class2099 = new BitSet(new long[]{0x0000000000000002L});
2429 	public static final BitSet FOLLOW_COLON_in_pseudo_class2116 = new BitSet(new long[]{0x0000000000820000L});
2430 	public static final BitSet FOLLOW_set_in_pseudo_class2148 = new BitSet(new long[]{0x0000000000200002L});
2431 	public static final BitSet FOLLOW_LPAREN_in_pseudo_class2179 = new BitSet(new long[]{0x000007FFFFFFFFF0L});
2432 	public static final BitSet FOLLOW_set_in_pseudo_class2210 = new BitSet(new long[]{0x000007FFFFFFFFF0L});
2433 	public static final BitSet FOLLOW_RPAREN_in_pseudo_class2242 = new BitSet(new long[]{0x0000000000000002L});
2434 	public static final BitSet FOLLOW_NOT_in_negation_selector2300 = new BitSet(new long[]{0x00000008180B8340L});
2435 	public static final BitSet FOLLOW_SPACE_in_negation_selector2332 = new BitSet(new long[]{0x00000000180B8340L});
2436 	public static final BitSet FOLLOW_simple_selector_in_negation_selector2363 = new BitSet(new long[]{0x0000000200000400L});
2437 	public static final BitSet FOLLOW_COMMA_in_negation_selector2385 = new BitSet(new long[]{0x00000008180B8340L});
2438 	public static final BitSet FOLLOW_SPACE_in_negation_selector2415 = new BitSet(new long[]{0x00000000180B8340L});
2439 	public static final BitSet FOLLOW_simple_selector_in_negation_selector2446 = new BitSet(new long[]{0x0000000200000400L});
2440 	public static final BitSet FOLLOW_RPAREN_in_negation_selector2475 = new BitSet(new long[]{0x0000000000000002L});
2441 	public static final BitSet FOLLOW_HAS_in_relational_selector2522 = new BitSet(new long[]{0x00000108380BC340L});
2442 	public static final BitSet FOLLOW_SPACE_in_relational_selector2554 = new BitSet(new long[]{0x00000100380BC340L});
2443 	public static final BitSet FOLLOW_relative_selector_in_relational_selector2585 = new BitSet(new long[]{0x0000000200000400L});
2444 	public static final BitSet FOLLOW_COMMA_in_relational_selector2605 = new BitSet(new long[]{0x00000108380BC340L});
2445 	public static final BitSet FOLLOW_SPACE_in_relational_selector2635 = new BitSet(new long[]{0x00000100380BC340L});
2446 	public static final BitSet FOLLOW_relative_selector_in_relational_selector2666 = new BitSet(new long[]{0x0000000200000400L});
2447 	public static final BitSet FOLLOW_RPAREN_in_relational_selector2693 = new BitSet(new long[]{0x0000000000000002L});
2448 }