public Scanner()
{
Patterns = new Dictionary<TokenType, Regex>();
_tokens = new List<TokenType>();
_lookAheadToken = null;
Skipped = new List<Token>();
_skipList = new List<TokenType> { TokenType.WHITESPACE };
var regex = new Regex(@"\?", RegexOptions.Compiled);
Patterns.Add(TokenType.QUESTION, regex);
_tokens.Add(TokenType.QUESTION);
regex = new Regex(":", RegexOptions.Compiled);
Patterns.Add(TokenType.COLON, regex);
_tokens.Add(TokenType.COLON);
regex = new Regex("[a-z]+", RegexOptions.Compiled);
Patterns.Add(TokenType.ANY, regex);
_tokens.Add(TokenType.ANY);
regex = new Regex(@"\|\||or", RegexOptions.Compiled);
Patterns.Add(TokenType.OR, regex);
_tokens.Add(TokenType.OR);
regex = new Regex(@"&&|and", RegexOptions.Compiled);
Patterns.Add(TokenType.AND, regex);
_tokens.Add(TokenType.AND);
regex = new Regex(@"<|<=|>|>=|==|!=", RegexOptions.Compiled);
Patterns.Add(TokenType.COMPARISON, regex);
_tokens.Add(TokenType.COMPARISON);
regex = new Regex("[-+&]", RegexOptions.Compiled);
Patterns.Add(TokenType.ADDITIVE, regex);
_tokens.Add(TokenType.ADDITIVE);
regex = new Regex(@"[*/%]|mod|div", RegexOptions.Compiled);
Patterns.Add(TokenType.MULTIPLICATIVE, regex);
_tokens.Add(TokenType.MULTIPLICATIVE);
regex = new Regex("-|!|not", RegexOptions.Compiled);
Patterns.Add(TokenType.UNARY, regex);
_tokens.Add(TokenType.UNARY);
regex = new Regex(@"\.", RegexOptions.Compiled);
Patterns.Add(TokenType.DOT, regex);
_tokens.Add(TokenType.DOT);
regex = new Regex("[a-zA-Z_][a-zA-Z_0-9]*", RegexOptions.Compiled);
Patterns.Add(TokenType.IDENTIFIER, regex);
_tokens.Add(TokenType.IDENTIFIER);
regex = new Regex("[a-zA-Z_][a-zA-Z_0-9]*:", RegexOptions.Compiled);
Patterns.Add(TokenType.SEMICOLONNAME, regex);
_tokens.Add(TokenType.SEMICOLONNAME);
regex = new Regex("as ([a-zA-Z_][a-zA-Z_0-9]*)", RegexOptions.Compiled);
Patterns.Add(TokenType.ASNAME, regex);
_tokens.Add(TokenType.ASNAME);
regex = new Regex(@"([""'])[^""\\\r\n]*(?:\\.[^""\\\r\n]*)*\1", RegexOptions.Compiled);
Patterns.Add(TokenType.STRING, regex);
_tokens.Add(TokenType.STRING);
regex = new Regex(@"[0-9]+", RegexOptions.Compiled);
Patterns.Add(TokenType.INTEGER, regex);
_tokens.Add(TokenType.INTEGER);
regex = new Regex(@"[0-9]*\.[0-9]+", RegexOptions.Compiled);
Patterns.Add(TokenType.REAL, regex);
_tokens.Add(TokenType.REAL);
regex = new Regex(@"\(", RegexOptions.Compiled);
Patterns.Add(TokenType.OPENPAREN, regex);
_tokens.Add(TokenType.OPENPAREN);
regex = new Regex(@"\)", RegexOptions.Compiled);
Patterns.Add(TokenType.CLOSEPAREN, regex);
_tokens.Add(TokenType.CLOSEPAREN);
regex = new Regex(@"\{", RegexOptions.Compiled);
Patterns.Add(TokenType.OPENCURLY, regex);
_tokens.Add(TokenType.OPENCURLY);
regex = new Regex(@"}", RegexOptions.Compiled);
Patterns.Add(TokenType.CLOSECURLY, regex);
_tokens.Add(TokenType.CLOSECURLY);
regex = new Regex("in", RegexOptions.Compiled);
Patterns.Add(TokenType.IN, regex);
_tokens.Add(TokenType.IN);
regex = new Regex(",", RegexOptions.Compiled);
Patterns.Add(TokenType.COMMA, regex);
_tokens.Add(TokenType.COMMA);
regex = new Regex(@"\[", RegexOptions.Compiled);
Patterns.Add(TokenType.OPENSQUARE, regex);
_tokens.Add(TokenType.OPENSQUARE);
regex = new Regex(@"]", RegexOptions.Compiled);
Patterns.Add(TokenType.CLOSESQUARE, regex);
_tokens.Add(TokenType.CLOSESQUARE);
regex = new Regex("new", RegexOptions.Compiled);
Patterns.Add(TokenType.NEW, regex);
_tokens.Add(TokenType.NEW);
regex = new Regex(@"^$", RegexOptions.Compiled);
Patterns.Add(TokenType.EOF, regex);
_tokens.Add(TokenType.EOF);
regex = new Regex(@"\s+", RegexOptions.Compiled);
Patterns.Add(TokenType.WHITESPACE, regex);
_tokens.Add(TokenType.WHITESPACE);
}