Посочете проблеми в реализацията на НСА

Number of replies: 6

Публикувайте тук проблемите, които забележите  в реализацията на НСА от лекции. За да получите бонус точки, предложете как проблемът да се поправи.

In reply to First post

Re: Посочете проблеми в реализацията на НСА

от Кристиян Митов -
Първият проблем, който забелязах, е когато трябва да заместим съдържанието на стека с празен низ. Поради някаква причина цикълът при добавянето на празен низ в стека става безкраен, имам подозрение, че понеже той вече сочи към \0, не става увеличаване на указателя, а после цикълът задължително го намалява с поне едно. При добавяне на проверка за това дали низът е празен, при която функцията да не прави нищо, проблемът се отстранява и примерът работи коректно.
In reply to Кристиян Митов

Re: Посочете проблеми в реализацията на НСА

от Кристиян Митов -
Става въпрос за функцията pushToStack(const char*);,че май не става много ясно от предишния ми пост :D .Промяна, която оправя проблемът, е примерно добавянето в началото й на една проверка if(*sw == '\0') { return; } Така избягваме и да добавим празен елемент в стека, което също можеше да стане проблем според мен, защото стек без елементи и стек с един елемен '\0' са различни неща според мен. Ефектът на само return e желаният, защото вече сме попнали елемент от стека, т.е. все едно сме го заместили с празен низ
In reply to Кристиян Митов

Re: Посочете проблеми в реализацията на НСА

от Кристиян Пейчев -

Малко по-елегантно решение ще е цикъла да не е do-while, а просто едно while и тогава проверката ни е "автоматична".

In reply to Кристиян Пейчев

Re: Посочете проблеми в реализацията на НСА

от Трифон Трифонов -

Точно така, това е проблемът, с който се сблъскахме в последните минути на лекциите. Кристиян Митов получава 2 точки бонус. Само че повече ми харесва идеята на Кристиян Пейчев, който предлага да се използва while вместо do/while. Той получава 1 точка бонус. Ще кача кода с поправката.

In reply to First post

Re: Посочете проблеми в реализацията на НСА

от Кристиян Пейчев -
Има проблем с StackAutomaton::recognize и най-вече с какво връща ако if-ът е истина.
Проверяваме дали ни е подадена празна дума, до тук всичко е OK, но проблема е, че връщаме дали stack-а ни е празен или не. Проблема е, че stack-ът ни никога няма да стане празен с дадената реализация, защото работиме по формална система и проверката ни за празен stack трябва да е такава, че трябва да провериме дали символът, който гледаме е '#', а ние го проверяваме със stack.empty(), което не разбрах защо, но след 1 час дебъгване излезе, че винаги беше false когато се стигнеше до там.

Аз измислих 2 начина да се оправи това (май). Първото ми предложение е да се сложи израза g = stack.pop() над проверката и би трябвало да се оправят нещата. Другото е да не се връща stack.empty(), а (g == '#'), като пак трябва да се pop-ва над проверката.

I'm open to critique.
In reply to Кристиян Пейчев

Re: Посочете проблеми в реализацията на НСА

от Трифон Трифонов -

Ами всъщност следваме точно формалната дефиниция, в която стекът започва с точно един символ, който маркира дъното на стека. За справка: презентацията по ЕАИ за контекстно свободни езици, слайдове 40-42. Започваме със стек, който съдържа само # и завършваме с празен стек. Виж примера в grammars.cpp: след поправката в pushToStack, вече работи правилно.


В реализацията наистина има един бъг свързан с празнотата на стека, но не е това... ловът продължава! :)