ФБН задача 3

ФБН задача 3:

Выражения с умножением, делением, суммой и разностью можно также описать с помощью формы:

<Cifra> ::= [0-9]
<CeloeChislo> ::= "0" | ([1-9] <Cifra>*)
<Mnogitel> ::= <CeloeChislo> 
<Slogaemoe> ::= <Mnogitel> (("*" | "/")  <Mnogitel>)*
<Virazhenie> ::= <Slogaemoe> (("+" | "-") <Slogaemoe>)*

Примечание: форма "множителя" вынесена отдельно не потому что без этого не получится (выше есть более простой пример, без отдельной подформы "множитель"), но т.к. это соответствует порядку разбора подвыражений (правильно "умножение выполняется первым"), напр. в интерпретаторе pascal.js
Задача: добавьте поддержку унарного минуса, так, чтобы форма соответствовала выражениям:

-3
-1+-23-4
-5+-2+8

и при этом по-прежнему не соответствовала выражениям типа:

+3
+1++22-4
+5+2

РЕШЕНИЕ:

<Cifra> ::= [0-9]
<CeloeChislo> ::= "0" | ("-"? [1-9] <Cifra>*)
<Mnogitel> ::= <CeloeChislo>
<Slagaemoe> ::= (<Mnogitel> (("*" | "/")  <Mnogitel>)*) | <CeloeChislo>
<Virazhenie> ::= <Slagaemoe> (("+" | "-") <Slagaemoe>)*