Annotation of gforth/kernel/recognizer.fs, revision 1.1
1.1 ! pazsan 1: \ recognizer-based interpreter 05oct2011py
! 2:
! 3: \ Recognizer are words that take a string and try to figure out
! 4: \ what to do with it. I want to separate the parse action from
! 5: \ the interpret/compile/postpone action, so that recognizers
! 6: \ are more general than just be used for the interpreter.
! 7:
! 8: \ The "design pattern" used here is the *factory*, even though
! 9: \ the recognizer does not return a full-blown object.
! 10: \ A recognizer has the stack effect
! 11: \ ( addr u -- token table true | addr u false )
! 12: \ where the token is the result of the parsing action (can be more than
! 13: \ one stack or live on other stacks, e.g. on the FP stack)
! 14: \ and the table contains for actions (as array of four xts:
! 15: \ interpret it, compile interpretation semantics
! 16: \ compile it, compile it as literal.
! 17:
! 18: : recognizer: ( xt1 xt2 xt3 xt4 -- ) Create 2swap swap 2, swap 2, ;
! 19:
! 20: : r>int ( r-addr -- ) @ ;
! 21: : r>compint ( r-addr -- ) cell+ @ ;
! 22: : r>comp ( r-addr -- ) cell+ cell+ @ ;
! 23: : r>lit ( r-addr -- ) cell+ cell+ cell+ @ ;
! 24:
! 25: :noname ( ... nt -- ) name>int execute ;
! 26: :noname ( ... nt -- ) name>int compile, ;
! 27: :noname ( ... nt -- ) name>comp execute ;
! 28: :noname ( ... nt -- ) postpone Literal ;
! 29: recognizer: r:int-table
! 30:
! 31: :noname ( addr u -- nt int-table true | addr u false )
! 32: 2dup find-name [ [IFDEF] prelude-mask ] run-prelude [ [THEN] ] dup
! 33: IF
! 34: nip nip r:int-table true EXIT
! 35: THEN ; Constant int-recognizer
! 36:
! 37: ' noop
! 38: :noname postpone Literal ;
! 39: dup
! 40: dup
! 41: recognizer: r:number
! 42:
! 43: ' noop
! 44: :noname postpone 2Literal ;
! 45: dup
! 46: dup
! 47: recognizer: r:2number
! 48:
! 49: :noname ( addr u -- nt int-table true | addr u false )
! 50: 2dup 2>r snumber? dup
! 51: IF
! 52: 2rdrop 0> IF r:2number ELSE r:number THEN true EXIT
! 53: THEN
! 54: drop 2r> false ; Constant num-recognizer
! 55:
! 56: \ recognizer stack
! 57:
! 58: $10 Constant max-rec#
! 59: Variable forth-recognizer max-rec# cells allot
! 60:
! 61: : get-recognizers ( rec-addr -- xt1 .. xtn n )
! 62: dup cell+ swap @ dup >r cells bounds ?DO
! 63: I @
! 64: cell +LOOP r> ;
! 65:
! 66: : set-recognizers ( xt1 .. xtn n rec-addr -- )
! 67: over max-rec# u>= abort" Too many recognizers"
! 68: 2dup ! swap cells bounds swap ?DO
! 69: I !
! 70: cell -LOOP ;
! 71:
! 72: num-recognizer int-recognizer 2 forth-recognizer set-recognizers
! 73:
! 74: \ recognizer loop
! 75:
! 76: : do-recognizer ( addr u rec-addr -- token table )
! 77: dup cell+ swap @ cells bounds ?DO
! 78: I perform IF UNLOOP EXIT THEN
! 79: cell +LOOP
! 80: no.extensions ;
! 81:
! 82: : interpreter-r ( addr u -- ... xt )
! 83: forth-recognizer do-recognizer r>int ;
! 84:
! 85: : compiler-r ( addr u -- ... xt )
! 86: forth-recognizer do-recognizer r>comp ;
! 87:
! 88: : [ ( -- ) \ core left-bracket
! 89: \G Enter interpretation state. Immediate word.
! 90: ['] interpreter-r IS parser1 state off ; immediate
! 91:
! 92: : ] ( -- ) \ core right-bracket
! 93: \G Enter compilation state.
! 94: ['] compiler-r IS parser1 state on ;
! 95:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>