cpp

Coverage Report

Created: 2024-08-25 11:48

/home/andy/git/oilshell/oil/cpp/frontend_match.h
Line
Count
Source
1
// Replacement for frontend/match
2
3
#ifndef MATCH_H
4
#define MATCH_H
5
6
#include "_gen/frontend/id_kind.asdl.h"  // syntax.asdl depends on this
7
#include "mycpp/runtime.h"
8
// Disabled, see hack below
9
// using id_kind_asdl::Id_t;
10
11
#include "_gen/frontend/syntax.asdl.h"
12
#include "_gen/frontend/types.asdl.h"
13
14
namespace match {
15
16
// Horrible hack that is OK because we know there are less than 2^16 Token IDs
17
// uint16_t and int are interchangeable.
18
// These functions will return an int, not uint16_t.  And then
19
// syntax_asdl::Token() stores a uint16_t.
20
typedef int Id_t;
21
22
using types_asdl::lex_mode_t;
23
24
// The big lexer
25
Tuple2<Id_t, int> OneToken(lex_mode_t lex_mode, BigStr* line, int start_pos);
26
27
// There are 5 secondary lexers with matchers of this type
28
typedef void (*MatchFunc)(const unsigned char* line, int line_len,
29
                          int start_pos, int* id, int* end_pos);
30
31
class SimpleLexer {
32
 public:
33
  SimpleLexer(MatchFunc match_func, BigStr* s)
34
6
      : match_func_(match_func), s_(s), pos_(0) {
35
6
  }
36
37
  Tuple2<Id_t, BigStr*> Next();
38
  List<Tuple2<Id_t, BigStr*>*>* Tokens();
39
40
4
  static constexpr ObjHeader obj_header() {
41
4
    return ObjHeader::ClassFixed(field_mask(), sizeof(SimpleLexer));
42
4
  }
43
44
4
  static constexpr uint32_t field_mask() {
45
4
    return maskbit(offsetof(SimpleLexer, s_));
46
4
  }
47
48
 private:
49
  MatchFunc match_func_;
50
  BigStr* s_;
51
  int pos_;
52
};
53
54
//
55
// Secondary Lexers
56
//
57
58
SimpleLexer* BraceRangeLexer(BigStr* s);
59
SimpleLexer* GlobLexer(BigStr* s);
60
SimpleLexer* EchoLexer(BigStr* s);
61
62
List<Tuple2<Id_t, BigStr*>*>* HistoryTokens(BigStr* s);
63
List<Tuple2<Id_t, BigStr*>*>* Ps1Tokens(BigStr* s);
64
65
Id_t BracketUnary(BigStr* s);
66
Id_t BracketBinary(BigStr* s);
67
Id_t BracketOther(BigStr* s);
68
69
Tuple2<Id_t, int> MatchJ8Token(BigStr* s, int pos);
70
Tuple2<Id_t, int> MatchJ8LinesToken(BigStr* s, int pos);
71
Tuple2<Id_t, int> MatchJ8StrToken(BigStr* s, int pos);
72
Tuple2<Id_t, int> MatchJsonStrToken(BigStr* s, int pos);
73
74
//
75
// Other Matching Functions
76
//
77
78
bool IsValidVarName(BigStr* s);
79
bool ShouldHijack(BigStr* s);
80
bool CanOmitQuotes(BigStr* s);
81
bool LooksLikeFloat(BigStr* s);
82
bool LooksLikeInteger(BigStr* s);
83
84
// StringToInt
85
86
int MatchOption(BigStr* s);
87
88
}  // namespace match
89
90
#endif  // MATCH_H