[gforth] / gforth / regexp.fs  

gforth: gforth/regexp.fs

Diff for /gforth/regexp.fs between version 1.20 and 1.30

version 1.20, Sun Sep 12 16:44:04 2010 UTC version 1.30, Tue Dec 28 23:33:53 2010 UTC
Line 113 
Line 113 
 : loops> ( -- addr ) -3 loops +!  loops @+ swap cells + 3@ ;  : loops> ( -- addr ) -3 loops +!  loops @+ swap cells + 3@ ;
 : >loops ( addr -- ) loops @+ swap cells + 3! 3 loops +! ;  : >loops ( addr -- ) loops @+ swap cells + 3! 3 loops +! ;
 : BEGIN, ( -- )  ]] BEGIN [[ >loops ;  : BEGIN, ( -- )  ]] BEGIN [[ >loops ;
 : DONE, ( -- )  loops @ IF  loops> ]] DONE [[ THEN ]] noop [[ ;  : DONE, ( -- )  loops @ IF  loops> ]] DONE [[ ELSE ." no done left!" cr THEN ;
   
 \ variables  \ variables
   
Line 126 
Line 126 
 : var> ( -- addr ) -1 varstack +!  : var> ( -- addr ) -1 varstack +!
     varstack @+ swap cells + @      varstack @+ swap cells + @
     1+ 2* cells vars + ;      1+ 2* cells vars + ;
   Variable greed-counts  9 cells allot \ no more than 9 nested greedy loops
   : greed' ( -- addr )  greed-counts dup @ + ;
   
 \ start end  \ start end
   
 0 Value end$  0 Value end$
   0 Value last$
 0 Value start$  0 Value start$
 : !end ( addr u -- addr )  over + to end$ dup to start$ ;  : !end ( addr u -- addr )  over + to end$ dup to start$ ;
 : end-rex? ( addr -- addr flag ) dup end$ u< ;  : end-rex? ( addr -- addr flag ) dup end$ u< ;
 : start-rex? ( addr -- addr flag ) dup start$ u> ;  : start-rex? ( addr -- addr flag ) dup start$ u> ;
 : ?end ( addr -- addr ) ]] dup end$ u> ?LEAVE [[ ; immediate  : ?end ( addr -- addr ) ]] dup end$ u> ?LEAVE [[ ; immediate
 : rest$ ( addr -- addr addr u ) dup end$ over - ;  : rest$ ( addr -- addr addr u ) dup end$ over - ;
   : >last ( addr -- flag )  dup to last$ end$ u<= ;
   
 \ start and end  \ start and end
   
Line 148 
Line 152 
   
 \ A word for string comparison  \ A word for string comparison
   
 : =str ( addr1 addr u -- addr2 )  : (str=?) ( addr1 addr u -- addr2 )
     dup >r 2>r rest$ r@ umin 2r> compare IF rdrop true ELSE r> + false THEN ;      dup >r 2>r rest$ r@ umin 2r> compare IF rdrop true ELSE r> + false THEN ;
 : $= ( addr1 addr u -- addr2 ) ]] =str ?LEAVE [[ ; immediate  : str=? ( addr1 addr u -- addr2 ) ]] (str=?) ?LEAVE [[ ; immediate
 : ,=" ( addr u -- ) tuck dup ]] rest$ Literal umin SLiteral compare ?LEAVE Literal + noop [[ ;  : ,=" ( addr u -- ) tuck dup ]] rest$ Literal umin SLiteral compare ?LEAVE Literal + [[ ;
 : =" ( <string>" -- ) \ regexp-pattern  : =" ( <string>" -- ) \ regexp-pattern
     \G check for string      \G check for string
     '" parse ,=" ; immediate      '" parse ,=" ; immediate
