function tokenize($edn)
{
$factory = new UsingPregReplace(new LexerDataGenerator());
$delim = function ($pattern) {
return "(?:{$pattern})(?=[\\s,\\)\\]\\};]|\$)";
};
$lexer = $factory->createLexer([';(?:.*)(?:\\n)?' => 'comment', '#_[\\s,]?' => 'discard', $delim('nil|true|false') => 'literal', $delim('"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"') => 'string', '[\\s,]' => 'whitespace', $delim('\\\\(?:newline|return|space|tab|formfeed|.)') => 'character', $delim('(?:[+-])?\\d+N?') => 'int', $delim('(?:[+-])?\\d+(\\.\\d+)?(?:[eE][-+]?\\d+)?M?') => 'float', $delim(get_symbol_regex()) => 'symbol', $delim(':(?:' . get_symbol_regex() . ')') => 'keyword', $delim('#(?:' . get_symbol_regex() . ')') => 'tag', '\\(' => 'list_start', '\\)' => 'list_end', '\\[' => 'vector_start', '\\]' => 'vector_end', '#\\{' => 'set_start', '\\{' => 'map_start', '\\}' => 'map_set_end']);
$tokens = $lexer->lex($edn);
return $tokens;
}