Тема: Регулярні вирази. БНФ

Доброго дня. Вчуся на другому курсі, вивчаємо зараз ООП на прикладі C #.
Загнала мене в глухий кут тема Регулярних виразів. Скоріше не сама тема, так як я прочитав стільки інформації, що вже сни про регулярки сняться, а саме завдання.

Буду вдячний, якщо хто що може підказати, бо я валянок.

Саме завдання: Розробити консольну програму для виконання аналізу вхідної послідовності символів, що вводяться користувачем з метою визначення її приналежності до граматики. Програма повинна містити блок синтаксичного аналізу вхідної послідовності на базі регулярних виразів.

Розробити синтаксичний аналізатор для поняття "умовний_оператор":

умовний_оператор::= if (умова) оператор { else оператор }?

оператор::= {змінна++;} | {змінна--;}

умова::= змінна {<|>} змінна

змінна::= літера+цифра*

літера::= a|b|c

цифра::= 0|1|2|3|4|5|6|7|8|9


Питання, які у мене виникли, це - чи є в регулярних виразах конструкція if - else?

Як це задати, починаючи з умови? Що значить {<|>}?

А також, що вводити в консоль для перевірки?

Подякували: 0xDADA11C71

2 Востаннє редагувалося wander (24.11.2019 23:44:17)

Re: Регулярні вирази. БНФ

alicemilesone написав:

> вивчаємо зараз ООП
> тема Регулярних виразів

*DONT_KNOW*

alicemilesone написав:

чи є в регулярних виразах конструкція if - else?

Нема.

alicemilesone написав:

Як це задати, починаючи з умови?

Це, це що?

alicemilesone написав:

Що значить {<|>}?

Це б Ви мали сказати, якщо говорити про ванільну БНФ, то це вроді як обмежувачі виразу. Проте це не схоже на те, очевидно. Якщо говорити про розширену БНФ, то схоже що <|> - це просто оператори більше і менше, а { } фігурні дужки позначають те, що вираз може бути проігнорований, або повторюватися.

alicemilesone написав:

А також, що вводити в консоль для перевірки?

Текст.
Проте якщо розглянути ось цей рядок:

alicemilesone написав:

змінна::= літера+цифра*

то не зовсім зрозуміло, що означає +?
Згідно ISO-14977, + - це просто знак плюс, а * - це символ повторення.
Тобто змінні мають у вас бути у вигляді типу: name+2019, наприклад.

alicemilesone написав:

літера::= a|b|c
цифра::= 0|1|2|3|4|5|6|7|8|9

А тут кожна буква та цифра мали би бути в лапках.

Подякували: alicemilesone, leofun012

3 Востаннє редагувалося leofun01 (24.11.2019 23:39:52)

Re: Регулярні вирази. БНФ

alicemilesone написав:

Вчуся на другому курсі

Хто з вас не відвідує заняття ? ви чи ваш викладач ?

alicemilesone написав:

чи є в регулярних виразах конструкція if - else?

Це залежить від реалізації, загалом нема. Та вам вони і не потрібні, бо if і else у вас це літерали (просто текст).

alicemilesone написав:

Що значить {<|>}?

{<|>} значить { < або > } (в даному випадку "виключне або").

alicemilesone написав:

що вводити в консоль для перевірки?

Вирази, серед яких будуть ті які належать граматиці

if (a123 > b987) c555++;
if (a > b) c++;
if (a < b) c++; else c--;
if (a < b) c--; else c++;
if (a1 < b2) c9876543210++; else c0123456789--;

, і ті які не належать:

if (a > b) c+++;
if (a < b) c+;
if (a > b) c+-;
if (1a < 2b) c++; else c--;
else c++; if (a < b) c--;
if (a1 < b2) c++ else c--
if (a < b) c++; else if (c < a) b++; else a--;
alicemilesone написав:

Як це задати

Регулярку ? :

if\ \([abc][0-9]*\ [<>]\ [abc][0-9]*\)\ [abc][0-9]*(\+\+|\-\-);(\ else\ [abc][0-9]*(\+\+|\-\-);)?
Подякували: alicemilesone1