1/** 2 * Copyright (c) 2021 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// Autogenerated file -- DO NOT EDIT! 17 18#ifndef ES2PANDA_LEXER_KEYWORDS_H 19#define ES2PANDA_LEXER_KEYWORDS_H 20 21#include "lexer/keywordsBase.h" 22#include "utils/span.h" 23 24// NOLINTBEGIN(readability-identifier-naming) 25 26namespace panda::es2panda::lexer { 27% token_type_prefix = 'TokenType::' 28% Keywords::extensions.each do |extension_name, desc| 29% class_name = extension_name.upcase + 'Keywords' 30class <%=class_name%> : public Keywords { 31public: 32 explicit <%=class_name%>(Lexer* lexer, lexer::NextTokenFlags flags) : Keywords(lexer, flags) {} 33 NO_COPY_SEMANTIC(<%=class_name%>); 34 NO_MOVE_SEMANTIC(<%=class_name%>); 35 ~<%=class_name%>() = default; 36 37 Span<const KeywordString> KeywordMap(char32_t cp) const override { 38 switch(cp) { 39% desc['keyword_starts'].each do |cp| 40 case '<%= cp %>': return Span<const KeywordString>(KEYWORDS_<%= cp %>); 41% end 42 default: return Span<const KeywordString>(); 43 } 44 } 45 46 void ScanKeyword(char32_t cp) override { 47 ASSERT(cp >= 'a' && cp <= 'z'); 48 switch(cp) { 49% desc['all_word_starts'].each do |cp| 50 case '<%=cp%>': Scan_<%=cp%>(); break; 51% end 52 default: Util().ScanIdContinue(); break; 53 } 54 } 55 56 void HandlePotentialEscapedKeyword(const KeywordString& kws) const override { 57 switch(kws.GetTokenType()) { 58% desc['all_words'].select { |kw| kw&.custom_handler&.include? extension_name}.each do |kw| 59 case <%=token_type_prefix + kw.token %>: Util().SetKeyword(Handle_<%=kw.name %>(Util(), "<%=kw.name %>", <%=token_type_prefix + kw.token %>)); return; 60% end 61 default: if (Util().KeywordToIdent()) { 62 return; 63 } 64 } 65 66 Util().ThrowEscapedKeyword(); 67 } 68 69% desc['all_words'].select { |kw| kw&.custom_handler&.include? extension_name}.each do |kw| 70 // NOLINTNEXTLINE(readability-identifier-naming) 71 static KeywordString Handle_<%= kw.name%>(const KeywordsUtil& util, std::string_view src, TokenType tokenType); 72% end 73 74private: 75% desc['keyword_starts'].each do |cp| 76% kws = desc['keywords'].select { |kw| kw.name[0] == cp } 77 static constexpr std::array<const KeywordString, <%= kws.size %>> KEYWORDS_<%= cp %> = {{ 78% kws.each do |kw| 79 {"<%= kw.name%>", <%= token_type_prefix + kw.token %>}, 80% end 81 }}; 82% end 83 84% desc['tree'].each do |key, prefixes| 85 inline void Scan_<%= key %>() 86 { 87 switch(Util().Iterator().Peek()) { 88% prefixes.select{|p| !p.nil? }.each do |prefix| 89 case '<%=prefix%>': { 90 Util().Iterator().Forward(1); 91 Scan_<%= key%><%= prefix %>(); 92 return; 93 } 94% end 95% if prefixes.include?(nil) 96 default: { 97 if (!KeywordsUtil::IsIdentifierPart(Util().Iterator().PeekCp())) { 98% kw_desc = desc['all_words'].find{ |x| x.name == key } 99% if kw_desc&.custom_handler&.include? extension_name 100 SetKeyword<Handle_<%=key%>>({"<%=key%>", <%= token_type_prefix + kw_desc.token%>}); 101% else 102% token_type =kw_desc.token 103% if kw_desc&.keyword_like&.include? extension_name 104% token_type = 'LITERAL_IDENT' 105% end 106 SetKeyword({"<%=key%>", <%=token_type_prefix + token_type%>, <%=token_type_prefix + kw_desc.token%>}); 107% end 108 return; 109 } 110 break; 111 } 112 } 113% else 114 default: { 115 break; 116 } 117 } 118% end 119% if desc['keyword_starts'].include?(key[0]) 120 Util().ScanIdContinueMaybeKeyword(this, Span<const KeywordString>(KEYWORDS_<%= key[0] %>)); 121% else 122 Util().ScanIdContinue(); 123% end 124 } 125 126% end 127}; 128% end 129} // namespace panda::es2panda::lexer 130 131// NOLINTEND(readability-identifier-naming) 132 133#endif 134