1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef OHOS_IDL_LEXER_H
17 #define OHOS_IDL_LEXER_H
18 
19 #include <cstdlib>
20 #include <cctype>
21 #include <memory>
22 #include <unordered_map>
23 
24 #include "lexer/token.h"
25 #include "util/file.h"
26 
27 namespace OHOS {
28 namespace Idl {
29 class Lexer {
30 public:
31     enum class ParseMode {
32         DECL_MODE,
33         EXPR_MODE,
34     };
35 
36     Lexer();
37 
38     ~Lexer() = default;
39 
40     bool Reset(const std::string &filePath);
41 
GetFilePath()42     inline std::string GetFilePath() const
43     {
44         return (file_ != nullptr) ? file_->GetPath() : "";
45     }
46 
47     Token PeekToken(bool skipComment = true);
48 
49     Token GetToken(bool skipComment = true);
50 
51     void SkipCurrentLine();
52 
53     bool SkipCurrentLine(char untilChar);
54 
55     void Skip(char untilChar);
56 
57     void SkipToken(TokenType tokenType);
58 
59     void SkipUntilToken(TokenType tokenType);
60 
61     void SkipEof();
62 
SetParseMode(ParseMode mode)63     inline void SetParseMode(ParseMode mode)
64     {
65         mode_ = mode;
66     }
67 
68     bool ReadCacheableTime(Token &token);
69 
70 private:
71     void ReadToken(Token &token, bool skipComment = true);
72 
73     void InitCurToken(Token &token);
74 
75     void ReadId(Token &token);
76 
77     void ReadNum(Token &token);
78 
79     void ReadBinaryNum(Token &token);
80 
81     void ReadOctNum(Token &token);
82 
83     void ReadHexNum(Token &token);
84 
85     void ReadDecNum(Token &token);
86 
87     void ReadNumSuffix(Token &token);
88 
89     void ReadShiftLeftOp(Token &token);
90 
91     void ReadShiftRightOp(Token &token);
92 
93     void ReadPPlusOp(Token &token);
94 
95     void ReadMMinusOp(Token &token);
96 
97     void ReadComment(Token &token);
98 
99     void ReadLineComment(Token &token);
100 
101     void ReadBlockComment(Token &token);
102 
103     void ReadSymbolToken(Token &token);
104 
105 private:
106     std::string filePath_;
107     std::unique_ptr<File> file_;
108 
109     ParseMode mode_;
110     bool havePeek_;
111     Token curToken_;
112 
113 private:
114     using StrTokenTypeMap = std::unordered_map<std::string, TokenType>;
115     static StrTokenTypeMap keyWords_;
116     static StrTokenTypeMap symbols_;
117 };
118 } // namespace Idl
119 } // namespace OHOS
120 
121 #endif // OHOS_IDL_LEXER_H