private void parseAttribute() throws IOException { int token; if (pushbackToken == -1) { token = yylex(); } else { token = pushbackToken; pushbackToken = -1; } // Token WORD - start of an attribute String attributeName = text(); skipWhiteSpace(); if (pushbackToken == -1) { token = yylex(); } else { token = pushbackToken; pushbackToken = -1; } if (token == Parser.EQUALS) { // Token "=" - the attribute has a value skipWhiteSpace(); if (pushbackToken == -1) { token = yylex(); } else { token = pushbackToken; pushbackToken = -1; } if (token == Parser.QUOTED) { // token QUOTED - a quoted literal as the attribute value parsedAttribute(attributeName, text(), true); } else if (token == Parser.WORD || token == Parser.SLASH) { // unquoted word attributeBuffer.clear(); attributeBuffer.append(text()); while (true) { int next; if (pushbackToken == -1) { next = yylex(); } else { next = pushbackToken; pushbackToken = -1; } if (next == Parser.WORD || next == Parser.EQUALS || next == Parser.SLASH) { attributeBuffer.append(text()); } else { pushBack(next); break; } } parsedAttribute(attributeName, attributeBuffer.toString(), false); } else if (token == Parser.SLASH || token == Parser.GT) { // no more attributes pushBack(token); } else if (token == 0) { return; } else { reportError("Illegal attribute value", line(), column()); } } else if (token == Parser.SLASH || token == Parser.GT || token == Parser.WORD) { // it was a value-less HTML style attribute parsedAttribute(attributeName, null, false); pushBack(token); } else if (token == 0) { return; } else { reportError("Illegal attribute name", line(), column()); } }