xref: /foundation/ability/idl_tool/parser/lexer.h (revision ca0551cf)
1/*
2 * Copyright (c) 2022 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 <ctype.h>
20#include <memory>
21#include <unordered_map>
22
23#include "parser/token.h"
24#include "util/file.h"
25#include "util/string.h"
26
27namespace OHOS {
28namespace Idl {
29class Lexer {
30public:
31    Lexer();
32
33    ~Lexer();
34
35    bool OpenSourceFile(const String& filePath);
36
37    Token GetToken(bool skipComment = true);
38
39    Token PeekToken(bool skipComment = true);
40
41    bool ReadTokenPeek(bool skipComment, char letter);
42
43    String GetIdentifier() const
44    {
45        return identifier_;
46    }
47
48    String GetComment() const
49    {
50        return comment_;
51    }
52
53    void SkipCurrentLine();
54
55    bool SkipCurrentLine(char untilChar);
56
57    std::shared_ptr<File> GetSourceFile() const
58    {
59        return currentFile_;
60    }
61
62    String DumpToken() const;
63
64    String DumpTokenSecond() const;
65
66    int GetTokenLineNumber() const
67    {
68        return tokenLineNo_;
69    }
70
71    int GetTokenColumnNumber() const
72    {
73        return tokenColumnNo_;
74    }
75
76    static int TokenToChar(Token token);
77
78    bool ParseCacheable(int& cacheTime);
79private:
80    void InitializeKeywords();
81
82    Token ReadToken(bool skipComment);
83
84    Token ReadIdentifier(char c);
85
86    Token ReadLineComment(char c);
87
88    Token ReadBlockComment(char c);
89
90    static bool IsAlphabet(char c)
91    {
92        return isalpha(c);
93    }
94
95    static bool IsDecimalDigital(char c)
96    {
97        return isdigit(c);
98    }
99
100    static bool IsSpace(char c)
101    {
102        return isspace(c);
103    }
104
105    static bool strToInt(const char *str, int strLen, int& number);
106
107    static const char* TAG;
108    std::unordered_map<String, Token, StringHashFunc, StringEqualFunc> keywords_;
109    Token currentToken_ = Token::UNKNOWN;
110    int tokenLineNo_ = 0;
111    int tokenColumnNo_ = 0;
112    String identifier_;
113    String comment_;
114    bool havePeek_ = false;
115    std::shared_ptr<File> currentFile_;
116    std::unordered_map<char, Token> token_map_ = {
117        {'<', Token::ANGLE_BRACKETS_LEFT},
118        {'>', Token::ANGLE_BRACKETS_RIGHT},
119        {'{', Token::BRACES_LEFT},
120        {'}', Token::BRACES_RIGHT},
121        {'[', Token::BRACKETS_LEFT},
122        {']', Token::BRACKETS_RIGHT},
123        {',', Token::COMMA},
124        {'(', Token::PARENTHESES_LEFT},
125        {')', Token::PARENTHESES_RIGHT},
126        {'.', Token::DOT},
127        {';', Token::SEMICOLON},
128    };
129};
130} // namespace Idl
131} // namespace OHOS
132#endif // OHOS_IDL_LEXER_H
133