Обычно лексеры добавляют символы в текущий токен до тех пор, пока не найдут символ, который не может принадлежать текущему токену, а затем закроются и начнут все с того места, где раньше не могли.
Итак, здесь происходит то, что лексер сглатывает SELECT
и видит, что следующим символом является *
, который, поскольку он собирает слово, не может принадлежать SELECT
. Таким образом, он останавливается, анализирует SELECT
, который оказывается ключевым словом, и начинается заново с *
, который он распознает, и так далее. По той же причине вы получаете 4
от 2*2
и 2 * 2
на других языках программирования.
Что касается того, будет ли он работать в других базах данных, все зависит от деталей лексического анализатора и правил грамматики.