Формы Бэкуса-Наура.

Формы Бэкуса-Наура.

Задача 1

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

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

3
23*4
1+
1+23*4*7+6-7+8*9

Решение:

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

Задача 2

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

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

-3
-1+-23*5/7-4
-5+-2+8

Решение:

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

Задача 3

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

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

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

-3
-1+-23*5/7-4
-5+-2+8

Решение:

<Cifra> ::= [0-9]
<CeloeChislo> ::= "0" | ([1-9] <Cifra>*)
<unarVirag> ::= "-" ([1-9] <Cifra>*)
<Mnogitel> ::= <CeloeChislo> | <unarVirag> 
<Slogaemoe> ::= <Mnogitel> (("*" | "/")  <Mnogitel>)*
<Virazhenie> ::= <Slogaemoe> (("+" | "-") <Slogaemoe>)*
vedro-compota's picture

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

сделать более обобщенным, проверить для конкретного числа

_____________
матфак вгу и остальная классика =)

<Cifra> ::= [0-9]
<CeloeChislo> ::= "0" | ([1-9] <Cifra>*)
<Virazhenie> ::= <CeloeChislo> (("+" | "-" | "*") <CeloeChislo>)*
vedro-compota's picture

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

лучше описать в более общем виде

_____________
матфак вгу и остальная классика =)

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