# Kodowanie symboli specjalnych jest następujące: # zero = 0, 0 # koniec łańcucha = 0, 1 # + = 0, 2 # - = 0, 3 # * = 0, 4 # / = 0, 5 # # np. # notacja infiksowa: (((8+9)*5)-8/2)*(1+2) = 243 # ONP: 8 9 + 5 * 8 2, / - 1 2 + * eol # po zakodowaniu: 8 9 0 2 5 0 4 8 2 0 5 0 3 1 2 0 2 0 4 0 1 # # proponowane wyrażenie watch: # x=3 y=5 arg_a=2 arg_b=3 top=4 stack=10:15 load =10 # r4 - wskaźnik stosu (top[stack]) store 4 # stos zaczyna się od rejestru 10-tego next: read 3 # wczytaj x (r3) load 3 jzero escape # znak specjalny jump pushnum # liczba escape: read 0 # wczytaj y jzero pushnum # x,y = 0,0 -> wartość zero sub =1 # (y-1) == 0 -> x,y = 0,1 -> koniec łańcucha jzero eol # store 5 # r5 = y # ściągamy ze stosu dwie liczby load 4 sub =10 # "usuń" offset sub =1 # gdy ilość el. na stosie wynosi zero to r0=-1 # gdy jest jeden el. to r0=0 jgtz pop2 jump error # stos zawiera 0 albo 1 element - błąd! pop2: load 4 # załaduj wskaźnik stosu sub =1 # load *0 # store 2 # r2 = wierzchołek stosu load 4 # sub =2 # store 4 # load *0 # store 3 # r3 = "podwierzchołek" stosu # klasyfikujemy y load 5 sub =1 # (y-2) == 0 -> x,y = 0,2 -> plus jzero plus sub =1 # (y-3) == 0 -> x,y = 0,3 -> minus jzero minus sub =1 # (y-4) == 0 -> x,y = 0,4 -> mnożenie jzero mult sub =1 # (y-5) == 0 -> x,y = 0,5 -> dzielenie jzero div jump error # niewłaściwy kod! plus: load 2 add 3 jump pushnum minus: load 3 sub 2 jump pushnum mult: load 3 mult 2 jump pushnum div: load 3 div 2 pushnum: store *4 # stack[sp++] = r0 load 4 # sp++ add =1 # store 4 # jump next # eol: write 10 # zapisz top[stack] error: halt