1

Тема: Контекстно-вільна граматика.

Усім привіт, форумчани!
Не знав в який розділ форуму написати, тому пишу тут.
Є люди, які розуміються на контекстно-вільних граматиках? Потрібна певна допомога.
Якщо в двох словах, то написав програму (на С++) який переводить числа з римської системи числення в арабську з усіма тонкощами (типу правил повторення символів і т.д.).
Але суть в тому , що я не керувався ніякою граматикою , а викладач вимагає побудову граматики , на основі якої має будуватись програма.
Так от. Якщо є такі люди - відпишіть тут або в ПП.
Дякую усім за увагу!

Студент НУ "ЛП".

2

Re: Контекстно-вільна граматика.

А в чому проблема?

3

Re: Контекстно-вільна граматика.

koala написав:

А в чому проблема?

Проблема в побудові. Шукаю людину, яка навчить, або пояснить хоча б якісь моменти як це зробити. Можливо хтось стикався з таким, тому і запитую)

Студент НУ "ЛП".

4 Востаннє редагувалося koala (16.05.2016 13:18:40)

Re: Контекстно-вільна граматика.

Це трохи схоже на регулярні вирази. Ліворуч - що ми визначаємо, праворуч - зміст.
Для арабських чисел:

<арабське_число> ::= <цифра_не_нуль>
<арабське_число> ::= <арабське_число> <цифра>
<цифра_не_нуль> ::= 1|2|3|4|5|6|7|8|9
<цифра> ::= 0|1|2|3|4|5|6|7|8|9

Перші два рядки можна об'єднати в один:

<арабське_число> ::= <цифра_не_нуль> | <арабське_число> <цифра>

Також можна погратися і замінити останнє визначення:

<цифра>::= 0 | <цифра_не_нуль> 

та то справа смаку. Два визначення одного виразу чи знак | означає "або".
Головне: ліворуч може бути тільки нетермінальний вираз (не літера) і тільки один.
Основний плюс граматики - по ній дуже зручно розбір писати, якщо з римськими цифрами ще можна відкрутитися, то з компілятором у вас без граматики ніц не вийде.
Так що починайте писати визначення <римське_число>.

Подякували: #Sparta, 221VOLT, leofun013

5

Re: Контекстно-вільна граматика.

Хм, цікаво)
Спасибі.Як щось напишу - покажу, можливо, внесете якісь корективи.

Студент НУ "ЛП".

6

Re: Контекстно-вільна граматика.

koala написав:

Так що починайте писати визначення <римське_число>.

Загалом проблему вирішив за допомогою контекстно-вільної граматики. Наче все працює нормально, перевіряв на послідовностях чисел :) А щодо регулярних виразів, то не можу до кінця розібратися як краще описати самі правила виводу. Гуглив "регулярні вирази". В більшості випадків видає інформацію під конкретну мову програмування, а хотів би загалом. Тому почитав підручник з дискретної (якийсь кривий трошки, бо всю тему вмістили мало не в один абзац *WALL* ) більшість зрозумів, тому буду далі цю тему розбирати, бо побачив , що то є корисна штука  8) 
Якщо комусь цікаво буде подивитись, що зробив (граматика) , то можу скинути сюди.
А наразі спасибі Вам *DRINK*

Студент НУ "ЛП".

7

Re: Контекстно-вільна граматика.

Ось пояснення патерна "Інтерпретатор" як раз на прикладі римських цифр, можливо буде в нагоді.
http://cpp-reference.ru/patterns/behavi … terpreter/

life is too short to remove usb safely
Подякували: #Sparta1