Remove unused lexer code.
R=rudominer@chromium.org, rudominer
BUG=
Review URL: https://codereview.chromium.org/1432613003 .
diff --git a/mojom/BUILD.gn b/mojom/BUILD.gn
index 0d04cf3..9ef24cb 100644
--- a/mojom/BUILD.gn
+++ b/mojom/BUILD.gn
@@ -6,41 +6,9 @@
group("mojom") {
testonly = true
- deps = [
- ":tests",
- ]
if (is_linux && defined(go_build_tool) && go_build_tool != "") {
- deps += [ "//mojom/mojom_parser" ]
+ deps = [
+ "//mojom/mojom_parser",
+ ]
}
}
-
-group("tests") {
- testonly = true
- deps = [
- ":lexer_unittest",
- ]
-}
-
-test("lexer_unittest") {
- sources = [
- "lexer_unittest.cc",
- ]
-
- deps = [
- "//base",
- "//base/test:run_all_unittests",
- "//testing/gtest",
- ":lexer",
- ]
-}
-
-source_set("lexer") {
- sources = [
- "lexer.cc",
- "lexer.h",
- ]
-
- deps = [
- "//base",
- ]
-}
diff --git a/mojom/lexer.cc b/mojom/lexer.cc
deleted file mode 100644
index e55e2fb..0000000
--- a/mojom/lexer.cc
+++ /dev/null
@@ -1,420 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojom/lexer.h"
-
-#include <map>
-#include <string>
-
-#include "base/lazy_instance.h"
-
-namespace mojo {
-namespace mojom {
-
-namespace {
-
-class KeywordsDict {
- public:
- KeywordsDict();
-
- private:
- std::map<std::string, mojom::TokenType> keywords_;
- friend std::map<std::string, mojom::TokenType>& Keywords();
-
- DISALLOW_COPY_AND_ASSIGN(KeywordsDict);
-};
-static base::LazyInstance<KeywordsDict> g_keywords = LAZY_INSTANCE_INITIALIZER;
-
-std::map<std::string, mojom::TokenType>& Keywords() {
- return g_keywords.Get().keywords_;
-}
-
-KeywordsDict::KeywordsDict() {
- keywords_["import"] = TokenType::IMPORT;
- keywords_["module"] = TokenType::MODULE;
- keywords_["struct"] = TokenType::STRUCT;
- keywords_["union"] = TokenType::UNION;
- keywords_["interface"] = TokenType::INTERFACE;
- keywords_["enum"] = TokenType::ENUM;
- keywords_["const"] = TokenType::CONST;
- keywords_["true"] = TokenType::TRUE;
- keywords_["false"] = TokenType::FALSE;
- keywords_["default"] = TokenType::DEFAULT;
-}
-
-// Non-localized versions of isalpha.
-bool IsAlpha(char c) {
- return (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'));
-}
-
-// Non-localized versions of isnum.
-bool IsDigit(char c) {
- return ('0' <= c && c <= '9');
-}
-
-bool IsHexDigit(char c) {
- return (IsDigit(c) || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F'));
-}
-
-// Non-localized versions of isalnum.
-bool IsAlnum(char c) {
- return IsAlpha(c) || IsDigit(c);
-}
-
-// MojomLexer tokenizes a mojom source file. It is NOT thread-safe.
-class MojomLexer {
- public:
- explicit MojomLexer(const std::string& source);
- ~MojomLexer();
-
- // Returns the list of tokens in the source file.
- std::vector<Token> Tokenize();
-
- private:
- // The GetNextToken.* functions all return true if they could find a token
- // (even an error token) and false otherwise.
- bool GetNextToken(Token* result);
- bool GetNextTokenSingleChar(Token* result);
- bool GetNextTokenEqualsOrResponse(Token* result);
- bool GetNextTokenIdentifier(Token* result);
- bool GetNextTokenDecConst(Token* result);
- bool GetNextTokenHexConst(Token* result);
- bool GetNextTokenOrdinal(Token* result);
- bool GetNextTokenStringLiteral(Token* result);
-
- void ConsumeSkippable();
- void ConsumeDigits();
- void ConsumeEol();
- void Consume(size_t num);
-
- bool eos(size_t offset_plus) {
- return offset_ + offset_plus >= source_.size();
- }
-
- const std::string source_;
- size_t offset_;
- size_t line_no_;
- size_t offset_in_line_;
-
- DISALLOW_COPY_AND_ASSIGN(MojomLexer);
-};
-
-std::vector<Token> MojomLexer::Tokenize() {
- offset_ = 0;
- line_no_ = 0;
- offset_in_line_ = 0;
-
- std::vector<Token> result;
- Token cur;
- while (GetNextToken(&cur)) {
- result.push_back(cur);
-
- // As soon as an error token is found, stop tokenizing.
- if (cur.error()) {
- break;
- }
- }
-
- return result;
-}
-
-bool MojomLexer::GetNextToken(Token* result) {
- // Skip all spaces which may be in front of the next token.
- ConsumeSkippable();
-
- // If we found the end of the source signal that is so.
- if (eos(0))
- return false;
-
- // Save the current position in the source code.
- result->char_pos = offset_;
- result->line_no = line_no_;
- result->line_pos = offset_in_line_;
-
- if (GetNextTokenSingleChar(result) || GetNextTokenEqualsOrResponse(result) ||
- GetNextTokenIdentifier(result) || GetNextTokenHexConst(result) ||
- GetNextTokenDecConst(result) || GetNextTokenDecConst(result) ||
- GetNextTokenOrdinal(result) || GetNextTokenStringLiteral(result))
- return true;
-
- result->token = source_.substr(offset_, 1);
- result->token_type = TokenType::ERROR_ILLEGAL_CHAR;
- return true;
-}
-
-void MojomLexer::ConsumeSkippable() {
- if (eos(0))
- return;
-
- bool found_non_space = false;
- while (!found_non_space && !eos(0)) {
- switch (source_[offset_]) {
- case ' ':
- case '\t':
- case '\r':
- Consume(1);
- break;
- case '\n':
- ConsumeEol();
- break;
- default:
- found_non_space = true;
- break;
- }
- }
-}
-
-// Finds all single-character tokens except for '='.
-bool MojomLexer::GetNextTokenSingleChar(Token* result) {
- switch (source_[offset_]) {
- case '(':
- result->token_type = TokenType::LPAREN;
- break;
- case ')':
- result->token_type = TokenType::RPAREN;
- break;
- case '[':
- result->token_type = TokenType::LBRACKET;
- break;
- case ']':
- result->token_type = TokenType::RBRACKET;
- break;
- case '{':
- result->token_type = TokenType::LBRACE;
- break;
- case '}':
- result->token_type = TokenType::RBRACE;
- break;
- case '<':
- result->token_type = TokenType::LANGLE;
- break;
- case '>':
- result->token_type = TokenType::RANGLE;
- break;
- case ';':
- result->token_type = TokenType::SEMI;
- break;
- case ',':
- result->token_type = TokenType::COMMA;
- break;
- case '.':
- result->token_type = TokenType::DOT;
- break;
- case '-':
- result->token_type = TokenType::MINUS;
- break;
- case '+':
- result->token_type = TokenType::PLUS;
- break;
- case '&':
- result->token_type = TokenType::AMP;
- break;
- case '?':
- result->token_type = TokenType::QSTN;
- break;
- default:
- return false;
- break;
- }
-
- result->token = source_.substr(offset_, 1);
- Consume(1);
- return true;
-}
-
-// Finds '=' or '=>'.
-bool MojomLexer::GetNextTokenEqualsOrResponse(Token* result) {
- if (source_[offset_] != '=')
- return false;
- Consume(1);
-
- if (eos(0) || source_[offset_] != '>') {
- result->token_type = TokenType::EQUALS;
- result->token = "=";
- } else {
- result->token_type = TokenType::RESPONSE;
- result->token = "=>";
- Consume(1);
- }
- return true;
-}
-
-// valid C identifiers (K&R2: A.2.3)
-bool MojomLexer::GetNextTokenIdentifier(Token* result) {
- char c = source_[offset_];
-
- // Identifiers start with a letter or underscore.
- if (!(IsAlpha(c) || c == '_'))
- return false;
- size_t start_offset = offset_;
-
- // Identifiers contain letters numbers and underscores.
- while (!eos(0) && (IsAlnum(source_[offset_]) || c == '_'))
- Consume(1);
-
- result->token = source_.substr(start_offset, offset_ - start_offset);
- result->token_type = TokenType::IDENTIFIER;
-
- if (Keywords().count(result->token))
- result->token_type = Keywords()[result->token];
-
- return true;
-}
-
-// integer constants (K&R2: A.2.5.1) dec
-// floating constants (K&R2: A.2.5.3)
-bool MojomLexer::GetNextTokenDecConst(Token* result) {
- if (!IsDigit(source_[offset_]))
- return false;
-
- result->token_type = TokenType::INT_CONST_DEC;
- // If the number starts with a zero and is not a floating point number.
- if (source_[offset_] == '0' &&
- (eos(1) || (source_[offset_] == 'e' && source_[offset_] == 'E' &&
- source_[offset_] == '.'))) {
- // TODO(azani): Catch and error on octal.
- result->token = "0";
- Consume(1);
- return true;
- }
-
- size_t start_offset = offset_;
-
- // First, we consume all the digits.
- ConsumeDigits();
-
- // If there is a fractional part, we consume the . and the following digits.
- if (!eos(0) && source_[offset_] == '.') {
- result->token_type = TokenType::FLOAT_CONST;
- Consume(1);
- ConsumeDigits();
- }
-
- // If there is an exponential part, we consume the e and the following digits.
- if (!eos(0) && (source_[offset_] == 'e' || source_[offset_] == 'E')) {
- if (!eos(2) && (source_[offset_ + 1] == '-' || source_[offset_ + 1]) &&
- IsDigit(source_[offset_ + 2])) {
- result->token_type = TokenType::FLOAT_CONST;
- Consume(2); // Consume e/E and +/-
- ConsumeDigits();
- } else if (!eos(1) && IsDigit(source_[offset_ + 1])) {
- result->token_type = TokenType::FLOAT_CONST;
- Consume(1); // Consume e/E
- ConsumeDigits();
- }
- }
-
- result->token = source_.substr(start_offset, offset_ - start_offset);
- return true;
-}
-
-// integer constants (K&R2: A.2.5.1) hex
-bool MojomLexer::GetNextTokenHexConst(Token* result) {
- // Hex numbers start with a 0, x and then some hex numeral.
- if (eos(2) || source_[offset_] != '0' ||
- (source_[offset_ + 1] != 'x' && source_[offset_ + 1] != 'X') ||
- !IsHexDigit(source_[offset_ + 2]))
- return false;
-
- result->token_type = TokenType::INT_CONST_HEX;
- size_t start_offset = offset_;
- Consume(2);
-
- while (IsHexDigit(source_[offset_]))
- Consume(1);
-
- result->token = source_.substr(start_offset, offset_ - start_offset);
- return true;
-}
-
-bool MojomLexer::GetNextTokenOrdinal(Token* result) {
- // Ordinals start with '@' and then some digit.
- if (eos(1) || source_[offset_] != '@' || !IsDigit(source_[offset_ + 1]))
- return false;
- size_t start_offset = offset_;
- // Consumes '@'.
- Consume(1);
-
- result->token_type = TokenType::ORDINAL;
- ConsumeDigits();
-
- result->token = source_.substr(start_offset, offset_ - start_offset);
- return true;
-}
-
-bool MojomLexer::GetNextTokenStringLiteral(Token* result) {
- // Ordinals start with '@' and then some digit.
- if (source_[offset_] != '"')
- return false;
-
- size_t start_offset = offset_;
- // Consumes '"'.
- Consume(1);
-
- while (source_[offset_] != '"') {
- if (source_[offset_] == '\n' || eos(0)) {
- result->token_type = TokenType::ERROR_UNTERMINATED_STRING_LITERAL;
- result->token = source_.substr(start_offset, offset_ - start_offset);
- return true;
- }
-
- // This block will be skipped if the backslash is at the end of the source.
- if (source_[offset_] == '\\' && !eos(1)) {
- // Consume the backslash. This will ensure \" is consumed.
- Consume(1);
- }
- Consume(1);
- }
- // Consume the closing doublequotes.
- Consume(1);
-
- result->token_type = TokenType::STRING_LITERAL;
-
- result->token = source_.substr(start_offset, offset_ - start_offset);
- return true;
-}
-
-void MojomLexer::ConsumeDigits() {
- while (!eos(0) && IsDigit(source_[offset_]))
- Consume(1);
-}
-
-void MojomLexer::ConsumeEol() {
- ++offset_;
- ++line_no_;
- offset_in_line_ = 0;
-}
-
-void MojomLexer::Consume(size_t num) {
- offset_ += num;
- offset_in_line_ += num;
-}
-
-MojomLexer::MojomLexer(const std::string& source)
- : source_(source), offset_(0), line_no_(0), offset_in_line_(0) {
-}
-
-MojomLexer::~MojomLexer() {
-}
-
-} // namespace
-
-Token::Token()
- : token_type(TokenType::ERROR_UNKNOWN),
- char_pos(0),
- line_no(0),
- line_pos(0) {
-}
-
-Token::~Token() {
-}
-
-// Accepts the text of a mojom file and returns the ordered list of tokens
-// found in the file.
-std::vector<Token> Tokenize(const std::string& source) {
- return MojomLexer(source).Tokenize();
-}
-
-} // namespace mojom
-} // namespace mojo
diff --git a/mojom/lexer.h b/mojom/lexer.h
deleted file mode 100644
index b477a37..0000000
--- a/mojom/lexer.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_TOOLS_BINDINGS_MOJOM_CPP_LEXER_H_
-#define MOJO_PUBLIC_TOOLS_BINDINGS_MOJOM_CPP_LEXER_H_
-
-#include <cstddef>
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-
-namespace mojo {
-namespace mojom {
-
-enum class TokenType {
- // Errors
- ERROR_UNKNOWN,
- ERROR_ILLEGAL_CHAR,
- ERROR_UNTERMINATED_STRING_LITERAL,
-
- // Punctuators and Separators
- LPAREN,
- RPAREN,
- LBRACKET,
- RBRACKET,
- LBRACE,
- RBRACE,
- LANGLE,
- RANGLE,
- SEMI,
- COMMA,
- DOT,
- MINUS,
- PLUS,
- AMP,
- QSTN,
- EQUALS,
- RESPONSE,
-
- // Identifiers
- IDENTIFIER,
-
- // Keywords
- IMPORT,
- MODULE,
- STRUCT,
- UNION,
- INTERFACE,
- ENUM,
- CONST,
- TRUE,
- FALSE,
- DEFAULT,
-
- // Constants
- INT_CONST_DEC,
- INT_CONST_HEX,
- FLOAT_CONST,
- ORDINAL,
- STRING_LITERAL,
-
- // TODO(azani): Check that all tokens were implemented.
- // TODO(azani): Error out on octal.
-};
-
-struct Token {
- Token();
- ~Token();
-
- bool error() const {
- return (token_type == TokenType::ERROR_ILLEGAL_CHAR ||
- token_type == TokenType::ERROR_UNTERMINATED_STRING_LITERAL ||
- token_type == TokenType::ERROR_UNKNOWN);
- }
-
- TokenType token_type;
- std::string token;
- size_t char_pos;
- size_t line_no;
- size_t line_pos;
-};
-
-// Accepts the text of a mojom file and returns the ordered list of tokens
-// found in the file.
-std::vector<Token> Tokenize(const std::string& source);
-
-} // namespace mojom
-} // namespace mojo
-
-#endif // MOJO_PUBLIC_TOOLS_BINDINGS_MOJOM_CPP_LEXER_H_
diff --git a/mojom/lexer_unittest.cc b/mojom/lexer_unittest.cc
deleted file mode 100644
index f4db79a..0000000
--- a/mojom/lexer_unittest.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/logging.h"
-#include "mojom/lexer.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace mojom {
-namespace {
-
-TEST(LexerTest, AllNonErrorTokens) {
- const struct TestData {
- const char* name;
- const char* source;
- mojom::TokenType expected_token;
- } test_data[] = {
- {"LPAREN", "(", mojom::TokenType::LPAREN},
- {"RPAREN", ")", mojom::TokenType::RPAREN},
- {"LBRACKET", "[", mojom::TokenType::LBRACKET},
- {"RBRACKET", "]", mojom::TokenType::RBRACKET},
- {"LBRACE", "{", mojom::TokenType::LBRACE},
- {"RBRACE", "}", mojom::TokenType::RBRACE},
- {"LANGLE", "<", mojom::TokenType::LANGLE},
- {"RANGLE", ">", mojom::TokenType::RANGLE},
- {"SEMI", ";", mojom::TokenType::SEMI},
- {"COMMA", ",", mojom::TokenType::COMMA},
- {"DOT", ".", mojom::TokenType::DOT},
- {"MINUS", "-", mojom::TokenType::MINUS},
- {"PLUS", "+", mojom::TokenType::PLUS},
- {"AMP", "&", mojom::TokenType::AMP},
- {"QSTN", "?", mojom::TokenType::QSTN},
- {"EQUALS", "=", mojom::TokenType::EQUALS},
- {"RESPONSE", "=>", mojom::TokenType::RESPONSE},
- {"IDENTIFIER", "something", mojom::TokenType::IDENTIFIER},
- {"IMPORT", "import", mojom::TokenType::IMPORT},
- {"MODULE", "module", mojom::TokenType::MODULE},
- {"STRUCT", "struct", mojom::TokenType::STRUCT},
- {"UNION", "union", mojom::TokenType::UNION},
- {"INTERFACE", "interface", mojom::TokenType::INTERFACE},
- {"ENUM", "enum", mojom::TokenType::ENUM},
- {"CONST", "const", mojom::TokenType::CONST},
- {"TRUE", "true", mojom::TokenType::TRUE},
- {"FALSE", "false", mojom::TokenType::FALSE},
- {"DEFAULT", "default", mojom::TokenType::DEFAULT},
- {"INT_CONST_DEC", "10", mojom::TokenType::INT_CONST_DEC},
- {"INT_CONST_DEC_0", "0", mojom::TokenType::INT_CONST_DEC},
- {"FLOAT_CONST", "10.5", mojom::TokenType::FLOAT_CONST},
- {"FLOAT_CONST_E", "10e5", mojom::TokenType::FLOAT_CONST},
- {"FLOAT_CONST_ZERO", "0.5", mojom::TokenType::FLOAT_CONST},
- {"FLOAT_CONST_E_ZERO", "0e5", mojom::TokenType::FLOAT_CONST},
- {"FLOAT_CONST_E_PLUS", "10e+5", mojom::TokenType::FLOAT_CONST},
- {"FLOAT_CONST_E_MINUS", "10e-5", mojom::TokenType::FLOAT_CONST},
- {"INT_CONST_HEX", "0x10A", mojom::TokenType::INT_CONST_HEX},
- {"ORDINAL", "@10", mojom::TokenType::ORDINAL},
- {"STRING_LITERAL", "\"hello world\"", mojom::TokenType::STRING_LITERAL},
- {"STRING_LITERAL_ESCAPE",
- "\"hello \\\"world\\\"\"",
- mojom::TokenType::STRING_LITERAL},
- {"STRING_LITERAL_HEX_ESCAPE",
- "\"hello \\x23 world\"",
- mojom::TokenType::STRING_LITERAL},
- };
- for (size_t i = 0; i < arraysize(test_data); i++) {
- const char* test_name = test_data[i].name;
- const char* source = test_data[i].source;
- const mojom::TokenType expected_token = test_data[i].expected_token;
- std::vector<mojom::Token> tokens = mojom::Tokenize(source);
- DCHECK(tokens.size() >= 1) << "Failure to tokenize at all: " << test_name;
- const mojom::Token token = tokens[0];
- EXPECT_EQ(expected_token, token.token_type)
- << "Wrong token type: " << test_name;
- EXPECT_EQ(source, token.token) << "Wrong token value: " << test_name;
- }
-}
-
-TEST(LexerTest, TokenPosition) {
- std::string source(" \n .");
- std::vector<mojom::Token> tokens = mojom::Tokenize(source);
- const mojom::Token token = tokens[0];
- EXPECT_EQ(mojom::TokenType::DOT, token.token_type);
- EXPECT_EQ(".", token.token);
- EXPECT_EQ(5U, token.char_pos);
- EXPECT_EQ(1U, token.line_no);
- EXPECT_EQ(2U, token.line_pos);
-}
-
-TEST(LexerTest, ExhaustedTokens) {
- std::string source("");
- std::vector<mojom::Token> tokens = mojom::Tokenize(source);
- EXPECT_EQ(0U, tokens.size());
-}
-
-TEST(LexerTest, SkipSkippable) {
- std::string source(" \t \r \n .");
- std::vector<mojom::Token> tokens = mojom::Tokenize(source);
- const mojom::Token token = tokens[0];
- EXPECT_EQ(mojom::TokenType::DOT, token.token_type);
- EXPECT_EQ(".", token.token);
-}
-
-TEST(LexerTest, SkipToTheEnd) {
- std::string source(" \t \r \n ");
- std::vector<mojom::Token> tokens = mojom::Tokenize(source);
- EXPECT_EQ(0U, tokens.size());
-}
-
-TEST(LexerTest, TokenizeMoreThanOne) {
- std::string source("()");
- std::vector<mojom::Token> tokens = mojom::Tokenize(source);
-
- EXPECT_EQ(mojom::TokenType::LPAREN, tokens[0].token_type);
- EXPECT_EQ(mojom::TokenType::RPAREN, tokens[1].token_type);
- EXPECT_EQ(2U, tokens.size());
-}
-
-TEST(LexerTest, ERROR_ILLEGAL_CHAR) {
- std::string source("#");
- std::vector<mojom::Token> tokens = mojom::Tokenize(source);
- const mojom::Token token = tokens[0];
- EXPECT_EQ(mojom::TokenType::ERROR_ILLEGAL_CHAR, token.token_type);
- EXPECT_EQ("#", token.token);
- EXPECT_TRUE(token.error());
-}
-
-TEST(LexerTest, ERROR_UNTERMINATED_STRING_LITERAL_EOL) {
- std::string source("\"Hello \n World\"");
- std::vector<mojom::Token> tokens = mojom::Tokenize(source);
- const mojom::Token token = tokens[0];
- EXPECT_EQ(mojom::TokenType::ERROR_UNTERMINATED_STRING_LITERAL,
- token.token_type);
- EXPECT_EQ("\"Hello ", token.token);
- EXPECT_EQ(0U, token.char_pos);
- EXPECT_TRUE(token.error());
-}
-
-TEST(LexerTest, ERROR_UNTERMINATED_STRING_LITERAL_EOF) {
- std::string source("\"Hello ");
- std::vector<mojom::Token> tokens = mojom::Tokenize(source);
- const mojom::Token token = tokens[0];
- EXPECT_EQ(mojom::TokenType::ERROR_UNTERMINATED_STRING_LITERAL,
- token.token_type);
- EXPECT_EQ("\"Hello ", token.token);
- EXPECT_EQ(0U, token.char_pos);
- EXPECT_TRUE(token.error());
-}
-
-TEST(LexerTest, ERROR_UNTERMINATED_STRING_LITERAL_ESC_EOF) {
- std::string source("\"Hello \\");
- std::vector<mojom::Token> tokens = mojom::Tokenize(source);
- const mojom::Token token = tokens[0];
- EXPECT_EQ(mojom::TokenType::ERROR_UNTERMINATED_STRING_LITERAL,
- token.token_type);
- EXPECT_EQ("\"Hello \\", token.token);
- EXPECT_EQ(0U, token.char_pos);
- EXPECT_TRUE(token.error());
-}
-
-} // namespace
-} // namespace mojom
-} // namespace mojo