case 0:
std::cout << state.pop() << std::endl;
break;
+ case 1:
+ std::cout << static_cast<char>(state.pop()) << std::endl;
+ break;
}
return 0;
} while (r == ParseStatus::Continue);
if (r != ParseStatus::Finished)
- std::cout << "r " << to_string(r) << std::endl;
+ std::cout << to_string(r) << ": " << line << std::endl;
}
void parseFile(Parser& parser, State& state, std::istream& file)
( : variable create 0 , ; )
( : create here const ; )
-: . 0 sys ;
+( set decimal numbers )
+10 0 !
+
+: . 0 sys ;
+: emit 1 sys ;
: over 1 pick ;
: -rot rot rot ;
: nip swap drop ;
: tuck swap over ;
+: +! swap over @ + swap ! ;
+
: 1+ 1 + ;
: 1- 1 - ;
: 0= 0 = ;
: >= < 0= ;
+
+: 2drop drop drop ;
+: 2dup over over ;
+: 2over 3 pick 3 pick ;
+: 2swap rot >r rot r> ;
+
+: and & ;
+: or | ;
+: xor ^ ;
+: lshift << ;
+: rshift >> ;
+
+: , here ! 1 allot ;
+: c! ! ;
+: c, , ;
+: c@ @ ;
+: cell+ 1+ ;
+: cells ;
+: char+ 1+ ;
+: chars ;
+
+: cr 9 emit ;
+: bl 32 ;
+
+: base 0 ;
+: decimal 1 2* base ! 1010 base ! ;
+
class Dictionary
{
public:
- Addr here = 1;
+ Addr here = 1; // address zero will be used for BASE.
Addr latest = 0;
virtual Cell read(Addr) const = 0;
}
} else {
char *p;
- const auto l = static_cast<Cell>(std::strtol(sub.data(), &p, 10));
+ const auto base = state.dict.read(0);
+ const auto l = static_cast<Cell>(std::strtol(sub.data(), &p, base));
if (p != sub.data()) {
if (state.compiling) {