ФБН задачи 4, 5.

ФБН задачи 4, 5.

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

2 + 5 + 4 и т.д

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

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

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

2+3*5+7/2-3

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

Решение

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

Задача 5

Напишите ФБН для описания выражений вида:

((2+3)*5)/2 + 7*4

-- с произвольным вложением скобок (для упрощения выражения не расписывайте суммы и произведения через их бинарные случаи).

Решение

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