private CssAtRule ConsumeAtRule(CssToken token) { var name = token.StringValue; var grammar = _grammar.GetAtRuleGrammar(name); if (grammar == null) { // At rule not supported by grammar SkipAtRule(); return(null); } CssComponent prelude = null; CssBlock block = null; if (TryRead(out token)) { var preludeScope = new AtRulePreludeScope(this, grammar); prelude = grammar.ParseAtRulePrelude(preludeScope); if (token.TokenType == CssTokenType.LeftCurlyBracket) { var blockScope = new RuleBlockScope(this, grammar); block = new CssBlock(CssBlockType.CurlyBrackets, _grammar.ParseAtRuleBlock(blockScope)); } } return(grammar.CreateAtRule(name, prelude ?? CssComponent.Empty, block)); }
/* * NOTE: Each ConsumeXXX method consumes the token that is current as of when the * method is called and consumes all subsequent tokens that are read from the tokenizer * during method execution. ConsumeXXX operations must only call other ConsumeYYY * operations and not call any ParseXXX methods. */ /// <summary> /// Reads current token and all subsequent tokens that compose into a <see cref="CssQualifiedRule"/> instance. /// </summary> /// <returns></returns> private CssQualifiedRule ConsumeQualifiedRule(CssToken token) { var preludeFragmentParser = new QualifiedRulePreludeScope(this, _grammar); var prelude = _grammar.ParseQualifiedRulePrelude(preludeFragmentParser); if (token.TokenType == CssTokenType.LeftCurlyBracket && TryRead(out token)) { var blockFragmentParser = new RuleBlockScope(this, _grammar); var block = new CssBlock(CssBlockType.CurlyBrackets, _grammar.ParseQualifiedRuleBlock(blockFragmentParser)); return(_grammar.CreateQualifiedRule(prelude, block)); } // Parse error return(null); }