--- gforth/prims2x.fs 1995/11/07 18:06:57 1.16 +++ gforth/prims2x.fs 1996/07/26 15:28:31 1.23 @@ -42,38 +42,38 @@ warnings off +require interpretation.fs +require debugging.fs [IFUNDEF] vocabulary include search-order.fs [THEN] [IFUNDEF] environment? include environ.fs [THEN] include gray.fs 100 constant max-effect \ number of things on one side of a stack effect -4096 constant batch-size \ no meaning, just make sure it's >0 255 constant maxchar maxchar 1+ constant eof-char -9 constant tab-char -10 constant nl-char +#tab constant tab-char +#lf constant nl-char : read-whole-file ( c-addr1 file-id -- c-addr2 ) \ reads the contents of the file file-id puts it into memory at c-addr1 \ c-addr2 is the first address after the file block - begin ( c-addr file-id ) - 2dup batch-size swap read-file - if - true abort" I/O error" - endif - ( c-addr file-id actual-size ) rot over + -rot - batch-size <> - until - drop ; + >r dup $7fffffff r> read-file throw + ; -variable input \ pointer to next character to be parsed -variable endinput \ pointer to the end of the input (the char after the last) +variable rawinput \ pointer to next character to be scanned +variable endrawinput \ pointer to the end of the input (the char after the last) +variable cookedinput \ pointer to the next char to be parsed +variable line \ line number of char pointed to by input +1 line ! +2variable filename \ filename of original input file +0 0 filename 2! +variable skipsynclines \ are sync lines ("#line ...") invisible to the parser? +skipsynclines on : start ( -- addr ) - input @ ; + cookedinput @ ; : end ( addr -- addr u ) - input @ over - ; + cookedinput @ over - ; variable output \ xt ( -- ) of output word @@ -110,6 +110,11 @@ variable effect-in-end ( pointer ) variable effect-out-end ( pointer ) 2variable effect-in-size 2variable effect-out-size +variable c-line +2variable c-filename +variable name-line +2variable name-filename +2variable last-name-filename variable primitive-number -10 primitive-number ! @@ -131,12 +136,11 @@ variable items eof-char max-member \ the whole character set + EOF : getinput ( -- n ) - input @ - dup endinput @ = + rawinput @ endrawinput @ = if - drop eof-char + eof-char else - c@ + cookedinput @ c@ endif ; :noname ( n -- ) @@ -151,16 +155,42 @@ print-token ! getinput member? ; ' testchar? test-vector ! +: checksyncline ( -- ) + \ when input points to a newline, check if the next line is a + \ sync line. If it is, perform the appropriate actions. + rawinput @ >r + s" #line " r@ over compare 0<> if + rdrop 1 line +! EXIT + endif + 0. r> 6 chars + 20 >number drop >r drop line ! r> ( c-addr ) + dup c@ bl = if + char+ dup c@ [char] " <> abort" sync line syntax" + char+ dup 100 [char] " scan drop swap 2dup - save-string filename 2! + char+ + endif + dup c@ nl-char <> abort" sync line syntax" + skipsynclines @ if + dup char+ rawinput ! + rawinput @ c@ cookedinput @ c! + endif + drop ; + : ?nextchar ( f -- ) - ?not? if - ." syntax error" cr - getinput . cr - input @ endinput @ over - 100 min type cr - abort - endif - input @ endinput @ <> if - 1 input +! - endif ; + ?not? if + filename 2@ type ." :" line @ 0 .r ." : syntax error, wrong char:" + getinput . cr + rawinput @ endrawinput @ over - 100 min type cr + abort + endif + rawinput @ endrawinput @ <> if + rawinput @ c@ + 1 chars rawinput +! + 1 chars cookedinput +! + nl-char = if + checksyncline + endif + rawinput @ c@ cookedinput @ c! + endif ; : charclass ( set "name" -- ) ['] ?nextchar terminal ; @@ -174,7 +204,7 @@ print-token ! : ` ( -- terminal ) ( use: ` c ) ( creates anonymous terminal for the character c ) - [compile] ascii singleton ['] ?nextchar make-terminal ; + char singleton ['] ?nextchar make-terminal ; char a char z .. char A char Z .. union char _ singleton union charclass letter char 0 char 9 .. charclass digit @@ -204,13 +234,14 @@ nowhite ++ (( {{ s" " doc 2! s" " forth-code 2! }} (( comment || nl )) ** - (( {{ start }} name {{ end 2dup forth-name 2! c-name 2! }} tab ++ + (( {{ line @ name-line ! filename 2@ name-filename 2! }} + {{ start }} name {{ end 2dup forth-name 2! c-name 2! }} tab ++ {{ start }} stack-effect {{ end stack-string 2! }} tab ++ {{ start }} name {{ end wordset 2! }} tab ** (( {{ start }} c-name {{ end c-name 2! }} )) ?? nl )) (( ` " ` " {{ start }} (( noquote ++ ` " )) ++ {{ end 1- doc 2! }} ` " nl )) ?? - {{ start }} (( nocolonnl nonl ** nl )) ** {{ end c-code 2! }} + {{ skipsynclines off line @ c-line ! filename 2@ c-filename 2! start }} (( nocolonnl nonl ** nl )) ** {{ end c-code 2! skipsynclines on }} (( ` : nl {{ start }} (( nonl ++ nl )) ++ {{ end forth-code 2! }} )) ?? @@ -226,11 +257,15 @@ warnings @ [IF] : primfilter ( file-id xt -- ) \ fileid is for the input file, xt ( -- ) is for the output word output ! - here input ! + here dup rawinput ! cookedinput ! here swap read-whole-file - dup endinput ! + dup endrawinput ! here - allot align + checksyncline +\ begin +\ getinput dup eof-char = ?EXIT emit true ?nextchar +\ again ; primitives2something ; \ types @@ -271,11 +306,11 @@ constant type-description : fetch-double ( item -- ) >r - r@ item-name 2@ type - ." = ({Double_Store _d; _d.cells.low = " + ." FETCH_DCELL(" + r@ item-name 2@ type ." , " r@ item-d-offset @ dup effect-in-size 2@ data-stack-access - ." ; _d.cells.high = " 1+ effect-in-size 2@ data-stack-access - ." ; _d.dcell;});" cr + ." , " 1+ effect-in-size 2@ data-stack-access + ." );" cr rdrop ; : fetch-float ( item -- ) @@ -326,10 +361,10 @@ constant type-description : store-double ( item -- ) \ !! store optimization is not performed, because it is not yet needed >r - ." {Double_Store _d; _d.dcell = " r@ item-name 2@ type ." ; " - r@ item-d-offset @ dup effect-out-size 2@ data-stack-access - ." = _d.cells.low; " 1+ effect-out-size 2@ data-stack-access - ." = _d.cells.high;}" cr + ." STORE_DCELL(" r@ item-name 2@ type ." , " + r@ item-d-offset @ dup effect-out-size 2@ data-stack-access + ." , " 1+ effect-out-size 2@ data-stack-access + ." );" cr rdrop ; : f-same-as-in? ( item -- f ) @@ -546,6 +581,7 @@ set-current fetches stack-pointer-updates ." {" cr + ." #line " c-line @ . [char] " emit c-filename 2@ type [char] " emit cr c-code 2@ type ." }" cr ." NEXT_P1;" cr @@ -573,6 +609,23 @@ set-current -1 primitive-number +! THEN ; +: output-tag-file ( -- ) + name-filename 2@ last-name-filename 2@ compare if + name-filename 2@ last-name-filename 2! + #ff emit cr + name-filename 2@ type + ." ,0" cr + endif ; + +: output-tag ( -- ) + output-tag-file + forth-name 2@ 1+ type + 127 emit + space forth-name 2@ type space + 1 emit + name-line @ 0 .r + ." ,0" cr ; + [IFDEF] documentation : register-doc ( -- ) get-current documentation set-current @@ -586,8 +639,10 @@ set-current [THEN] : process-file ( addr u xt -- ) - >r r/o open-file abort" cannot open file" - warnings @ if - ." ------------ CUT HERE -------------" cr endif - r> primfilter ; + >r + 2dup filename 2! + r/o open-file abort" cannot open file" + warnings @ if + ." ------------ CUT HERE -------------" cr endif + r> primfilter ;