Ни один из известных мне багов (или вообще языков программирования в целом) не заставляет вас ставить пробелы между токенами, как это. Например, такие вещи, как (display"hello")
или (format t"~d"42)
работают нормально в Scheme и Common Lisp соответственно. Так что то, что вы пытаетесь сделать, обычно не делается, и я бы порекомендовал просто не делать этого.
Тем не менее, если вы хотите применить пробелы между определенными токенами, вы можете либо продолжать делать то, что делаете, либо определить правило для недопустимых токенов, которое соответствует любой последовательности токенов, которую вы хотите запретить. , Как то так:
[0-9]+ {return NUM;}
["][^"]*["] { return STR; }
(["][^"]*["]|[0-9]+){2,} { return INVALID_TOKEN; }
Таким образом, INVALID_TOKEN
будет генерироваться всякий раз, когда несколько строк или чисел появляются рядом друг с другом без каких-либо промежуточных значений. Шаблон для этого будет становиться все более и более сложным, поскольку вы добавляете больше типов токенов, которые вы не хотите использовать рядом друг с другом (например, идентификаторы).
PS: Очень необычно разрешать использование букв в строках, поэтому в приведенном выше примере я изменил регулярное выражение для строковых литералов. Вы, вероятно, захотите настроить его дальше, чтобы разрешить экранированные двойные кавычки внутри строки.