--- gforth/kernel/recognizer.fs 2011/10/06 20:04:35 1.7 +++ gforth/kernel/recognizer.fs 2011/10/06 21:17:21 1.12 @@ -24,32 +24,32 @@ :noname ( ... nt -- ) name>int execute ; :noname ( ... nt -- ) name>comp execute ; :noname ( ... nt -- ) postpone Literal ; -Create r:interpreter rot A, swap A, A, +Create r:word rot A, swap A, A, -:noname ( addr u -- nt int-table true | addr u false ) +: word-recognizer ( addr u -- nt int-table true | addr u false ) 2dup find-name [ [IFDEF] prelude-mask ] run-prelude [ [THEN] ] dup IF - nip nip r:interpreter true EXIT - THEN ; Constant int-recognizer + nip nip r:word true EXIT + THEN ; ' noop :noname postpone Literal ; dup -Create r:number rot A, swap A, A, +Create r:num rot A, swap A, A, ' noop :noname postpone 2Literal ; dup -Create r:2number rot A, swap A, A, +Create r:2num rot A, swap A, A, \ snumber? should be implemented as recognizer stack -:noname ( addr u -- nt int-table true | addr u false ) +: num-recognizer ( addr u -- n/d int-table true | addr u false ) 2dup 2>r snumber? dup IF - 2rdrop 0> IF r:2number ELSE r:number THEN true EXIT + 2rdrop 0> IF r:2num ELSE r:num THEN true EXIT THEN - drop 2r> false ; Constant num-recognizer + drop 2r> false ; ' no.extensions dup dup Create r:fail A, A, A, @@ -58,21 +58,21 @@ Create r:2number rot A, swap A, A, $10 Constant max-rec# : get-recognizers ( rec-addr -- xt1 .. xtn n ) - dup cell+ swap @ dup >r cells bounds ?DO + dup swap @ dup >r cells bounds swap ?DO I @ - cell +LOOP r> ; + cell -LOOP r> ; : set-recognizers ( xt1 .. xtn n rec-addr -- ) over max-rec# u>= abort" Too many recognizers" - 2dup ! swap cells bounds swap ?DO + 2dup ! cell+ swap cells bounds ?DO I ! - cell -LOOP ; + cell +LOOP ; Variable forth-recognizer -int-recognizer A, num-recognizer A, max-rec# 2 - cells allot +' word-recognizer A, ' num-recognizer A, max-rec# 2 - cells allot 2 forth-recognizer ! -\ num-recognizer int-recognizer 2 forth-recognizer set-recognizers +\ ' num-recognizer ' word-recognizer 2 forth-recognizer set-recognizers \ recognizer loop @@ -106,8 +106,9 @@ int-recognizer A, num-recognizer A, max- \G Enter compilation state. ['] compiler-r IS parser1 state on ; +: >int ( token table -- ) r>int perform ; +: >comp ( token table -- ) r>comp perform ; : >postpone ( token table -- ) - dup r:fail = IF no.extensions THEN >r r@ r>lit perform r> r>comp @ compile, ; : postpone ( "name" -- ) \ core