/* iGASM example */ /* Translates list of lexems of expression with binary operators to Reverse Polish Notation */ UNIVERSES /* available operators: */ Operator = {"+","-","*","/","(",")"}; FUNCTIONS tape : List; /* input list of lexems */ st : Stack; rpn : Stack; /* output stack */ static priority : Operator -> Number; /* priorities: */ INITIAL /* example: "10*(3+4)" */ tape := listAppend(listAppend(listAppend(listAppend( listAppend(listAppend(listAppend(emptyList, 10),"*"),"("),3),"+"),4),")"); st := emptyStack; rpn := emptyStack; priority("+") := 2; priority("-") := 2; priority("*") := 3; priority("/") := 3; priority("(") := 1; priority(")") := 1; FINAL tape = undef; RULES IF tape != emptyList THEN IF Operator(listhead(tape)) THEN IF listHead(tape)=")" THEN st := stPop(st); IF stTop(st)="(" THEN tape := listTail(tape); ELSE rpn := stPush(rpn, stTop(st) ); ENDIF ELSEIF listHead(tape)="(" THEN st := stPush(st, listHead(tape)); tape := listTail(tape); ELSEIF (priority(stTop(st)) >= priority(listHead(tape)) ) THEN /*st->tape*/ st := stPop(st); rpn := stPush(rpn, stTop(st)); ELSE st := stPush(st, listHead(tape)); tape := listTail(tape); ENDIF ELSEIF Number(listHead(tape)) THEN tape := listTail(tape); rpn := stPush(rpn, listHead(tape)); ELSE /*error*/ curMode := undef; writeln := "Error: undefined symbol :" + toString(listHead(tape)); ENDIF ELSEIF st!=emptyStack THEN st := stPop(st); rpn := stPush(rpn, stTop(st)); ELSE curMode := eval; tape := undef; writeln := rpn; /* writes result */ ENDIF