blob: d83e0f5eb43b0e8260d6045de6e3eea350975046 [file] [log] [blame]
%{
// js_keywords.cc is automatically generated from js_keywords.gperf.
// Author: jmarantz@google.com
#include "base/logging.h"
#include "pagespeed/kernel/js/js_keywords.h"
#include "pagespeed/kernel/base/string_util.h"
namespace pagespeed {
%}
%compare-strncmp
%define class-name JsKeywordMapper
%define lookup-function-name Lookup
%define word-array-name kJsKeywordsTable
%global-table
%includes
%language=C++
%readonly-tables
%struct-type
struct JsKeywordMap {
const char* name;
pagespeed::JsKeywords::Type keyword;
pagespeed::JsKeywords::Flag flag;
};
%%
### literals
"false", JsKeywords::kFalse, JsKeywords::kIsValue
"null", JsKeywords::kNull, JsKeywords::kIsValue
"true", JsKeywords::kTrue, JsKeywords::kIsValue
### keywords that can precede regular expressions
"case", JsKeywords::kCase, JsKeywords::kCanPrecedeRegEx
"delete", JsKeywords::kDelete, JsKeywords::kCanPrecedeRegEx
"do", JsKeywords::kDo, JsKeywords::kCanPrecedeRegEx
"in", JsKeywords::kIn, JsKeywords::kCanPrecedeRegEx
"instanceof", JsKeywords::kInstanceof, JsKeywords::kCanPrecedeRegEx
"new", JsKeywords::kNew, JsKeywords::kCanPrecedeRegEx
"return", JsKeywords::kReturn, JsKeywords::kCanPrecedeRegEx
"throw", JsKeywords::kThrow, JsKeywords::kCanPrecedeRegEx
"typeof", JsKeywords::kTypeof, JsKeywords::kCanPrecedeRegEx
"void", JsKeywords::kVoid, JsKeywords::kCanPrecedeRegEx
### keywords that can't precede regular expressions
"break", JsKeywords::kBreak, JsKeywords::kNone
"catch", JsKeywords::kCatch, JsKeywords::kNone
"const", JsKeywords::kConst, JsKeywords::kNone
"continue", JsKeywords::kContinue, JsKeywords::kNone
"debugger", JsKeywords::kDebugger, JsKeywords::kNone
"default", JsKeywords::kDefault, JsKeywords::kNone
"else", JsKeywords::kElse, JsKeywords::kNone
"finally", JsKeywords::kFinally, JsKeywords::kNone
"for", JsKeywords::kFor, JsKeywords::kNone
"function", JsKeywords::kFunction, JsKeywords::kNone
"if", JsKeywords::kIf, JsKeywords::kNone
"switch", JsKeywords::kSwitch, JsKeywords::kNone
"this", JsKeywords::kThis, JsKeywords::kNone
"try", JsKeywords::kTry, JsKeywords::kNone
"while", JsKeywords::kWhile, JsKeywords::kNone
"with", JsKeywords::kWith, JsKeywords::kNone
"var", JsKeywords::kVar, JsKeywords::kNone
### reserved for future use
"class", JsKeywords::kClass, JsKeywords::kIsReservedNonStrict
"enum", JsKeywords::kEnum, JsKeywords::kIsReservedNonStrict
"export", JsKeywords::kExport, JsKeywords::kIsReservedNonStrict
"extends", JsKeywords::kExtends, JsKeywords::kIsReservedNonStrict
"import", JsKeywords::kImport, JsKeywords::kIsReservedNonStrict
"super", JsKeywords::kSuper, JsKeywords::kIsReservedNonStrict
### reserved for future use in strict code
"implements", JsKeywords::kImplements, JsKeywords::kIsReservedStrict
"interface", JsKeywords::kInterface, JsKeywords::kIsReservedStrict
"let", JsKeywords::kLet, JsKeywords::kIsReservedStrict
"package", JsKeywords::kPackage, JsKeywords::kIsReservedStrict
"private", JsKeywords::kPrivate, JsKeywords::kIsReservedStrict
"protected", JsKeywords::kProtected, JsKeywords::kIsReservedStrict
"public", JsKeywords::kPublic, JsKeywords::kIsReservedStrict
"static", JsKeywords::kStatic, JsKeywords::kIsReservedStrict
"yield", JsKeywords::kYield, JsKeywords::kIsReservedStrict
%%
JsKeywords::Type JsKeywords::Lookup(const StringPiece& keyword,
JsKeywords::Flag* flag) {
const JsKeywordMap* keyword_map =
JsKeywordMapper::Lookup(keyword.data(), keyword.size());
if (keyword_map != NULL) {
*flag = keyword_map->flag;
return keyword_map->keyword;
}
return JsKeywords::kNotAKeyword;
}
bool JsKeywords::Iterator::AtEnd() const {
return index_ > MAX_HASH_VALUE;
}
void JsKeywords::Iterator::Next() {
DCHECK(!AtEnd());
++index_;
while (!AtEnd() && (*(kJsKeywordsTable[index_].name) == '\0')) {
++index_;
}
}
const char* JsKeywords::Iterator::name() const {
DCHECK(!AtEnd());
return kJsKeywordsTable[index_].name;
}
JsKeywords::Type JsKeywords::Iterator::keyword() const {
DCHECK(!AtEnd());
return kJsKeywordsTable[index_].keyword;
}
int JsKeywords::num_keywords() {
return TOTAL_KEYWORDS;
}
bool JsKeywords::CanKeywordPrecedeRegEx(const StringPiece& name) {
Flag flag;
Type type = Lookup(name, &flag);
return (IsAKeyword(type) && flag == kCanPrecedeRegEx);
}
} // namespace net_instaweb