ФБН задача 4

ФБН задача 4:

Выше мы рассмотрели пример, где выражение вида (только суммы):

2 + 5 + 4 и т.д

можно описать, используя рекурсивный подход:

<Cifra> ::= [0-9]
<CeloeChislo> ::= "0" | ([1-9] <Cifra>*)
<BinSumma> ::= <Summa> "+" <CeloeChislo> 
<Summa> ::=  <BinSumma> | <CeloeChislo>

Задача: Напишите ФБН для поддержки (помимо операции сложения) операций вычитания, умножения и деления:

2+3*5+7/2-3

-- описывая умножение/деление рекурсивно через бинарное умножение/деление (по аналогии с тем, как это выше сделано для суммы через бинарную сумму).

РЕШЕНИЕ:

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

В последней строке

<Virazhenie> ::= <UmnozhenieDelenie> | <UmnozhenieDelenie> (( "+" | "-") <UmnozhenieDelenie>)*

отдельно <UmnozhenieDelenie> можно не указывать:

<Virazhenie> ::=  <UmnozhenieDelenie> (( "+" | "-") <UmnozhenieDelenie>)*

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