summaryrefslogtreecommitdiff
path: root/src/wast-lexer.h
blob: 985fb8b5408ab1e3137adeae3acfc41160106463 (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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
 * Copyright 2016 WebAssembly Community Group participants
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef WABT_WAST_LEXER_H_
#define WABT_WAST_LEXER_H_

#include <cstddef>
#include <cstdio>
#include <memory>

#include "src/common.h"
#include "src/lexer-source-line-finder.h"
#include "src/literal.h"
#include "src/make-unique.h"
#include "src/opcode.h"
#include "src/token.h"

namespace wabt {

class ErrorHandler;
class LexerSource;
class WastParser;

class WastLexer {
 public:
  WABT_DISALLOW_COPY_AND_ASSIGN(WastLexer);

  WastLexer(std::unique_ptr<LexerSource> source, string_view filename);

  // Convenience functions.
  static std::unique_ptr<WastLexer> CreateBufferLexer(string_view filename,
                                                      const void* data,
                                                      size_t size);

  Token GetToken(WastParser* parser);

  // TODO(binji): Move this out of the lexer.
  std::unique_ptr<LexerSourceLineFinder> MakeLineFinder() {
    return MakeUnique<LexerSourceLineFinder>(source_->Clone());
  }

 private:
  static const int kEof = -1;
  enum class CharClass { Reserved = 1, Keyword = 2, HexDigit = 4, Digit = 8 };

  Location GetLocation();
  string_view GetText(size_t offset = 0);

  Token BareToken(TokenType);
  Token LiteralToken(TokenType, LiteralType);
  Token TextToken(TokenType, size_t offset = 0);

  int PeekChar();
  int ReadChar();
  bool MatchChar(char);
  bool MatchString(string_view);
  void Newline();
  bool ReadBlockComment(WastParser*);  // Returns false if EOF.
  bool ReadLineComment();              // Returns false if EOF.
  void ReadWhitespace();

  static bool IsCharClass(int c, CharClass);
  static bool IsDigit(int c) { return IsCharClass(c, CharClass::Digit); }
  static bool IsHexDigit(int c) { return IsCharClass(c, CharClass::HexDigit); }
  static bool IsKeyword(int c) { return IsCharClass(c, CharClass::Keyword); }
  static bool IsReserved(int c) { return IsCharClass(c, CharClass::Reserved); }

  bool ReadNum();
  bool ReadHexNum();
  int ReadReservedChars();
  bool NoTrailingReservedChars() { return ReadReservedChars() == 0; }
  void ReadSign();
  Token GetStringToken(WastParser*);
  Token GetNumberToken(TokenType);
  Token GetHexNumberToken(TokenType);
  Token GetInfToken();
  Token GetNanToken();
  Token GetNameEqNumToken(string_view name, TokenType);
  Token GetIdToken();
  Token GetKeywordToken();
  Token GetReservedToken();

  std::unique_ptr<LexerSource> source_;
  std::string filename_;
  int line_;
  const char* buffer_;
  const char* buffer_end_;
  const char* line_start_;
  const char* token_start_;
  const char* cursor_;
};

}  // namespace wabt

#endif /* WABT_WAST_LEXER_H_ */