fix bad word detection

llvm
Clyne 2 years ago
parent 24a61f3c99
commit 12cb6b9e56
Signed by: clyne
GPG Key ID: 3267C8EBF3F9AFC7

@ -1,6 +1,9 @@
( : variable create 0 , ; ) ( : variable create 0 , ; )
( : create here const ; ) ( : create here const ; )
: 1+ 1 + ;
: 1- 1 - ;
: ! 2 _! ; : ! 2 _! ;
: @ 2 _@ ; : @ 2 _@ ;
: , here ! 2 allot ; : , here ! 2 allot ;
@ -14,7 +17,7 @@
: chars ; : chars ;
: align here 1 & if 1 allot then ; : align here 1 & if 1 allot then ;
: aligned dup 1 & if 1 + then ; : aligned dup 1 & if 1+ then ;
( set decimal numbers ) ( set decimal numbers )
10 0 ! 10 0 !
@ -38,14 +41,6 @@
: 2* 2 * ; : 2* 2 * ;
: 2/ 2 / ; : 2/ 2 / ;
: 0= 0 = ;
: 0< 0 < ;
: <= 2dup < -rot = and ;
: > <= 0= ;
: 1+ 1 + ;
: 1- 1 - ;
: 2drop drop drop ; : 2drop drop drop ;
: 2dup over over ; : 2dup over over ;
: 2over 3 pick 3 pick ; : 2over 3 pick 3 pick ;
@ -55,6 +50,11 @@
: 2! swap over ! cell+ ! ; : 2! swap over ! cell+ ! ;
: 2@ dup cell+ @ swap @ ; : 2@ dup cell+ @ swap @ ;
: 0= 0 = ;
: 0< 0 < ;
: <= 2dup - 1- 0< ;
: > <= 0= ;
: cr 9 emit ; : cr 9 emit ;
: bl 32 ; : bl 32 ;
: space bl emit ; : space bl emit ;

@ -74,15 +74,16 @@ ParseStatus Parser::parseWord(State& state, Word word)
state.execute(e); state.execute(e);
} }
} else { } else {
char buf[word.size()]; char buf[word.size() + 1];
for (unsigned i = 0; i < word.size(); ++i) for (unsigned i = 0; i < word.size(); ++i)
buf[i] = state.dict.readbyte(word.start + i); buf[i] = state.dict.readbyte(word.start + i);
buf[word.size()] = '\0';
char *p; char *p;
const auto base = state.dict.read(0); const auto base = state.dict.read(0);
const Cell l = std::strtol(buf, &p, base); const Cell l = std::strtol(buf, &p, base);
if (p != buf) { if (std::distance(buf, p) == word.size()) {
if (state.compiling()) { if (state.compiling()) {
state.dict.add(CoreWords::HiddenWordLiteral); state.dict.add(CoreWords::HiddenWordLiteral);
state.dict.add(l); state.dict.add(l);

Loading…
Cancel
Save