Website Summary Files Commits Branches @commit @diff @stats
path: root / spasm / src / asm / token.hpp
blob: 4ef7ce0f54d9ed3e346021cda74483e5bc438c6a (plain) (blame)
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
#ifndef TOKEN_HPP
#define TOKEN_HPP

#include <string>

#define TOKENS    \
    TOK(push)     \
    TOK(pop)      \
    TOK(dup)      \
    TOK(print)    \
    TOK(read)     \
    TOK(plus)     \
    TOK(minus)    \
    TOK(multiply) \
    TOK(divide)   \
    TOK(modulus)  \
    TOK(gotrue)   \
    TOK(gofalse)  \
    TOK(go)       \
    TOK(call)     \
    TOK(ret)      \
    TOK(load)     \
    TOK(store)    \
    TOK(less)     \
    TOK(lesseq)   \
    TOK(label)    \
    TOK(ident)    \
    TOK(integer)  \
    TOK(xinteger) \
    TOK(endinput)

namespace SpasmImpl
{
namespace ASM
{
namespace Lexer
{
class Token
{
   public:
    enum Token_type
    {
        halt = 0,
#define TOK(x) x,
        TOKENS
#undef TOK
            notused
    };

    Token(Token_type = notused);

    Token(Token_type, size_t, const char* = NULL, const char* = NULL);

    Token_type type() const;

    size_t lineno() const;

    int value_int() const;

    const std::string& value_str() const;

   private:
    Token_type _type;

    size_t _lineno;

    int _value_int;

    std::string _value_str;
};

class TokenStream
{
   public:
    virtual void push_token(const Token&) = 0;
    virtual ~TokenStream(){};
};

}  // namespace Lexer
}  // namespace ASM
}  // namespace SpasmImpl

#undef TOKENS

#endif