Annotation of qemu/roms/openbios/forth/bootstrap/interpreter.fs, revision 1.1

1.1     ! root        1: \ tag: forth interpreter
        !             2: \ 
        !             3: \ Copyright (C) 2003 Stefan Reinauer
        !             4: \ 
        !             5: \ See the file "COPYING" for further information about
        !             6: \ the copyright and warranty status of this work.
        !             7: \ 
        !             8: 
        !             9: 
        !            10: \ 
        !            11: \ 7.3.4.6 Display pause
        !            12: \ 
        !            13: 
        !            14: 0 value interactive?
        !            15: 0 value terminate?
        !            16: 
        !            17: : exit?
        !            18:   interactive? 0= if
        !            19:     false exit
        !            20:   then
        !            21:   false \ FIXME we should check whether to interrupt output
        !            22:         \ and ask the user how to proceed.
        !            23:   ;
        !            24: 
        !            25: 
        !            26: \ 
        !            27: \ 7.3.9.1 Defining words
        !            28: \ 
        !            29: 
        !            30: : forget 
        !            31:   s" This word is obsolescent." type cr
        !            32:   ['] ' execute
        !            33:   cell - dup 
        !            34:   @ dup 
        !            35:   last ! latest !
        !            36:   here!
        !            37:   ;
        !            38:  
        !            39: \ 
        !            40: \ 7.3.9.2.4 Miscellaneous dictionary
        !            41: \ 
        !            42: 
        !            43: \ interpreter. This word checks whether the interpreted word
        !            44: \ is a word in dictionary or a number. It honours compile mode 
        !            45: \ and immediate/compile-only words.
        !            46: 
        !            47: : interpret 
        !            48:   0 >in !
        !            49:   begin
        !            50:     parse-word dup 0> \ was there a word at all?
        !            51:   while
        !            52:     $find 
        !            53:     if
        !            54:       dup flags? 0<> state @ 0= or if
        !            55:         execute
        !            56:       else
        !            57:         ,             \ compile mode && !immediate
        !            58:       then
        !            59:     else              \ word is not known. maybe it's a number
        !            60:       2dup $number
        !            61:       if
        !            62:         span @ >in !  \ if we encountered an error, don't continue parsing
        !            63:         type 3a emit
        !            64:        -13 throw
        !            65:       else
        !            66:         -rot 2drop 1 handle-lit
        !            67:       then
        !            68:     then
        !            69:     depth 200 >=  if -3 throw then 
        !            70:     depth 0<      if -4 throw then
        !            71:     rdepth 200 >= if -5 throw then 
        !            72:     rdepth 0<     if -6 throw then
        !            73:   repeat
        !            74:   2drop
        !            75:   ;
        !            76: 
        !            77: : refill ( -- )
        !            78:        ib #ib @ expect 0 >in ! ;
        !            79: 
        !            80: : print-status  ( exception -- )
        !            81:   space
        !            82:   ?dup if
        !            83:     dup sys-debug \ system debug hook
        !            84:     case 
        !            85:        -1 of s" Aborted." type endof
        !            86:        -2 of s" Aborted." type endof
        !            87:        -3 of s" Stack Overflow." type 0 depth! endof
        !            88:        -4 of s" Stack Underflow." type 0 depth! endof
        !            89:        -5 of s" Return Stack Overflow." type endof
        !            90:        -6 of s" Return Stack Underflow." type endof
        !            91:       -13 of s" undefined word." type endof
        !            92:       -15 of s" out of memory." type endof
        !            93:       -21 of s" undefined method." type endof
        !            94:       -22 of s" no such device." type endof
        !            95:       dup s" Exception #" type . 
        !            96:       0 state !
        !            97:     endcase
        !            98:   else
        !            99:     state @ 0= if
        !           100:       s" ok"
        !           101:     else 
        !           102:       s" compiled"
        !           103:     then
        !           104:     type
        !           105:   then
        !           106:   cr
        !           107:   ;
        !           108: 
        !           109: defer status
        !           110: ['] noop ['] status (to)
        !           111: 
        !           112: : print-prompt
        !           113:   status 
        !           114:   depth . 3e emit space
        !           115:   ;
        !           116:   
        !           117: defer outer-interpreter
        !           118: :noname
        !           119:   cr
        !           120:   begin
        !           121:     print-prompt
        !           122:     source 0 fill           \ clean input buffer
        !           123:     refill 
        !           124: 
        !           125:     ['] interpret catch print-status
        !           126:     terminate?
        !           127:   until
        !           128: ; ['] outer-interpreter (to)
        !           129: 
        !           130: \ 
        !           131: \ 7.3.8.5 Other control flow commands
        !           132: \ 
        !           133: 
        !           134: : save-source  ( -- )
        !           135:   r>               \ fetch our caller
        !           136:   ib >r #ib @ >r   \ save current input buffer
        !           137:   source-id >r     \ and all variables 
        !           138:   span @ >r        \ associated with it.
        !           139:   >in @ >r
        !           140:   >r               \ move back our caller
        !           141:   ;
        !           142: 
        !           143: : restore-source ( -- )
        !           144:   r> 
        !           145:   r> >in ! 
        !           146:   r> span ! 
        !           147:   r> ['] source-id (to) 
        !           148:   r> #ib ! 
        !           149:   r> ['] ib (to) 
        !           150:   >r
        !           151:   ;
        !           152: 
        !           153: : (evaluate) ( str len -- ??? )
        !           154:   save-source
        !           155:   -1 ['] source-id (to)
        !           156:   dup
        !           157:   #ib ! span !
        !           158:   ['] ib (to)
        !           159:   interpret
        !           160:   restore-source
        !           161:   ; 
        !           162: 
        !           163: : evaluate ( str len -- ?? )
        !           164:   2dup + -rot
        !           165:   over + over do 
        !           166:     i c@ 0a = if 
        !           167:       i over - 
        !           168:       (evaluate)
        !           169:       i 1+ 
        !           170:     then 
        !           171:   loop 
        !           172:   swap over - (evaluate)
        !           173:   ;
        !           174:   
        !           175: : eval evaluate ;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.