| \ 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 dup FORK IF 2drop 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 [[ >r >r >r vars ! |
]] AHEAD BUT THEN drop [[ |
| ]] DONE drop dup [[ r> r> r> ]] BEGIN [[ vars @ ; immediate |
]] dup dup FORK IF 2drop true ;S BUT JOIN [[ vars @ ; immediate |
| : }} ( 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 2drop false ;S [[ THENs ; immediate |
| ]] DONE drop LEAVE ;S [[ r> r> r> JOINs ; immediate |
|
| |
|
| \ match variables |
\ match variables |
| |
|