[asm?] Dzialania na zmiennych bool'owskich

0

Pisze kompilator (nie do konca, no ale zawsze) i najwiekszy problem z jakim sie spotkalem do tej pory, to sposob obliczania wartosci wyrazen Bool'owskich. Chodzi mi tutaj o 'niekompletne' obliczanie, tzn. tylko az do chwili, do kiedy jest to konieczne. (np. a and b and b and b, gdy a=0 i b=1 - wynik widac wykonujac jedno obliczenie (0) (w pseudoasmie: and a, b; jz koniec; and b, b; jz koniec ...). Z wyrazeniami skladajacymi sie z samych koniunkcji badz samych alternatyw nie ma problemu, ale gorzej jest przy wyrazeniach typu: (a or b or c and d) and (a and b or c and d). Jedyne do czego doszedlem, to rozpisanie tego w drzewko, ale jakos nie moge doszukac sie tutaj jakichs w miare ogolnych zasad...
Wiec tutaj prosba: jezeli spotkales sie z tym problemem, lub masz jakis pomysl, to pomoz mi :]([browar])

0

Odpowiedz jest dosyc prosta - odwrotna notacja polska.

0
Wolverine napisał(a)

Odpowiedz jest dosyc prosta - odwrotna notacja polska.

ONP oczywiscie jest pomocne, ale ja tam rozwiazania nie znalazlem... Wolverine: mozesz skonkretyzowac bardziej?

0

Jesli twoj komppilator potrafi liczyc wyrazenia matematyczne to po prostu dodajesz nowe operatory - or, and itp. Jesli tego nie masz, to po prostu implementujesz, jako stosu uzywasz stosu procesora. Nie wiem za bardzo jak to wyjasniac, wszystko wydaje mi sie proste.

0
Wolverine napisał(a)

Jesli twoj komppilator potrafi liczyc wyrazenia matematyczne to po prostu dodajesz nowe operatory - or, and itp. Jesli tego nie masz, to po prostu implementujesz, jako stosu uzywasz stosu procesora. Nie wiem za bardzo jak to wyjasniac, wszystko wydaje mi sie proste.

Chyba nie zrozumiałeś kolegi. Tutaj nie chodzi o to jak całość wyliczyć, ale jak to zrobić, aby nie trzeba było obliczać wszystkich składników.

Po prostu trzeba dobrać odpowiednie akcje semantyczne.

wyr := wyr op czyn { oblicz wyr;
if wyr = false and op = 'and' then
return false
else if wyr = true and op = 'or' then
return true
else
oblicz czyn;
mov reg, wyr
return 'op reg, czyn'
}
czyn := term { return term }
czyn := (wyr) { oblicz wyn; return wyn; }

0

Dryobates, co to za język? Mieszanka Pascala (

if wyr = false and op = 'and' then

), Assemblera (mov reg, wyr

), C++ (<code class="cpp">{ }

i return 'op reg, czyn'

). I jakieś `oblicz czyn;`. Co to znaczy?
0

czyn to ten drugi operand (było wyr op CZYN). A ten jego język to jakieś takie pseudo, ale dobrze zrozumiałe (skoro nawet ja wiem, o co biega) ;P Dorzuć do tego xor'a i negację :)

0
adiblol napisał(a)

Dryobates, co to za język? Mieszanka Pascala (

if wyr = false and op = 'and' then

), Assemblera (mov reg, wyr

), C++ (<code class="cpp">{ }

i return 'op reg, czyn'

). I jakieś `oblicz czyn;`. Co to znaczy?


To jest BNF (dla gramatyki) lub coś w tym stylu (może EBNF, tak na oko pisałem, by było wiadomo o co chodzi) wraz z akcjami semantycznymi (w pseudokodzie).

Autor pytania na pewno wie o co chodzi. A pozostałym polecam lekturę dot. kompilatorów.
0

Dobrze by bylo zapoznac sie z gramatyka formalna chomskiego (dokladnie gramatyka bezkontekstowa). To na pewno ulatwi napisanie kompilatora.

1 użytkowników online, w tym zalogowanych: 0, gości: 1