#include "FractoriumPch.h"
#include "qcssscanner.h"

/// <summary>
/// The code in this file did not originate in Fractorium.
/// It was taken either in whole or in part from the source code
/// of Qt Creator. Their license applies.
/// </summary>

namespace QCss
{
QCssScanner::QCssScanner(const QString &inp)
{
	input = inp;
	pos = 0;
	lexemStart = 0;
	lexemLength = 0;
}

int QCssScanner::handleCommentStart()
{
	while (pos < input.size() - 1) {
		if (input.at(pos) == QLatin1Char('*')
			&& input.at(pos + 1) == QLatin1Char('/')) {
			pos += 2;
			break;
		}
		++pos;
	}
	return QCss::TokenType::S;
}

int QCssScanner::lex()
{
	lexemStart = pos;
	lexemLength = 0;
	int lastAcceptingPos = -1;
	int token = -1;
	QChar ch;

	// initial state
	ch = next();
	if (ch.unicode() >= 9 && ch.unicode() <= 10)
		goto state_1;
	if (ch.unicode() >= 12 && ch.unicode() <= 13)
		goto state_1;
	if (ch.unicode() == 32)
		goto state_1;
	if (ch.unicode() == 33) {
		token = QCss::EXCLAMATION_SYM;
		goto found;
	}
	if (ch.unicode() == 34)
		goto state_3;
	if (ch.unicode() == 35)
		goto state_4;
	if (ch.unicode() == 39)
		goto state_5;
	if (ch.unicode() == 40) {
		token = QCss::LPAREN;
		goto found;
	}
	if (ch.unicode() == 41) {
		token = QCss::RPAREN;
		goto found;
	}
	if (ch.unicode() == 42) {
		token = QCss::STAR;
		goto found;
	}
	if (ch.unicode() == 43)
		goto state_9;
	if (ch.unicode() == 44)
		goto state_10;
	if (ch.unicode() == 45)
		goto state_11;
	if (ch.unicode() == 46)
		goto state_12;
	if (ch.unicode() == 47)
		goto state_13;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_14;
	if (ch.unicode() == 58) {
		token = QCss::COLON;
		goto found;
	}
	if (ch.unicode() == 59) {
		token = QCss::SEMICOLON;
		goto found;
	}
	if (ch.unicode() == 60)
		goto state_17;
	if (ch.unicode() == 61) {
		token = QCss::EQUAL;
		goto found;
	}
	if (ch.unicode() == 62)
		goto state_19;
	if (ch.unicode() == 64)
		goto state_20;
	if (ch.unicode() == 91) {
		token = QCss::LBRACKET;
		goto found;
	}
	if (ch.unicode() == 92)
		goto state_22;
	if (ch.unicode() == 93) {
		token = QCss::RBRACKET;
		goto found;
	}
	if (ch.unicode() == 95)
		goto state_24;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_24;
	if (ch.unicode() == 123)
		goto state_25;
	if (ch.unicode() == 124)
		goto state_26;
	if (ch.unicode() == 125) {
		token = QCss::RBRACE;
		goto found;
	}
	if (ch.unicode() == 126)
		goto state_28;
	goto out;
state_1:
	lastAcceptingPos = pos;
	token = QCss::S;
	ch = next();
	if (ch.unicode() >= 9 && ch.unicode() <= 10)
		goto state_29;
	if (ch.unicode() >= 12 && ch.unicode() <= 13)
		goto state_29;
	if (ch.unicode() == 32)
		goto state_29;
	if (ch.unicode() == 43)
		goto state_9;
	if (ch.unicode() == 44)
		goto state_10;
	if (ch.unicode() == 62)
		goto state_19;
	if (ch.unicode() == 123)
		goto state_25;
	goto out;
state_3:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_30;
	if (ch.unicode() == 11)
		goto state_30;
	if (ch.unicode() >= 14 && ch.unicode() <= 33)
		goto state_30;
	if (ch.unicode() == 34)
		goto state_31;
	if (ch.unicode() >= 35 && ch.unicode() <= 91)
		goto state_30;
	if (ch.unicode() == 92)
		goto state_32;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_30;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_30;
	if (ch.unicode() >= 123)
		goto state_30;
	goto out;
state_4:
	ch = next();
	if (ch.unicode() == 45)
		goto state_33;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_33;
	if (ch.unicode() == 92)
		goto state_34;
	if (ch.unicode() == 95)
		goto state_33;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_33;
	goto out;
state_5:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_35;
	if (ch.unicode() == 11)
		goto state_35;
	if (ch.unicode() >= 14 && ch.unicode() <= 38)
		goto state_35;
	if (ch.unicode() == 39)
		goto state_36;
	if (ch.unicode() >= 40 && ch.unicode() <= 91)
		goto state_35;
	if (ch.unicode() == 92)
		goto state_37;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_35;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_35;
	if (ch.unicode() >= 123)
		goto state_35;
	goto out;
state_9:
	lastAcceptingPos = pos;
	token = QCss::PLUS;
	goto out;
state_10:
	lastAcceptingPos = pos;
	token = QCss::COMMA;
	goto out;
state_11:
	lastAcceptingPos = pos;
	token = QCss::MINUS;
	ch = next();
	if (ch.unicode() == 45)
		goto state_38;
	if (ch.unicode() == 92)
		goto state_22;
	if (ch.unicode() == 95)
		goto state_24;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_24;
	goto out;
state_12:
	lastAcceptingPos = pos;
	token = QCss::DOT;
	ch = next();
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_39;
	goto out;
state_13:
	lastAcceptingPos = pos;
	token = QCss::SLASH;
	ch = next();
	if (ch.unicode() == 42) {
		token = handleCommentStart();
		goto found;
	}
	goto out;
state_14:
	lastAcceptingPos = pos;
	token = QCss::NUMBER;
	ch = next();
	if (ch.unicode() == 37)
		goto state_41;
	if (ch.unicode() == 45)
		goto state_42;
	if (ch.unicode() == 46)
		goto state_43;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_44;
	if (ch.unicode() == 92)
		goto state_45;
	if (ch.unicode() == 95)
		goto state_46;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_46;
	goto out;
state_17:
	ch = next();
	if (ch.unicode() == 33)
		goto state_47;
	goto out;
state_19:
	lastAcceptingPos = pos;
	token = QCss::GREATER;
	goto out;
state_20:
	ch = next();
	if (ch.unicode() == 45)
		goto state_48;
	if (ch.unicode() == 92)
		goto state_49;
	if (ch.unicode() == 95)
		goto state_50;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_50;
	goto out;
state_22:
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_51;
	if (ch.unicode() == 11)
		goto state_51;
	if (ch.unicode() >= 14 && ch.unicode() <= 47)
		goto state_51;
	if (ch.unicode() >= 58 && ch.unicode() <= 96)
		goto state_51;
	if (ch.unicode() >= 103)
		goto state_51;
	goto out;
state_24:
	lastAcceptingPos = pos;
	token = QCss::IDENT;
	ch = next();
	if (ch.unicode() == 40)
		goto state_52;
	if (ch.unicode() == 45)
		goto state_53;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_53;
	if (ch.unicode() == 92)
		goto state_54;
	if (ch.unicode() == 95)
		goto state_53;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_53;
	goto out;
state_25:
	lastAcceptingPos = pos;
	token = QCss::LBRACE;
	goto out;
state_26:
	lastAcceptingPos = pos;
	token = QCss::OR;
	ch = next();
	if (ch.unicode() == 61) {
		token = QCss::DASHMATCH;
		goto found;
	}
	goto out;
state_28:
	ch = next();
	if (ch.unicode() == 61) {
		token = QCss::INCLUDES;
		goto found;
	}
	goto out;
state_29:
	lastAcceptingPos = pos;
	token = QCss::S;
	ch = next();
	if (ch.unicode() >= 9 && ch.unicode() <= 10)
		goto state_29;
	if (ch.unicode() >= 12 && ch.unicode() <= 13)
		goto state_29;
	if (ch.unicode() == 32)
		goto state_29;
	if (ch.unicode() == 43)
		goto state_9;
	if (ch.unicode() == 44)
		goto state_10;
	if (ch.unicode() == 62)
		goto state_19;
	if (ch.unicode() == 123)
		goto state_25;
	goto out;
state_30:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_30;
	if (ch.unicode() == 11)
		goto state_30;
	if (ch.unicode() >= 14 && ch.unicode() <= 33)
		goto state_30;
	if (ch.unicode() == 34)
		goto state_31;
	if (ch.unicode() >= 35 && ch.unicode() <= 91)
		goto state_30;
	if (ch.unicode() == 92)
		goto state_32;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_30;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_30;
	if (ch.unicode() >= 123)
		goto state_30;
	goto out;
state_31:
	lastAcceptingPos = pos;
	token = QCss::STRING;
	goto out;
state_32:
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_57;
	if (ch.unicode() == 10)
		goto state_58;
	if (ch.unicode() == 11)
		goto state_57;
	if (ch.unicode() == 12)
		goto state_59;
	if (ch.unicode() == 13)
		goto state_60;
	if (ch.unicode() >= 14 && ch.unicode() <= 47)
		goto state_57;
	if (ch.unicode() >= 58 && ch.unicode() <= 96)
		goto state_57;
	if (ch.unicode() >= 103)
		goto state_57;
	goto out;
state_33:
	lastAcceptingPos = pos;
	token = QCss::HASH;
	ch = next();
	if (ch.unicode() == 45)
		goto state_61;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_61;
	if (ch.unicode() == 92)
		goto state_62;
	if (ch.unicode() == 95)
		goto state_61;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_61;
	goto out;
state_34:
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_63;
	if (ch.unicode() == 11)
		goto state_63;
	if (ch.unicode() >= 14 && ch.unicode() <= 47)
		goto state_63;
	if (ch.unicode() >= 58 && ch.unicode() <= 96)
		goto state_63;
	if (ch.unicode() >= 103)
		goto state_63;
	goto out;
state_35:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_35;
	if (ch.unicode() == 11)
		goto state_35;
	if (ch.unicode() >= 14 && ch.unicode() <= 38)
		goto state_35;
	if (ch.unicode() == 39)
		goto state_36;
	if (ch.unicode() >= 40 && ch.unicode() <= 91)
		goto state_35;
	if (ch.unicode() == 92)
		goto state_37;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_35;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_35;
	if (ch.unicode() >= 123)
		goto state_35;
	goto out;
state_36:
	lastAcceptingPos = pos;
	token = QCss::STRING;
	goto out;
state_37:
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_64;
	if (ch.unicode() == 10)
		goto state_65;
	if (ch.unicode() == 11)
		goto state_64;
	if (ch.unicode() == 12)
		goto state_66;
	if (ch.unicode() == 13)
		goto state_67;
	if (ch.unicode() >= 14 && ch.unicode() <= 47)
		goto state_64;
	if (ch.unicode() >= 58 && ch.unicode() <= 96)
		goto state_64;
	if (ch.unicode() >= 103)
		goto state_64;
	goto out;
state_38:
	ch = next();
	if (ch.unicode() == 62) {
		token = QCss::CDC;
		goto found;
	}
	goto out;
state_39:
	lastAcceptingPos = pos;
	token = QCss::NUMBER;
	ch = next();
	if (ch.unicode() == 37)
		goto state_41;
	if (ch.unicode() == 45)
		goto state_42;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_69;
	if (ch.unicode() == 92)
		goto state_45;
	if (ch.unicode() == 95)
		goto state_46;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_46;
	goto out;
state_41:
	lastAcceptingPos = pos;
	token = QCss::PERCENTAGE;
	goto out;
state_42:
	ch = next();
	if (ch.unicode() == 92)
		goto state_45;
	if (ch.unicode() == 95)
		goto state_46;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_46;
	goto out;
state_43:
	ch = next();
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_39;
	goto out;
state_44:
	lastAcceptingPos = pos;
	token = QCss::NUMBER;
	ch = next();
	if (ch.unicode() == 37)
		goto state_41;
	if (ch.unicode() == 45)
		goto state_42;
	if (ch.unicode() == 46)
		goto state_43;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_44;
	if (ch.unicode() == 92)
		goto state_45;
	if (ch.unicode() == 95)
		goto state_46;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_46;
	goto out;
state_45:
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_70;
	if (ch.unicode() == 11)
		goto state_70;
	if (ch.unicode() >= 14 && ch.unicode() <= 47)
		goto state_70;
	if (ch.unicode() >= 58 && ch.unicode() <= 96)
		goto state_70;
	if (ch.unicode() >= 103)
		goto state_70;
	goto out;
state_46:
	lastAcceptingPos = pos;
	token = QCss::LENGTH;
	ch = next();
	if (ch.unicode() == 45)
		goto state_71;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_71;
	if (ch.unicode() == 92)
		goto state_72;
	if (ch.unicode() == 95)
		goto state_71;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_71;
	goto out;
state_47:
	ch = next();
	if (ch.unicode() == 45)
		goto state_73;
	goto out;
state_48:
	ch = next();
	if (ch.unicode() == 92)
		goto state_49;
	if (ch.unicode() == 95)
		goto state_50;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_50;
	goto out;
state_49:
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_74;
	if (ch.unicode() == 11)
		goto state_74;
	if (ch.unicode() >= 14 && ch.unicode() <= 47)
		goto state_74;
	if (ch.unicode() >= 58 && ch.unicode() <= 96)
		goto state_74;
	if (ch.unicode() >= 103)
		goto state_74;
	goto out;
state_50:
	lastAcceptingPos = pos;
	token = QCss::ATKEYWORD_SYM;
	ch = next();
	if (ch.unicode() == 45)
		goto state_75;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_75;
	if (ch.unicode() == 92)
		goto state_76;
	if (ch.unicode() == 95)
		goto state_75;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_75;
	goto out;
state_51:
	lastAcceptingPos = pos;
	token = QCss::IDENT;
	ch = next();
	if (ch.unicode() == 40)
		goto state_52;
	if (ch.unicode() == 45)
		goto state_53;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_53;
	if (ch.unicode() == 92)
		goto state_54;
	if (ch.unicode() == 95)
		goto state_53;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_53;
	goto out;
state_52:
	lastAcceptingPos = pos;
	token = QCss::FUNCTION;
	goto out;
state_53:
	lastAcceptingPos = pos;
	token = QCss::IDENT;
	ch = next();
	if (ch.unicode() == 40)
		goto state_52;
	if (ch.unicode() == 45)
		goto state_53;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_53;
	if (ch.unicode() == 92)
		goto state_54;
	if (ch.unicode() == 95)
		goto state_53;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_53;
	goto out;
state_54:
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_77;
	if (ch.unicode() == 11)
		goto state_77;
	if (ch.unicode() >= 14 && ch.unicode() <= 47)
		goto state_77;
	if (ch.unicode() >= 58 && ch.unicode() <= 96)
		goto state_77;
	if (ch.unicode() >= 103)
		goto state_77;
	goto out;
state_57:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_30;
	if (ch.unicode() == 11)
		goto state_30;
	if (ch.unicode() >= 14 && ch.unicode() <= 33)
		goto state_30;
	if (ch.unicode() == 34)
		goto state_31;
	if (ch.unicode() >= 35 && ch.unicode() <= 91)
		goto state_30;
	if (ch.unicode() == 92)
		goto state_32;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_30;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_30;
	if (ch.unicode() >= 123)
		goto state_30;
	goto out;
state_58:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_30;
	if (ch.unicode() == 11)
		goto state_30;
	if (ch.unicode() >= 14 && ch.unicode() <= 33)
		goto state_30;
	if (ch.unicode() == 34)
		goto state_31;
	if (ch.unicode() >= 35 && ch.unicode() <= 91)
		goto state_30;
	if (ch.unicode() == 92)
		goto state_32;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_30;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_30;
	if (ch.unicode() >= 123)
		goto state_30;
	goto out;
state_59:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_30;
	if (ch.unicode() == 11)
		goto state_30;
	if (ch.unicode() >= 14 && ch.unicode() <= 33)
		goto state_30;
	if (ch.unicode() == 34)
		goto state_31;
	if (ch.unicode() >= 35 && ch.unicode() <= 91)
		goto state_30;
	if (ch.unicode() == 92)
		goto state_32;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_30;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_30;
	if (ch.unicode() >= 123)
		goto state_30;
	goto out;
state_60:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_30;
	if (ch.unicode() == 10)
		goto state_78;
	if (ch.unicode() == 11)
		goto state_30;
	if (ch.unicode() >= 14 && ch.unicode() <= 33)
		goto state_30;
	if (ch.unicode() == 34)
		goto state_31;
	if (ch.unicode() >= 35 && ch.unicode() <= 91)
		goto state_30;
	if (ch.unicode() == 92)
		goto state_32;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_30;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_30;
	if (ch.unicode() >= 123)
		goto state_30;
	goto out;
state_61:
	lastAcceptingPos = pos;
	token = QCss::HASH;
	ch = next();
	if (ch.unicode() == 45)
		goto state_61;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_61;
	if (ch.unicode() == 92)
		goto state_62;
	if (ch.unicode() == 95)
		goto state_61;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_61;
	goto out;
state_62:
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_79;
	if (ch.unicode() == 11)
		goto state_79;
	if (ch.unicode() >= 14 && ch.unicode() <= 47)
		goto state_79;
	if (ch.unicode() >= 58 && ch.unicode() <= 96)
		goto state_79;
	if (ch.unicode() >= 103)
		goto state_79;
	goto out;
state_63:
	lastAcceptingPos = pos;
	token = QCss::HASH;
	ch = next();
	if (ch.unicode() == 45)
		goto state_61;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_61;
	if (ch.unicode() == 92)
		goto state_62;
	if (ch.unicode() == 95)
		goto state_61;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_61;
	goto out;
state_64:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_35;
	if (ch.unicode() == 11)
		goto state_35;
	if (ch.unicode() >= 14 && ch.unicode() <= 38)
		goto state_35;
	if (ch.unicode() == 39)
		goto state_36;
	if (ch.unicode() >= 40 && ch.unicode() <= 91)
		goto state_35;
	if (ch.unicode() == 92)
		goto state_37;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_35;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_35;
	if (ch.unicode() >= 123)
		goto state_35;
	goto out;
state_65:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_35;
	if (ch.unicode() == 11)
		goto state_35;
	if (ch.unicode() >= 14 && ch.unicode() <= 38)
		goto state_35;
	if (ch.unicode() == 39)
		goto state_36;
	if (ch.unicode() >= 40 && ch.unicode() <= 91)
		goto state_35;
	if (ch.unicode() == 92)
		goto state_37;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_35;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_35;
	if (ch.unicode() >= 123)
		goto state_35;
	goto out;
state_66:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_35;
	if (ch.unicode() == 11)
		goto state_35;
	if (ch.unicode() >= 14 && ch.unicode() <= 38)
		goto state_35;
	if (ch.unicode() == 39)
		goto state_36;
	if (ch.unicode() >= 40 && ch.unicode() <= 91)
		goto state_35;
	if (ch.unicode() == 92)
		goto state_37;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_35;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_35;
	if (ch.unicode() >= 123)
		goto state_35;
	goto out;
state_67:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_35;
	if (ch.unicode() == 10)
		goto state_80;
	if (ch.unicode() == 11)
		goto state_35;
	if (ch.unicode() >= 14 && ch.unicode() <= 38)
		goto state_35;
	if (ch.unicode() == 39)
		goto state_36;
	if (ch.unicode() >= 40 && ch.unicode() <= 91)
		goto state_35;
	if (ch.unicode() == 92)
		goto state_37;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_35;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_35;
	if (ch.unicode() >= 123)
		goto state_35;
	goto out;
state_69:
	lastAcceptingPos = pos;
	token = QCss::NUMBER;
	ch = next();
	if (ch.unicode() == 37)
		goto state_41;
	if (ch.unicode() == 45)
		goto state_42;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_69;
	if (ch.unicode() == 92)
		goto state_45;
	if (ch.unicode() == 95)
		goto state_46;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_46;
	goto out;
state_70:
	lastAcceptingPos = pos;
	token = QCss::LENGTH;
	ch = next();
	if (ch.unicode() == 45)
		goto state_71;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_71;
	if (ch.unicode() == 92)
		goto state_72;
	if (ch.unicode() == 95)
		goto state_71;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_71;
	goto out;
state_71:
	lastAcceptingPos = pos;
	token = QCss::LENGTH;
	ch = next();
	if (ch.unicode() == 45)
		goto state_71;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_71;
	if (ch.unicode() == 92)
		goto state_72;
	if (ch.unicode() == 95)
		goto state_71;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_71;
	goto out;
state_72:
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_81;
	if (ch.unicode() == 11)
		goto state_81;
	if (ch.unicode() >= 14 && ch.unicode() <= 47)
		goto state_81;
	if (ch.unicode() >= 58 && ch.unicode() <= 96)
		goto state_81;
	if (ch.unicode() >= 103)
		goto state_81;
	goto out;
state_73:
	ch = next();
	if (ch.unicode() == 45) {
		token = QCss::CDO;
		goto found;
	}
	goto out;
state_74:
	lastAcceptingPos = pos;
	token = QCss::ATKEYWORD_SYM;
	ch = next();
	if (ch.unicode() == 45)
		goto state_75;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_75;
	if (ch.unicode() == 92)
		goto state_76;
	if (ch.unicode() == 95)
		goto state_75;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_75;
	goto out;
state_75:
	lastAcceptingPos = pos;
	token = QCss::ATKEYWORD_SYM;
	ch = next();
	if (ch.unicode() == 45)
		goto state_75;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_75;
	if (ch.unicode() == 92)
		goto state_76;
	if (ch.unicode() == 95)
		goto state_75;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_75;
	goto out;
state_76:
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_83;
	if (ch.unicode() == 11)
		goto state_83;
	if (ch.unicode() >= 14 && ch.unicode() <= 47)
		goto state_83;
	if (ch.unicode() >= 58 && ch.unicode() <= 96)
		goto state_83;
	if (ch.unicode() >= 103)
		goto state_83;
	goto out;
state_77:
	lastAcceptingPos = pos;
	token = QCss::IDENT;
	ch = next();
	if (ch.unicode() == 40)
		goto state_52;
	if (ch.unicode() == 45)
		goto state_53;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_53;
	if (ch.unicode() == 92)
		goto state_54;
	if (ch.unicode() == 95)
		goto state_53;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_53;
	goto out;
state_78:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_30;
	if (ch.unicode() == 11)
		goto state_30;
	if (ch.unicode() >= 14 && ch.unicode() <= 33)
		goto state_30;
	if (ch.unicode() == 34)
		goto state_31;
	if (ch.unicode() >= 35 && ch.unicode() <= 91)
		goto state_30;
	if (ch.unicode() == 92)
		goto state_32;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_30;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_30;
	if (ch.unicode() >= 123)
		goto state_30;
	goto out;
state_79:
	lastAcceptingPos = pos;
	token = QCss::HASH;
	ch = next();
	if (ch.unicode() == 45)
		goto state_61;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_61;
	if (ch.unicode() == 92)
		goto state_62;
	if (ch.unicode() == 95)
		goto state_61;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_61;
	goto out;
state_80:
	lastAcceptingPos = pos;
	token = QCss::INVALID;
	ch = next();
	if (ch.unicode() >= 1 && ch.unicode() <= 9)
		goto state_35;
	if (ch.unicode() == 11)
		goto state_35;
	if (ch.unicode() >= 14 && ch.unicode() <= 38)
		goto state_35;
	if (ch.unicode() == 39)
		goto state_36;
	if (ch.unicode() >= 40 && ch.unicode() <= 91)
		goto state_35;
	if (ch.unicode() == 92)
		goto state_37;
	if (ch.unicode() >= 93 && ch.unicode() <= 96)
		goto state_35;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_35;
	if (ch.unicode() >= 123)
		goto state_35;
	goto out;
state_81:
	lastAcceptingPos = pos;
	token = QCss::LENGTH;
	ch = next();
	if (ch.unicode() == 45)
		goto state_71;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_71;
	if (ch.unicode() == 92)
		goto state_72;
	if (ch.unicode() == 95)
		goto state_71;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_71;
	goto out;
state_83:
	lastAcceptingPos = pos;
	token = QCss::ATKEYWORD_SYM;
	ch = next();
	if (ch.unicode() == 45)
		goto state_75;
	if (ch.unicode() >= 48 && ch.unicode() <= 57)
		goto state_75;
	if (ch.unicode() == 92)
		goto state_76;
	if (ch.unicode() == 95)
		goto state_75;
	if ((ch.unicode() >= 'a' && ch.unicode() <= 'z') || (ch.unicode() >= 'A' && ch.unicode() <= 'Z') || ch.unicode() >= 256)
		goto state_75;
	goto out;
found:
	lastAcceptingPos = pos;

out:
	if (lastAcceptingPos != -1) {
		lexemLength = lastAcceptingPos - lexemStart;
		pos = lastAcceptingPos;
	}
	return token;
}


QString Scanner::preprocess(const QString &input, bool *hasEscapeSequences)
{
	QString output = input;

	if (hasEscapeSequences)
		*hasEscapeSequences = false;

	int i = 0;
	while (i < output.size()) {
		if (output.at(i) == QLatin1Char('\\')) {

			++i;
			// test for unicode hex escape
			int hexCount = 0;
			const int hexStart = i;
			while (i < output.size()
				&& isHexDigit(output.at(i).toLatin1())
				&& hexCount < 7) {
				++hexCount;
				++i;
			}
			if (hexCount == 0) {
				if (hasEscapeSequences)
					*hasEscapeSequences = true;
				continue;
			}

			hexCount = qMin(hexCount, 6);
			bool ok = false;
			ushort code = output.mid(hexStart, hexCount).toUShort(&ok, 16);
			if (ok) {
				output.replace(hexStart - 1, hexCount + 1, QChar(code));
				i = hexStart;
			}
			else {
				i = hexStart;
			}
		}
		else {
			++i;
		}
	}
	return output;
}

void Scanner::scan(const QString &preprocessedInput, QVector<Symbol> *symbols)
{
	QCssScanner scanner(preprocessedInput);
	Symbol sym;
	int tok = scanner.lex();
	while (tok != -1) {
		sym.token = static_cast<QCss::TokenType>(tok);
		sym.text = scanner.input;
		sym.start = scanner.lexemStart;
		sym.len = scanner.lexemLength;
		symbols->append(sym);
		tok = scanner.lex();
	}
}
}