\\ Infix nach Postfix wandeln 05aug91py Dies hier ist ein einfacher, priorit„tengesteuerter Infix- Rechner. Neue Operationen lassen sich leicht hinzufgen. Ein Infix-Ausdruck wird in $-Zeichen geschachtelt. Zwischen Zahlen und Schlsselw”rtern mssen Leerzeichen stehen, da der normale FORTH-Scanner WORD verwendet wird. Beispiel: $ ( 1 + 2 * 3 ) * ( 4 - 5 + 6 - 7 + 8 ) $ . gibt 42 Allerdings wird keine sehr sorgf„ltige Syntaxanalyse durchge- fhrt. Dafr ist dieser Interpreter sehr kurz. Mehr als 16 Klammerebenen und Vorrangausfhrungen sollten es nicht sein, sonst l„uft der Operatorstack ber... \ Infixinterpreter 05aug91py Module infix | Variable op $10 cells allot | : op@ ( -- addr ) op dup @ cells + ; | : >o ( o -- ) 1 op +! op@ ! ; | : o> ( -- o ) op@ @ -1 op +! ; | : prio@ ( -- prio ) op@ @ @ ; | : op, ( -- ) o> cell+ @ state @ IF cfa, ELSE execute THEN ; : in ( cfa priority -- ) >in @ ' -rot >in ! create , A, immediate DOES> dup >r @ 0 max >r BEGIN prio@ r@ < 0= WHILE op, REPEAT rdrop r> >o ; --> \ Infixinterpreter 05aug91py' ! alias =: | : := swap ! ; macro | ' noop alias (( 20 in + 20 in - 21 in * 21 in / 21 in mod 21 in max 21 in min 10 in = 10 in > 10 in < 02 in or 03 in and 04 in invert 02 in xor 01 in := 01 in =: | -1 in (( | : unbalanced abort" unbalanced expression!" ; : ( [ ' (( >body ] ALiteral >o ; immediate : ) op @ 0= unbalanced compile (( o> o> 2drop ; immediate : to compile ) compile to compile ( ; immediate : $ op off also infix compile ( ; immediate export $ ; : $ toss compile ) op @ unbalanced ; immediate Module;