@Override public String toString() { return getType().toString() + ":" + getSource() + " (" + line + ":" + pos + ")"; } }
@Override public String toString() { return getType().toString() + ":" + getSource() + " (" + line + ":" + pos + ")"; } }
private void readValue(StringBuilder sb) { if (!tokenizer.current().isSymbol("]")) { sb.append(tokenizer.consume().getSource()); } }
private void consumeArgument(StringBuilder sb) { sb.append(tokenizer.consume().getSource()); int braces = 1; while (!tokenizer.current().isEnd() && braces > 0) { if (tokenizer.current().isSymbol("(")) { braces++; } if (tokenizer.current().isSymbol(")")) { braces--; } sb.append(tokenizer.consume().getSource()); } }
private void parseOperatorInSelector(StringBuilder sb) { while (tokenizer.current().isSymbol(":") || tokenizer.current().isSymbol("::")) { sb.append(tokenizer.consume().getSource()); sb.append(tokenizer.consume().getSource()); // Consume arguments like :nth-child(2) if (tokenizer.current().isSymbol("(")) { consumeArgument(sb); } } }
/** * Checks if the given identifier is a keyword and returns an appropriate Token * * @param idToken the identifier to check * @return a keyword Token if the given identifier was a keyword, the original Token otherwise */ protected Token handleKeywords(Token idToken) { String keyword = keywords.get(keywordsCaseSensitive ? idToken.getContents().intern() : idToken.getContents().toLowerCase().intern()); if (keyword != null) { Token keywordToken = Token.create(Token.TokenType.KEYWORD, idToken); keywordToken.setTrigger(keyword); keywordToken.setContent(idToken.getContents()); keywordToken.setSource(idToken.getSource()); return keywordToken; } return idToken; }
/** * Parses the expression in <tt>input</tt> * * @return the parsed expression * @throws ParseException if the expression contains one or more errors */ protected Expression parse() throws ParseException { Expression result = expression().simplify(); if (tokenizer.current().isNotEnd()) { Token token = tokenizer.consume(); errors.add(ParseError.error(token, String.format("Unexpected token: '%s'. Expected an expression.", token.getSource()))); } if (!errors.isEmpty()) { throw ParseException.create(errors); } return result; }
/** * Parses the expression in <tt>input</tt> * * @return the parsed expression * @throws ParseException if the expression contains one or more errors */ protected Expression parse() throws ParseException { Expression result = expression().simplify(); if (tokenizer.current().isNotEnd()) { Token token = tokenizer.consume(); errors.add(ParseError.error(token, String.format("Unexpected token: '%s'. Expected an expression.", token.getSource()))); } if (!errors.isEmpty()) { throw ParseException.create(errors); } return result; }
private void readClosingBracket(StringBuilder sb) { if (!tokenizer.current().isSymbol("]")) { tokenizer.addError(tokenizer.current(), "Unexpected token: '%s'. Expected: ']'", tokenizer.current().getSource()); } else { sb.append(tokenizer.consume().getContents()); } }
/** * Consumes the current token, expecting it to be as <tt>SYMBOL</tt> with the given content * * @param symbol the expected trigger of the current token */ public void consumeExpectedSymbol(String symbol) { if (current().matches(Token.TokenType.SYMBOL, symbol)) { consume(); } else { addError(current(), "Unexpected token: '%s'. Expected: '%s'", current().getSource(), symbol); } }
/** * Consumes the current token, expecting it to be as <tt>KEYWORD</tt> with the given content * * @param keyword the expected content of the current token */ public void consumeExpectedKeyword(String keyword) { if (current().matches(Token.TokenType.KEYWORD, keyword)) { consume(); } else { addError(current(), "Unexpected token: '%s'. Expected: '%s'", current().getSource(), keyword); } }
/** * Consumes the current token, expecting it to be as <tt>KEYWORD</tt> with the given content * * @param keyword the expected content of the current token */ public void consumeExpectedKeyword(String keyword) { if (current().matches(Token.TokenType.KEYWORD, keyword)) { consume(); } else { addError(current(), "Unexpected token: '%s'. Expected: '%s'", current().getSource(), keyword); } }
/** * Consumes the current token, expecting it to be as <tt>SYMBOL</tt> with the given content * * @param symbol the expected trigger of the current token */ public void consumeExpectedSymbol(String symbol) { if (current().matches(Token.TokenType.SYMBOL, symbol)) { consume(); } else { addError(current(), "Unexpected token: '%s'. Expected: '%s'", current().getSource(), symbol); } }
private void readOperator(StringBuilder sb) { if (!tokenizer.current().isSymbol("]")) { if (!tokenizer.current().isSymbol("=", "~=", "|=", "^=", "$=", "*=")) { tokenizer.addError(tokenizer.current(), "Unexpected token: '%s'. Expected an operation.", tokenizer.current().getSource()); } sb.append(tokenizer.consume().getTrigger()); } }
private void readAttributeName(StringBuilder sb) { if (!tokenizer.current().isSymbol("]")) { if (!tokenizer.current().isIdentifier()) { tokenizer.addError(tokenizer.current(), "Unexpected token: '%s'. Expected an attribute name.", tokenizer.current().getSource()); } sb.append(tokenizer.consume().getContents()); } }
private void parseName(Mixin mixin) { if (tokenizer.current().isIdentifier()) { mixin.setName(tokenizer.consume().getContents()); } else { tokenizer.addError(tokenizer.current(), "Unexpected token: '" + tokenizer.current().getSource() + "'. Expected the name of the mixin as identifier."); } }
private void consumeExpectedComma() { if (tokenizer.current().isSymbol(",")) { tokenizer.consumeExpectedSymbol(","); } else if (!tokenizer.current().isSymbol(")")) { tokenizer.addError(tokenizer.current(), "Unexpected token: '" + tokenizer.consume().getSource() + "'. Expected a comma between the parameters."); } }
private void parseExtend(Section result) { // Parse @extend instructions like "@extend .warning" tokenizer.consumeExpectedKeyword(KEYWORD_EXTEND); if (tokenizer.current().isIdentifier() || tokenizer.current().isSpecialIdentifier("#")) { result.addExtends(tokenizer.consume().getSource()); } else { tokenizer.addError(tokenizer.current(), "Unexpected token: '" + tokenizer.current().getSource() + "'. Expected a selector to include."); } if (tokenizer.current().isSymbol(";") || !tokenizer.next().isSymbol("}")) { tokenizer.consumeExpectedSymbol(";"); } }
private void parseImport() { tokenizer.consumeExpectedKeyword(KEYWORD_IMPORT); if (!tokenizer.current().isString()) { tokenizer.addError(tokenizer.current(), "Unexpected token: '" + tokenizer.current().getSource() + "'. Expected a string constant naming an import file."); } else { result.addImport(tokenizer.consume().getContents()); } tokenizer.consumeExpectedSymbol(";"); } }
private void parseMediaQueryFilters(Section result) { // Handle filters like (orientation: landscape) tokenizer.consumeExpectedSymbol("("); if (tokenizer.current().isIdentifier() && tokenizer.next().isSymbol(":")) { parseMediaQueryFilter(result); while (tokenizer.next().hasContent("and")) { tokenizer.consumeExpectedSymbol(")"); tokenizer.consume(); tokenizer.consumeExpectedSymbol("("); parseMediaQueryFilter(result); } } else { tokenizer.addError(tokenizer.current(), "Unexpected symbol: '%s'. Expected an attribute filter.", tokenizer.current().getSource()); } tokenizer.consumeExpectedSymbol(")"); }