aboutsummaryrefslogtreecommitdiffstats
path: root/sprit.cpp
blob: 3da1423d1d1d3d7f7fb518b4b3e30ca57ec6bd02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <algorithm>
#include <iostream>
#include <string>

#include "core.hpp"
#include "parse.hpp"
#include "state.hpp"
#include "types.hpp"

// TODO:
// sys m* _/ _% _' depth _rdepth _in _ev find _uma u< um/mod

static void peek()           { *SP = *(Cell *)(*SP); }
static void commaSP()        { comma(*SP--); }
static void push(Cell value) { *++SP = value; }
static void pop()            { --SP; }
static void tobool()         { if (*SP) *SP = -1; }

constinit WordSet words (
    Word("[",         WordWrap<[] { STATE = 0; }>()).markImmediate(),
    Word("]",         WordWrap<[] { STATE = -1; }>()),
    Word("@",         WordWrap<peek>()),
    Word("c@",        WordWrap<peek, [] { *SP &= 0xFF; }>()),
    Word("!",         WordWrap<[] { auto a = (Cell *)*SP--; *a = *SP--; }>()),
    Word("c!",        WordWrap<[] { auto a = (char *)*SP--; *a = *SP--; }>()),
    Word("_d",        WordWrap<[] { *SP += (Cell)DICT.data(); }>()),
    Word("_jmp",      WordWrap<[] { jump((FuncList)*++IP); }>()),
    Word("_jmp0",     WordWrap<[] {
        ++IP;
        if (*SP-- == 0)
            jump((FuncList)*IP);
    }>()),
    Word(",",         WordWrap<commaSP>()),
    Word("emit",      WordWrap<[] { std::putchar(*SP); }, pop>()),
    Word("key",       WordWrap<[] { push(key()); }>()),
    Word("key?",      WordWrap<[] { push(haskey()); }, tobool>()),
    Word("execute",   WordWrap<[] { executor((FuncList *)*SP--); }>()),
    Word(":",         WordWrap<colon>()),
    Word(";",         WordWrap<semic>()).markImmediate(),
    Word("exit",      fexit),
    Word("drop",      WordWrap<pop>()),
    Word("dup",       WordWrap<[] { push(*SP); }>()),
    Word("swap",      WordWrap<[] { std::swap(*SP, *(SP - 1)); }>()),
    Word("pick",      WordWrap<[] { auto t = *(SP - *SP - 1); *SP = t; }>()),
    Word("cells",     WordWrap<[] { *SP *= sizeof(Cell); }>()),
    Word("+",         WordWrap<[] { *(SP - 1) += *SP; }, pop>()),
    Word("-",         WordWrap<[] { *(SP - 1) -= *SP; }, pop>()),
    Word("*",         WordWrap<[] { *(SP - 1) *= *SP; }, pop>()),
    Word("/",         WordWrap<[] { *(SP - 1) /= *SP; }, pop>()),
    Word("mod",       WordWrap<[] { *(SP - 1) %= *SP; }, pop>()),
    Word("=",         WordWrap<[] { *(SP - 1) = *(SP - 1) == *SP; }, pop, tobool>()),
    Word("<",         WordWrap<[] { *(SP - 1) = *(SP - 1) < *SP; }, pop, tobool>()),
    Word("or",        WordWrap<[] { *(SP - 1) |= *SP; }, pop>()),
    Word("and",       WordWrap<[] { *(SP - 1) &= *SP; }, pop>()),
    Word("xor",       WordWrap<[] { *(SP - 1) ^= *SP; }, pop>()),
    Word("lshift",    WordWrap<[] { *(SP - 1) <<= *SP; }, pop>()),
    Word("rshift",    WordWrap<[] { *(SP - 1) >>= *SP; }, pop>()),
    Word(">r",        WordWrap<[] { *++RP = *SP; }, pop>()),
    Word("r>",        WordWrap<[] { push(*RP--); }>()),
    Word("immediate", WordWrap<[] { ((Word *)LATEST)->markImmediate(); }>()),
    Word("aligned",   WordWrap<[] { *SP = aligned(*SP); }>()),
    Word("align",     WordWrap<align>()),
    Word("literal",   WordWrap<[] { if (STATE) compileliteral(); }>()).markImmediate(),
    Word("\'",        WordWrap<tick>()),
    Word("_i",        WordWrap<[] { *SP = ((Word *)*SP)->immediate(); }, tobool>()),
    Word("[']",       WordWrap<tick, compileliteral>()).markImmediate(),
    Word("compile,",  WordWrap<peek, commaSP>()),
    Word("word",      WordWrap<wordword>()),
    Word("_b",        WordWrap<[] {
        std::putchar('#'); // Gives a good breakpoint spot for gdb
    }>()),
    Word(".",         WordWrap<[] { std::cout << *SP << ' '; }, pop>())
);

void getinput()
{
    std::string line;

    if (std::cin.good()) {
        std::getline(std::cin, line);
        std::for_each(line.rbegin(), line.rend(), addkey);
    }
}

int main()
{
    initialize(words);

    while (std::cin.good()) {
        parse();
        std::cout << (STATE ? "compiled" : "ok") << std::endl;
    }
}