С практической точки зрения трудно сделать лексический элемент "-", потому что вы также должны распознавать его при его другом использовании в качестве стандартного оператора с двумя операндами "вычитать".
Если вы производите «-» как отдельную лексему, анализатор может легко решить, является ли он оператором вычитания или оператором отрицания из-за предоставленных вами правил грамматики.
Лексер не может принять это решение, так как у него нет доступа к состоянию анализатора. Так как же он может разумно определить, должен ли символ "-", с которым он только что столкнулся, вызывать генерацию токена "-" или использоваться следующим числовым литералом? Если он используется следующим числовым литералом, то у вашего синтаксического анализатора возникнут проблемы с выражением:
x - -2
То, что вы, вероятно, хотите, чтобы грамматические правила обрабатывали оба типа знаков минус:
expression = sum ;
sum = term ;
sum = sum '+' term ;
sum = sum '-' term ;
term = primary ;
term = term '*' primary ;
term = term '/' primary
primary = '-' primary ;
primary = '(' expression ')' ;
primary = number ;
primary = identifier ;
(я позволю вам преобразовать их в любую удобную для вас форму).