Line 163 
Line 167 
   
 : (( ( addr u -- ) \ regexp-pattern  : (( ( addr u -- ) \ regexp-pattern
     \G start regexp block      \G start regexp block
     vars off varsmax off loops off      vars off varsmax off loops off greed-counts off
     ]] FORK  AHEAD BUT JOIN !end [[ BEGIN, ; immediate      ]] FORK  AHEAD BUT JOIN !end [[ BEGIN, ; immediate
 : )) ( -- addr f ) \ regexp-pattern  : )) ( -- flag ) \ regexp-pattern
     \G end regexp block      \G end regexp block
     ]] ?end drop true ;S [[      ]] >last  ;S [[
     DONE, ]] drop false ;S THEN [[ ; immediate      DONE, ]] drop false ;S THEN [[ ; immediate
   
 \ greedy loops  \ greedy loops
Line 179 
Line 183 
   
 : {** ( addr -- addr addr ) \ regexp-pattern  : {** ( addr -- addr addr ) \ regexp-pattern
     \G greedy zero-or-more pattern      \G greedy zero-or-more pattern
     0 ]] Literal >r BEGIN dup [[ BEGIN, ; immediate      ]] false >r BEGIN  dup  FORK  BUT  WHILE  last$ r> 1+ >r  REPEAT [[
       ]] r>  AHEAD  BUT  JOIN [[
       BEGIN, ; immediate
 ' {** Alias {++ ( addr -- addr addr ) \ regexp-pattern  ' {** Alias {++ ( addr -- addr addr ) \ regexp-pattern
     \G greedy one-or-more pattern      \G greedy one-or-more pattern
     immediate      immediate
 : n*} ( sys n -- ) \ regexp-pattern  
     \G At least @var{n} pattern  
     >r ]] r> 1+ >r end-rex? 0= UNTIL dup [[ DONE, ]] drop [[  
     r@ IF r@ ]] r@ Literal u< IF  r> 1+ drops false  ;S  THEN [[ THEN  
     r@ ]] r> 1+ Literal U+DO FORK BUT [[  
     ]] IF  I' I - [[ r@ 1- ]] Literal + drops true UNLOOP ;S  THEN  LOOP [[  
     r@ IF  r@ ]] Literal drops [[ THEN  
     rdrop ]] false  ;S  JOIN [[ ; immediate  
 : **} ( sys -- ) \ regexp-pattern  : **} ( sys -- ) \ regexp-pattern
     \G end of greedy zero-or-more pattern      \G end of greedy zero-or-more pattern
     0 postpone n*} ; immediate      ]] >last  ;S [[ DONE, ]] drop false ;S  THEN [[
       ]] 1+ false  U+DO  FORK BUT [[
       ]] IF  I' I - 1- drops UNLOOP  true ;S  THEN  LOOP [[
       ]] false ;S JOIN [[ ; immediate
 : ++} ( sys -- ) \ regexp-pattern  : ++} ( sys -- ) \ regexp-pattern
     \G end of greedy zero-or-more pattern      \G end of greedy zero-or-more pattern
     1 postpone n*} ; immediate      ]] >last  ;S [[ DONE, ]] drop false ;S  THEN [[
       ]] false  U+DO  FORK BUT [[
       ]] IF  I' I - drops UNLOOP  true ;S  THEN  LOOP [[
       ]] drop false ;S JOIN [[ ; immediate
   
 \ non-greedy loops  \ non-greedy loops
   
Line 216 
Line 220 
 : +} ( addr addr' -- addr' ) \ regexp-pattern  : +} ( addr addr' -- addr' ) \ regexp-pattern
     \G end of non-greedy one-or-more pattern      \G end of non-greedy one-or-more pattern
     ]] dup FORK BUT  IF  drop true  ;S [[      ]] dup FORK BUT  IF  drop true  ;S [[
     DONE, ]] drop false  ;S  THEN *} [[ ; immediate      DONE, ]] drop false  ;S [[ BEGIN, ]] THEN *} [[ ; immediate
   
 : // ( -- ) \ regexp-pattern  : // ( -- ) \ regexp-pattern
     \G search for string      \G search for string
Line 227 
Line 231 
 \ idea: try to match one alternative and then the rest of regexp.  \ idea: try to match one alternative and then the rest of regexp.
 \ if that fails, jump back to second alternative  \ if that fails, jump back to second alternative
   
 : JOINs ( sys -- )  BEGIN  dup  WHILE  ]] JOIN [[  REPEAT  drop ;  : THENs ( sys -- )  BEGIN  dup  WHILE  ]] THEN [[  REPEAT  drop ;
   
 : {{ ( addr -- addr addr ) \ regexp-pattern  : {{ ( addr -- addr addr ) \ regexp-pattern
     \G Start of alternatives      \G Start of alternatives
     0 ]] dup BEGIN [[  vars @ ; immediate      0 ]] dup FORK  IF  drop true ;S  BUT  JOIN [[ vars @ ; immediate
 : || ( addr addr -- addr addr ) \ regexp-pattern  : || ( addr addr -- addr addr ) \ regexp-pattern
     \G separator between alternatives      \G separator between alternatives
     vars @ varsmax @ max varsmax !      vars @ varsmax @ max varsmax !  vars !
     ]] dup FORK  IF  2drop true  ;S THEN  drop dup [[ >r >r >r vars !      ]] AHEAD  BUT  THEN  [[
     ]] DONE drop dup [[ r> r> r> ]] BEGIN [[ vars @ ; immediate      ]] dup FORK  IF  drop true ;S  BUT  JOIN [[ vars @ ; immediate
 : }} ( addr addr -- addr addr ) \ regexp-pattern  : }} ( addr addr -- addr ) \ regexp-pattern
     \G end of alternatives      \G end of alternatives
     vars @ varsmax @ max vars !      vars @ varsmax @ max vars !  drop
     ]] dup FORK  IF  2drop true  ;S THEN  drop dup [[ >r >r >r drop      ]] AHEAD  BUT  THEN  drop false ;S [[  THENs ; immediate
     ]] DONE drop LEAVE [[ r> r> r> JOINs ; immediate  
   
 \ match variables  \ match variables
   


Generate output suitable for use with a patch program
Legend:
Removed from v.1.20  
changed lines
  Added in v.1.30

CVS Admin

Powered by ViewCVS 1.0-dev
(Powered by ViewCVS)

ViewCVS and CVS Help