diff --git a/forth/parse.fs b/forth/parse.fs index f672dbe..7a30342 100644 --- a/forth/parse.fs +++ b/forth/parse.fs @@ -27,7 +27,7 @@ : (parseh) ( a -- n f ) ( '0': ASCII 0x30 'x': 0x78 0x7830: 30768 ) DUP @ 30768 = NOT IF 0 EXIT THEN ( a 0 ) - ( We have "0x" suffix ) + ( We have "0x" prefix ) 2 + ( validate slen ) DUP SLEN ( a l ) @@ -44,9 +44,40 @@ AGAIN ; +( returns negative value on error ) +: bindig ( c -- n ) + ( '0' is ASCII 48 ) + 48 - + DUP 0 < IF EXIT THEN ( bad ) + DUP 2 < IF EXIT THEN ( good ) + ( bad ) + 255 - +; + +: (parseb) ( a -- n f ) + ( '0': ASCII 0x30 'b': 0x62 0x6230: 25136 ) + DUP @ 25136 = NOT IF 0 EXIT THEN ( a 0 ) + ( We have "0b" prefix ) + 2 + + ( validate slen ) + DUP SLEN ( a l ) + DUP 0 = IF DROP 0 EXIT THEN ( a 0 ) + 16 > IF DROP 0 EXIT THEN ( a 0 ) + 0 ( a r ) + BEGIN + OVER C@ + DUP 0 = IF DROP SWAP DROP 1 EXIT THEN ( r, 1 ) + bindig ( a r n ) + DUP 0 < IF DROP DROP 1 EXIT THEN ( a 0 ) + SWAP 2 * + ( a r*2+n ) + SWAP 1 + SWAP ( a+1 r ) + AGAIN +; + : (parse) ( a -- n ) (parsec) NOT SKIP? EXIT (parseh) NOT SKIP? EXIT + (parseb) NOT SKIP? EXIT (parsed) NOT SKIP? EXIT ( nothing works ) ABORT" unknown word! " diff --git a/tests/forth/test_parse.fs b/tests/forth/test_parse.fs new file mode 100644 index 0000000..2e07213 --- /dev/null +++ b/tests/forth/test_parse.fs @@ -0,0 +1,2 @@ +'b' 0x62 #eq +0b1111010101 981 #eq