brewery
notashelf /
b319ef6f3f9fc1123b7cd9c1f5df414e163d674c

nixir

public

Import-resolving Nix IR plugin

Star0tarball
clone
ssh://git@git.notashelf.dev:33/notashelf/nixir.git
src/irc/lexer.hC94 lines1.3 KB
1
#pragma once
2
3
#include <string>
4
#include <vector>
5
6
namespace nix_irc {
7
8
struct Token {
9
  enum Type {
10
    LPAREN,
11
    RPAREN,
12
    LBRACE,
13
    RBRACE,
14
    LBRACKET,
15
    RBRACKET,
16
    IDENT,
17
    STRING,
18
    STRING_INTERP,
19
    INDENTED_STRING,
20
    INDENTED_STRING_INTERP,
21
    PATH,
22
    LOOKUP_PATH,
23
    INT,
24
    FLOAT,
25
    URI,
26
    BOOL,
27
    LET,
28
    IN,
29
    REC,
30
    IF,
31
    THEN,
32
    ELSE,
33
    ASSERT,
34
    WITH,
35
    INHERIT,
36
    IMPORT,
37
    DOT,
38
    SEMICOLON,
39
    COLON,
40
    EQUALS,
41
    AT,
42
    COMMA,
43
    QUESTION,
44
    ELLIPSIS,
45
    // Operators
46
    PLUS,
47
    MINUS,
48
    STAR,
49
    SLASH,
50
    CONCAT,
51
    MERGE,
52
    EQEQ,
53
    NE,
54
    LT,
55
    GT,
56
    LE,
57
    GE,
58
    AND,
59
    OR,
60
    IMPL,
61
    NOT,
62
    EOF_
63
  } type;
64
  std::string value;
65
  size_t line;
66
  size_t col;
67
};
68
69
class Lexer {
70
public:
71
  explicit Lexer(std::string input);
72
  std::vector<Token> tokenize();
73
74
private:
75
  std::vector<Token> tokens;
76
  std::string input;
77
  size_t pos;
78
  size_t line;
79
  size_t col;
80
81
  void emit(const Token& t);
82
  void skip_whitespace();
83
  void tokenize_string();
84
  void tokenize_indented_string();
85
  std::string strip_indentation(const std::string& s);
86
  void tokenize_path();
87
  void tokenize_home_path();
88
  void tokenize_int();
89
  void tokenize_float();
90
  void tokenize_uri();
91
  void tokenize_ident();
92
};
93
94
} // namespace nix_irc