Не работает с ruby, но работает с дизайном компилятора и языка программирования.
Оба подхода работают, но в реальной жизни проще использовать общие идентификаторы для переменных, параметров и зарезервированных слов ("тупой лексер" или "тупой сканер").
Позже вы можете "преобразовать" эти общие идентификаторы в другие токены.Иногда в вашем парсере.
Иногда лексеры / сканеры имеют секцию кода, , а не парсер , которая позволяет выполнять несколько "семантических" операций, приводя к преобразованию универсального идентификатора в ключевое слово,переменная, идентификатор типа, что угодно.Ваши правила лексера обнаруживают токен общего идентификатора, но возвращают другой токен синтаксическому анализатору.
Другой аналогичный, общий случай, когда у вас есть выражение или язык, которые используют «+» и «-» для двоичного оператораи для унарного знака оператора.