Сгибайте токены до обращения к грамматике, поэтому контекст не влияет на токенизацию. (Точнее, парсер получает поток токенов, созданных лексером. Два процесса чередуются на практике, но они сохраняютсянезависимый.)
Вы можете встроить контекст в свой лексер, но это становится ужасно быстро.(Тем не менее, это общая стратегия.)
Лучше всего написать свои лексические правила для получения максимально детализированного результата, а затем написать грамматику для принятия всех альтернатив:
def p_name(p):
'''
expression : ':' Name
expression : ':' Number
'''
print("name: " + str(list(p)))
def p_number(p):
'''
expression : '=' Number
'''
print("number: " + str(list(p)))
Это предполагает, что вы меняете свои лексические правила, чтобы поставить самый конкретный шаблон первым.