Публикувайте тук проблемите, които забележите в реализацията на НСА от лекции. За да получите бонус точки, предложете как проблемът да се поправи.
Малко по-елегантно решение ще е цикъла да не е do-while, а просто едно while и тогава проверката ни е "автоматична".
Точно така, това е проблемът, с който се сблъскахме в последните минути на лекциите. Кристиян Митов получава 2 точки бонус. Само че повече ми харесва идеята на Кристиян Пейчев, който предлага да се използва while вместо do/while. Той получава 1 точка бонус. Ще кача кода с поправката.
Проверяваме дали ни е подадена празна дума, до тук всичко е OK, но проблема е, че връщаме дали stack-а ни е празен или не. Проблема е, че stack-ът ни никога няма да стане празен с дадената реализация, защото работиме по формална система и проверката ни за празен stack трябва да е такава, че трябва да провериме дали символът, който гледаме е '#', а ние го проверяваме със stack.empty(), което не разбрах защо, но след 1 час дебъгване излезе, че винаги беше false когато се стигнеше до там.
Аз измислих 2 начина да се оправи това (май). Първото ми предложение е да се сложи израза g = stack.pop() над проверката и би трябвало да се оправят нещата. Другото е да не се връща stack.empty(), а (g == '#'), като пак трябва да се pop-ва над проверката.
I'm open to critique.
Ами всъщност следваме точно формалната дефиниция, в която стекът започва с точно един символ, който маркира дъното на стека. За справка: презентацията по ЕАИ за контекстно свободни езици, слайдове 40-42. Започваме със стек, който съдържа само # и завършваме с празен стек. Виж примера в grammars.cpp: след поправката в pushToStack, вече работи правилно.
В реализацията наистина има един бъг свързан с празнотата на стека, но не е това... ловът продължава! :)