Расширенные формы Бэкуса-Наура

Расширенные формы Бэкуса-Наура

Задача №1
Для описания выражений вида: суммы и разности целых чисел, количеством чисел от одного и более можно использовать форму Бэкуса-Наура:

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

Задача: Модифицируйте это выражение таким образом, чтобы была возможна поддержка операции умножения, т.е. чтобы форма соответствовала выражениям:

<Cifra> ::= [0-9]
<CeloeChislo> ::= "0" | ([1-9] <Cifra>*)
<Virazhenie> ::= <CeloeChislo> | <Virazhenie> ("+" | "-" | "*") <Virazhenie>
Задача №2
<Cifra> ::= [0-9]
<CeloeChislo> ::= "0" | ([1-9] <Cifra>*)
<Virazhenie> ::= <CeloeChislo> (("+" | "-") <CeloeChislo>)*

Задача: Модифицируйте это выражение таким образом, чтобы была возможна поддержка, т.н. "Унарного минуса" (т.е. минуса который может быть перед числом, даже если оно одно или если уже есть знак другой операции после предыдущего числа).

<Cifra> ::= [0-9]
<CeloeChislo> ::= "0" | ([1-9] <Cifra>*)
<Slogaemoe> ::=  "-"? <CeloeChislo>
<Virazhenie> ::= <Slogaemoe> (("+" | "-") <Slogaemoe>)*
Задача №3
Выражения с умножением, делением, суммой и разностью можно также описать с помощью формы:
<Cifra> ::= [0-9]
<CeloeChislo> ::= "0" | ([1-9] <Cifra>*)
<Mnogitel> ::= <CeloeChislo> 
<Slogaemoe> ::= <Mnogitel> (("*" | "/")  <Mnogitel>)*
<Virazhenie> ::= <Slogaemoe> (("+" | "-") <Slogaemoe>)*

Задача: добавьте поддержку унарного минуса

<Cifra> ::= [0-9]
<CeloeChislo> ::= "0" | ([1-9] <Cifra>*)
<Mnogitel> ::= "-"? <CeloeChislo> 
<Slogaemoe> ::= <Mnogitel> (("*" | "/")  <Mnogitel>)*
<Virazhenie> ::= <Slogaemoe> (("+" | "-") <Slogaemoe>)*
Задача №4
Выше мы рассмотрели пример, где выражение только суммы можно описать, используя рекурсивный подход:
<Cifra> ::= [0-9]
<CeloeChislo> ::= "0" | ([1-9] <Cifra>*)
<BinSumma> ::= <Summa> "+" <CeloeChislo> 
<Summa> ::=  <BinSumma> | <CeloeChislo>

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

<Cifra> ::= [0-9]
<CeloeChislo> ::= "0" | ([1-9] <Cifra>*)
<BinMult> ::= <Mult> ("*" | "/") <CeloeChislo>
<Mult> ::= <BinMult> | <CeloeChislo>
<BinSumma> ::= <Summa> ("+" | "-") <Mult> 
<Summa> ::=  <BinSumma> | <Mult>
Задача №5
Напишите ФБН для описания выражений с произвольным вложением скобок (для упрощения выражения не расписывайте суммы и произведения через их бинарные случаи).
<Cifra> ::= [0-9]
<CeloeChislo> ::= "0" | ([1-9] <Cifra>*)
<Mnogitel> ::= <CeloeChislo> | "(" <Virazhenie> ")"
<Slogaemoe> ::= <Mnogitel> (("*" | "/")  <Mnogitel>)*
<Virazhenie> ::= <Slogaemoe> (("+" | "-") <Slogaemoe>)*