infix.fb 3 KB
Newer Older
bp's avatar
bp committed
1
\\ 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;