| // Copyright 2017-2020 The Verible Authors. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| // Unit tests for VerilogLexer (from verilog.lex) | |
| #include "verilog/parser/verilog_lexer.h" | |
| #include <initializer_list> | |
| #include <utility> | |
| #include "absl/strings/string_view.h" | |
| #include "common/lexer/lexer_test_util.h" | |
| #include "common/text/token_info.h" | |
| #include "gmock/gmock.h" | |
| #include "gtest/gtest.h" | |
| #include "verilog/parser/verilog_token_enum.h" | |
| namespace verilog { | |
| namespace { | |
| using testing::ElementsAre; | |
| using verible::TokenInfo; | |
| // Removes non-essential tokens from token output stream, such as spaces. | |
| class FilteredVerilogLexer : public VerilogLexer { | |
| public: | |
| explicit FilteredVerilogLexer(absl::string_view code) : VerilogLexer(code) {} | |
| const TokenInfo& DoNextToken() final { | |
| do { | |
| VerilogLexer::DoNextToken(); | |
| } while (!VerilogLexer::KeepSyntaxTreeTokens(GetLastToken())); | |
| return GetLastToken(); | |
| } | |
| }; | |
| // Some tests work on filtered tokens, others check unfiltered tokens. | |
| // TODO(b/139743437): Upgrade GenericTestDataSequence to LexerTestData. | |
| using verible::GenericTestDataSequence; | |
| using verible::SimpleTestData; | |
| using LexerTestData = verible::SynthesizedLexerTestData; | |
| // Forwarding function to the template test driver function. | |
| template <typename... Args> | |
| static void TestLexer(Args&&... args) { | |
| verible::TestLexer<VerilogLexer>(std::forward<Args>(args)...); | |
| } | |
| // Forwarding function to the template test driver function. | |
| template <typename... Args> | |
| static void TestFilteredLexer(Args&&... args) { | |
| verible::TestLexer<FilteredVerilogLexer>(std::forward<Args>(args)...); | |
| } | |
| static std::initializer_list<LexerTestData> kCommentTests = { | |
| {{TK_COMMENT_BLOCK, "/**/"}}, | |
| {{TK_COMMENT_BLOCK, "/***/"}}, | |
| {{TK_COMMENT_BLOCK, "/* */"}}, | |
| {{TK_COMMENT_BLOCK, "/* foo */"}}, | |
| {{TK_COMMENT_BLOCK, "/* foo\nbar */"}}, | |
| {{TK_EOL_COMMENT, "//"}, {TK_NEWLINE, "\n"}}, | |
| {{TK_EOL_COMMENT, "//"}, {TK_NEWLINE, "\r"}}, | |
| {{TK_EOL_COMMENT, "// foo"}, {TK_NEWLINE, "\n"}}, | |
| {{TK_EOL_COMMENT, "// bar"}, {TK_NEWLINE, "\r"}}, | |
| {{TK_EOL_COMMENT, "//"}}, // missing \n, but treat as if it were there | |
| {{TK_EOL_COMMENT, "//foo"}}, // missing \n, but treat as if it were there | |
| }; | |
| // treating attributes lists as C-style comments, | |
| // except they are not returned as comment blocks. | |
| static std::initializer_list<SimpleTestData> kAttributeTests = { | |
| {"(**)"}, {"(* *)"}, | |
| {"(* x)*)"}, {"(* ** *)"}, | |
| {"(***)"}, {"(** **)"}, | |
| {"(*\n*)"}, {"(* style=flat *)"}, | |
| {"(*foo=bar*)"}, {"(* style=flat, fill=empty *)"}, | |
| }; | |
| static std::initializer_list<LexerTestData> kAttributeSequenceTests = { | |
| {{TK_ATTRIBUTE, "(**)"}, {TK_ATTRIBUTE, "(**)"}}, | |
| {{TK_ATTRIBUTE, "(* style=flat,\nfill=empty *)"}, {TK_NEWLINE, "\n"}}, | |
| {{TK_ATTRIBUTE, "(*garbage\nGARBAGE*)"}, {TK_NEWLINE, "\n"}}, | |
| {{TK_ATTRIBUTE, "(*\ntoken\nsoup\n*)"}, {TK_NEWLINE, "\n"}}, | |
| }; | |
| static std::initializer_list<LexerTestData> kMacroCallTests = { | |
| {{MacroCallId, "`FOO"}, '(', ')'}, | |
| {{MacroCallId, "`FOO1"}, '(', ')', ';'}, | |
| {{MacroCallId, "`FOO2"}, '(', ')'}, | |
| {{MacroCallId, "`FOO3"}, '(', {MacroCallCloseToEndLine, ")"}, "\n"}, | |
| {{MacroCallId, "`FOO4"}, '(', {MacroCallCloseToEndLine, ")"}, "\n", ';'}, | |
| {{MacroCallId, "`FOO5"}, '(', {MacroCallCloseToEndLine, ")"}, " ", "\n"}, | |
| {{MacroCallId, "`FOO5b"}, '(', {MacroCallCloseToEndLine, ")"}, " \n"}, | |
| {{MacroCallId, "`FOO6"}, '(', ')', ';'}, | |
| {{MacroCallId, "`FOO7"}, | |
| '(', | |
| {MacroArg, "BAR"}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO8"}, '(', {MacroArg, "BAR"}, ')'}, | |
| {{MacroCallId, "`FOO9"}, | |
| {TK_SPACE, " "}, | |
| '(', | |
| {MacroArg, "BAR"}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO10"}, " ", '(', {MacroArg, "BAR"}, ')'}, | |
| {{MacroCallId, "`FOO11"}, | |
| " ", | |
| '(', | |
| {MacroArg, "\"bar\""}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO11b"}, | |
| " ", | |
| '(', | |
| {MacroArg, "`\"bar`\""}, // preprocess-evaluated string literal | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO11c"}, | |
| " ", | |
| '(', | |
| {MacroArg, "`\"bar()`\""}, // preprocess-evaluated string literal | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO12"}, | |
| '(', | |
| {MacroArg, "BAR"}, | |
| ',', | |
| {MacroArg, "\"bar\""}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO13"}, | |
| " ", | |
| '(', | |
| {MacroArg, "`BAR"}, | |
| ',', | |
| {MacroArg, "\"bar\""}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO14"}, | |
| " ", | |
| '(', | |
| {MacroArg, "`BAR"}, | |
| ',', | |
| " ", | |
| {MacroArg, "\"bar\""}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO15"}, | |
| '(', | |
| {MacroArg, "`BAR"}, | |
| ',', | |
| " ", | |
| {MacroArg, "\"bar\""}, | |
| ')'}, | |
| // macro arg string literals containing balance characters: | |
| {{MacroCallId, "`FOO16"}, | |
| '(', | |
| {MacroArg, "`BAR"}, | |
| ',', | |
| " ", | |
| {MacroArg, "\"bar([{\""}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| // macro arg string literals containing balance characters: | |
| {{MacroCallId, "`FOO17"}, | |
| '(', | |
| {MacroArg, "`BAR"}, | |
| ',', | |
| " ", | |
| {MacroArg, "\"bar)]}\""}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO18"}, | |
| '(', | |
| {MacroArg, "{1,2,3}"}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO19"}, | |
| '(', | |
| {MacroArg, "BAR()"}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO20"}, | |
| '(', | |
| {MacroArg, "`BAR()"}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO21"}, '(', {MacroArg, "`BAR()"}, ')'}, | |
| {{MacroCallId, "`FOO22"}, | |
| '(', | |
| {MacroArg, "{1,2,3}"}, | |
| ',', | |
| {TK_SPACE, " "}, | |
| {MacroArg, "`BAR()"}, // macro arg without trailing spaces | |
| {TK_SPACE, " "}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO22b"}, | |
| '(', | |
| {MacroArg, "bar"}, | |
| {TK_SPACE, " "}, | |
| ',', | |
| {MacroArg, "none"}, | |
| {TK_SPACE, " "}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO23"}, " ", '(', {MacroArg, "{{{}}((){})}"}, ')'}, | |
| {{MacroCallId, "`FOO24"}, '(', {MacroArg, "{{{}}((){})}"}, ')'}, | |
| {{MacroCallId, "`FOO25"}, | |
| '(', | |
| {MacroArg, "{{{}}((){})}"}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| "\n"}, | |
| {{MacroCallId, "`FOO26"}, " ", '(', {TK_SPACE, " "}, ')'}, | |
| {{MacroCallId, "`FOO27"}, '(', {TK_NEWLINE, "\n"}, ')'}, | |
| {{MacroCallId, "`FOO28"}, " ", '(', {TK_SPACE, "\t"}, ')'}, | |
| {{MacroCallId, "`FOO29"}, '(', {TK_SPACE, " "}, ',', {TK_SPACE, " "}, ')'}, | |
| {{MacroCallId, "`FOO30"}, '(', ',', ')'}, | |
| {{MacroCallId, "`FOO30b"}, '(', ',', {TK_SPACE, " "}, ')'}, | |
| {{MacroCallId, "`FOO31"}, '(', ',', ',', ',', ')'}, | |
| {{MacroCallId, "`FOO32"}, | |
| '(', | |
| " ", | |
| ',', | |
| "\n", | |
| ',', | |
| "\n\n", | |
| ',', | |
| " ", | |
| ')'}, | |
| {{MacroCallId, "`FOO33"}, | |
| '(', | |
| " ", | |
| {MacroArg, "abc"}, | |
| " ", // trailing spaces separated from preceding macro argument | |
| ',', | |
| " ", | |
| ')'}, | |
| {{MacroCallId, "`FOO34"}, | |
| '(', | |
| " ", | |
| ',', | |
| " ", | |
| {MacroArg, "def"}, | |
| " ", | |
| ')'}, | |
| {{MacroCallId, "`FOO35"}, | |
| '(', | |
| " ", | |
| ',', | |
| " ", | |
| {MacroArg, "def"}, | |
| " ", | |
| ',', | |
| " ", | |
| ')'}, | |
| {{MacroCallId, "`FOO36"}, '(', ',', {MacroArg, "def"}, ',', ')'}, | |
| {{MacroIdItem, "`uvm_func_new"}, {TK_NEWLINE, "\n"}}, | |
| {{MacroIdentifier, "`uvm_func_new"}, ';', {TK_NEWLINE, "\n"}}, | |
| {{MacroIdItem, "`uvm_func_new"}, {TK_SPACE, " "}, "\n"}, | |
| {{MacroIdItem, "`uvm_func_new"}, | |
| " ", | |
| {TK_EOL_COMMENT, "// comment"}, | |
| "\n"}, | |
| {{MacroIdItem, "`uvm_func_new"}, | |
| " ", | |
| {TK_COMMENT_BLOCK, "/* comment */"}, | |
| "\n"}, | |
| {{MacroIdItem, "`uvm_func_new"}, | |
| " ", | |
| {TK_COMMENT_BLOCK, "/* comment */"}, | |
| " \n"}, | |
| {{MacroIdItem, "`uvm_func_new"}, | |
| {TK_COMMENT_BLOCK, "/*C*/"}, | |
| {TK_COMMENT_BLOCK, "/*D*/"}, | |
| " ", | |
| {TK_EOL_COMMENT, "//E"}, | |
| "\n"}, | |
| {{MacroIdItem, "`uvm_object_utils_end"}, {TK_NEWLINE, "\n"}}, | |
| {{MacroIdItem, "`uvm_func_new"}, | |
| {TK_NEWLINE, "\n"}, | |
| {MacroIdItem, "`uvm_func_tew"}, | |
| {TK_NEWLINE, "\n"}}, | |
| {{MacroIdentifier, "`uvm_blah"}, | |
| ';', | |
| " ", | |
| {MacroIdItem, "`uvm_blah"}, | |
| "\n"}, | |
| {{MacroIdentifier, "`macro"}, | |
| " ", | |
| '+', | |
| " ", | |
| {MacroIdentifier, "`schmacro"}, | |
| ';'}, | |
| {{MacroIdentifier, "`macro"}, '+', {MacroIdentifier, "`schmacro"}, ';'}, | |
| {{SymbolIdentifier, "lvalue"}, | |
| " ", | |
| '=', | |
| " ", | |
| {MacroIdItem, "`schmacro"}, | |
| "\n"}, | |
| {{SymbolIdentifier, "lvalue"}, '=', {MacroIdItem, "`schmacro"}, "\n"}, | |
| // with escaped identifiers in call args | |
| {{MacroCallId, "`FOO"}, '(', {MacroArg, "\\BAR"}, " ", ')'}, | |
| {{MacroCallId, "`FOO"}, '(', {MacroArg, "\\BAR"}, "\t", ')'}, | |
| {{MacroCallId, "`FOO"}, '(', {MacroArg, "\\BAR"}, "\n", ')'}, | |
| // Comments are lexed together with macro arguments | |
| {{MacroCallId, "`FOO"}, | |
| '(', | |
| "\n", | |
| {MacroArg, "/*comment*/ bar"}, | |
| "\n", | |
| ')'}, | |
| {{MacroCallId, "`FOO"}, | |
| '(', | |
| "\n", | |
| {MacroArg, "bar /*comment*/"}, | |
| "\n", | |
| ')'}, | |
| {{MacroCallId, "`FOO"}, | |
| '(', | |
| "\n", | |
| {MacroArg, "/*\nmulti\nline\n*/ bar"}, | |
| "\n", | |
| ')'}, | |
| {{MacroCallId, "`FOO"}, | |
| '(', | |
| "\n", | |
| {MacroArg, "//comment\n bar"}, | |
| "\n", | |
| ')'}, | |
| {{MacroCallId, "`FOO"}, | |
| '(', | |
| "\n", | |
| {MacroArg, "//multi\n//line\n//comment\n bar"}, | |
| "\n", | |
| ')'}, | |
| { | |
| // fuzzer test case | |
| {MacroCallId, "`g"}, | |
| '(', | |
| {MacroArg, "(\\x\" `g(::\"\n)"}, | |
| ',' // unterminated call, unexpected EOF here | |
| }, | |
| }; | |
| static std::initializer_list<LexerTestData> kUnfilteredMacroCallTests = { | |
| { | |
| {MacroIdItem, "`uvm_func_new"}, | |
| {TK_SPACE, " "}, | |
| {TK_EOL_COMMENT, "// comment"}, | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| {MacroIdItem, "`uvm_func_new"}, | |
| {TK_SPACE, " "}, | |
| {TK_COMMENT_BLOCK, "/* comment */"}, | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| {MacroIdItem, "`uvm_func_new"}, | |
| {TK_SPACE, " "}, | |
| {TK_COMMENT_BLOCK, "/* comment */"}, | |
| {TK_SPACE, " "}, | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| {MacroIdItem, "`uvm_func_new"}, | |
| {TK_COMMENT_BLOCK, "/*C*/"}, | |
| {TK_COMMENT_BLOCK, "/*D*/"}, | |
| {TK_SPACE, " "}, | |
| {TK_EOL_COMMENT, "//E"}, | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| {MacroCallId, "`FOO1"}, | |
| '(', | |
| {TK_SPACE, " "}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| {TK_SPACE, " "}, | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| {MacroCallId, "`FOO2"}, | |
| '(', | |
| {TK_SPACE, " "}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| {TK_SPACE, " "}, | |
| {TK_COMMENT_BLOCK, "/* comment */"}, | |
| {TK_SPACE, " "}, | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| {MacroCallId, "`FOO3"}, | |
| '(', | |
| {MacroCallCloseToEndLine, ")"}, | |
| {TK_SPACE, " "}, | |
| {TK_EOL_COMMENT, "// comment"}, | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| {MacroCallId, "`FOO4"}, | |
| '(', | |
| {MacroCallCloseToEndLine, ")"}, | |
| {TK_SPACE, " "}, | |
| {TK_COMMENT_BLOCK, "/* comment */"}, | |
| {TK_SPACE, " "}, | |
| {TK_EOL_COMMENT, "// comment"}, | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| {MacroCallId, "`FOO5"}, | |
| '(', | |
| {MacroCallCloseToEndLine, ")"}, | |
| {TK_SPACE, " "}, | |
| {TK_COMMENT_BLOCK, "/* comment */"}, | |
| {TK_SPACE, " "}, | |
| {TK_COMMENT_BLOCK, "/* comment */"}, | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| {MacroCallId, "`FOO6"}, | |
| '(', | |
| {MacroArg, "a"}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| {TK_SPACE, " "}, | |
| {TK_EOL_COMMENT, "// comment"}, | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| {MacroCallId, "`FOO7"}, | |
| '(', | |
| {MacroArg, "a"}, | |
| ',', | |
| {MacroArg, "b"}, | |
| {MacroCallCloseToEndLine, ")"}, | |
| {TK_SPACE, " "}, | |
| {TK_EOL_COMMENT, "// comment"}, | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| }; | |
| static std::initializer_list<LexerTestData> kMacroDefineTests = { | |
| {{PP_define, "`define"}, | |
| {TK_SPACE, " "}, | |
| {PP_Identifier, "FOO"}, | |
| {PP_define_body, ""}, | |
| {TK_NEWLINE, "\n"}}, | |
| {{PP_define, "`define"}, | |
| {TK_SPACE, " "}, | |
| {PP_Identifier, "FOO"}, | |
| {PP_define_body, ""}, | |
| {TK_NEWLINE, "\n"}}, | |
| {{PP_define, "`define"}, | |
| {TK_SPACE, " "}, | |
| {PP_Identifier, "FOO"}, | |
| " ", | |
| {PP_define_body, ""}, | |
| {TK_NEWLINE, "\n"}}, | |
| {{PP_define, "`define"}, | |
| {TK_SPACE, "\t"}, | |
| {PP_Identifier, "FOO"}, | |
| {PP_define_body, ""}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| {TK_SPACE, "\t\t"}, | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| ')', | |
| " ", | |
| {PP_define_body, "foo()"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| " ", | |
| {PP_define_body, "12"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| "\t", | |
| {PP_Identifier, "FOO"}, | |
| "\t", | |
| {PP_define_body, "13"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| " ", | |
| {PP_define_body, "\\\n14"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| {PP_define_body, "\\\n"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| {PP_define_body, "\\\n15"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| ')', | |
| " ", | |
| {PP_define_body, "bar()"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| {PP_Identifier, "x"}, | |
| ')', | |
| " ", | |
| {PP_define_body, "bar(x);"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| " ", | |
| {PP_define_body, "\"hello\\world\""}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| {PP_Identifier, "x"}, | |
| ')', | |
| " ", | |
| {PP_define_body, "\"hello\\world\""}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| {PP_Identifier, "y"}, | |
| ')', | |
| " ", | |
| {PP_define_body, "\"hello\\world\"\\\n\"goodbye.\""}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| {PP_Identifier, "x"}, | |
| ',', | |
| " ", | |
| {PP_Identifier, "y"}, | |
| ')', | |
| " ", | |
| {PP_define_body, "$bar(x, y);"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| {PP_Identifier, "x"}, | |
| ',', | |
| " ", | |
| {PP_Identifier, "y"}, | |
| ')', | |
| " ", | |
| {PP_define_body, "\\\n$bar(x, y);"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| {PP_Identifier, "x"}, | |
| ',', | |
| " ", | |
| {PP_Identifier, "y"}, | |
| ',', | |
| " ", | |
| {PP_Identifier, "z"}, | |
| ')', | |
| " ", | |
| {PP_define_body, "\\\n$bar(x, y);\\\nzoo();"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| {PP_Identifier, "y"}, | |
| ',', | |
| " ", | |
| {PP_Identifier, "z"}, | |
| ')', | |
| " ", | |
| {PP_define_body, "\\\nalways look on\\\n\tthe bright side of life"}, | |
| "\n"}, | |
| // 2 definitions: | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| " ", | |
| {PP_define_body, "12"}, | |
| "\n", | |
| {PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "ZOO"}, | |
| '(', | |
| {PP_Identifier, "a"}, | |
| ',', | |
| " ", | |
| {PP_Identifier, "b"}, | |
| ')', | |
| " ", | |
| {PP_define_body, "b - a"}, | |
| "\n"}, | |
| // definition with condition definitions inside body: | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "F"}, | |
| '(', | |
| {PP_Identifier, "z"}, | |
| ')', | |
| {PP_define_body, | |
| "\\\n" | |
| "`ifdef Z \\\n" | |
| "`define X z\\\n" | |
| "`else \\\n" | |
| "`define X 2 \\\n" | |
| "`endif"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "GOOD"}, | |
| " ", | |
| {PP_define_body, "EVIL"}, | |
| "\n", | |
| {TK_static, "static"}, | |
| " ", | |
| {TK_void, "void"}, | |
| " ", | |
| {SymbolIdentifier, "tokens"}, | |
| "\n"}, | |
| // macro parameters with defaults: | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| {PP_Identifier, "x"}, | |
| '=', | |
| {PP_default_text, "88"}, | |
| ',', | |
| " ", | |
| {PP_Identifier, "y"}, | |
| '=', | |
| {PP_default_text, "\"abc\""}, | |
| ')', | |
| " ", | |
| {PP_define_body, "\\\n$bar(y, x);"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| {PP_Identifier, "x"}, | |
| '=', | |
| {PP_default_text, "\"88\""}, | |
| ',', | |
| " ", | |
| {PP_Identifier, "y"}, | |
| '=', | |
| {PP_default_text, "abc"}, | |
| ')', | |
| " ", | |
| {PP_define_body, "\\\n$bar(y, x);"}, | |
| "\n"}, | |
| // macro parameters with defaults, padded with spaces | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| {PP_Identifier, "x"}, | |
| " ", | |
| '=', | |
| {TK_SPACE, " "}, // leading space | |
| {PP_default_text, "88"}, | |
| {TK_SPACE, " "}, // trailing space | |
| ',', | |
| " ", | |
| {PP_Identifier, "y"}, | |
| " ", | |
| '=', | |
| {TK_SPACE, " "}, // leading space | |
| {PP_default_text, "\"abc\""}, | |
| {TK_SPACE, " "}, // trailing space | |
| ')', | |
| " ", | |
| {PP_define_body, "\\\n$bar(y, x);"}, | |
| "\n"}, | |
| // testing parenthesis balancing in PP_default_text | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| {PP_Identifier, "x"}, | |
| '=', | |
| {PP_default_text, "(a,(b,c))"}, | |
| ',', | |
| " ", | |
| {PP_Identifier, "y"}, | |
| " ", | |
| '=', | |
| " ", // leading space | |
| {PP_default_text, "\"non)},{(sense\""}, | |
| " ", // trailing space | |
| ')', | |
| " ", | |
| {PP_define_body, "\\\nbar(y, x);"}, | |
| "\n"}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| '(', | |
| {PP_Identifier, "x"}, | |
| '=', | |
| {PP_default_text, "\"\""}, | |
| ',', | |
| " ", | |
| {PP_Identifier, "y"}, | |
| " ", | |
| '=', | |
| {PP_default_text, "(a,\"bc\")"}, | |
| ')', | |
| " ", | |
| {PP_define_body, "\\\nbar(y, x);"}, | |
| "\n"}, | |
| // no line following continuation: | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "UNFINISHED"}, | |
| " ", | |
| {PP_define_body, "blah + \\"}, | |
| "\n"}, | |
| // multiple blank newlines after empty definition body | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "BAR"}, | |
| {PP_define_body, ""}, | |
| "\n\n\n"}, | |
| // conditional define | |
| {{PP_ifndef, "`ifndef"}, | |
| " ", | |
| {PP_Identifier, "FOO"}, | |
| "\n", | |
| {PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "BAR"}, | |
| {PP_define_body, ""}, | |
| "\n\n", | |
| {PP_endif, "`endif"}, | |
| "\n"}, | |
| { | |
| {PP_define, "`define"}, " ", {PP_Identifier, "UNFINISHED"}, | |
| // No \n before EOF | |
| }, | |
| { | |
| {PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "UNFINISHED"}, | |
| " ", | |
| {PP_define_body, "symphony"}, | |
| // No \n before EOF | |
| }, | |
| { | |
| {PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "UNFINISHED"}, | |
| " ", | |
| {PP_define_body, "symphony \\"}, // end with line continuation | |
| // No \n before EOF | |
| }, | |
| { | |
| {PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "UNFINISHED"}, | |
| " ", | |
| {PP_define_body, "symphony \\\n number"}, | |
| // No \n before EOF | |
| }, | |
| }; | |
| static std::initializer_list<GenericTestDataSequence> kProtectedTests = { | |
| // TODO(b/134180314): lexer current drops tokens from protected sections, | |
| // but instead emit the tokens and filter them out. | |
| {"module foo;\n" | |
| "`protected\n" | |
| "`endprotected\n" | |
| "endmodule\n", | |
| {TK_module, TK_SPACE, SymbolIdentifier, ';', TK_NEWLINE, TK_NEWLINE, | |
| TK_endmodule, TK_NEWLINE}}, | |
| {"abc\n" | |
| "`protected\n" | |
| "(*&^%$#@!!@#$%^&*(a8sayasd\n" | |
| "87y&*H*HYgyGYh@#BH)72361^&*\n" | |
| "`endprotected\n" | |
| "begin\n", | |
| {SymbolIdentifier, TK_NEWLINE, TK_NEWLINE, TK_begin, TK_NEWLINE}}, | |
| {"task bar;\n" | |
| "// pragma protect begin_protected\n" | |
| "// pragma protect end_protected\n" | |
| "endtask\n", | |
| {TK_task, TK_SPACE, SymbolIdentifier, ';', TK_NEWLINE, TK_NEWLINE, | |
| TK_endtask, TK_NEWLINE}}, | |
| {"end\n" | |
| "//pragma protect begin_protected\n" | |
| "(*&^%$#@!!@#$%^&*(a8sayasd\n" | |
| "87y&*H*HYgyGYh@#BH)72361^&*\n" | |
| "//pragma protect end_protected\n" | |
| "always\n", | |
| {TK_end, TK_NEWLINE, TK_NEWLINE, TK_always, TK_NEWLINE}}, | |
| {"end\n" | |
| "`pragma protect begin_protected\n" | |
| "(*&^%$#@!!@#$%^&*(a8sayasd\n" | |
| "87y&*H*HYgyGYh@#BH)72361^&*\n" | |
| "`pragma protect end_protected\n" | |
| "begin\n", | |
| {TK_end, TK_NEWLINE, TK_NEWLINE, TK_begin, TK_NEWLINE}}, | |
| }; | |
| static std::initializer_list<SimpleTestData> kSymbolIdentifierTests = { | |
| {"a"}, {" a"}, {"\t\ta"}, {"\nb"}, {"_"}, {"_987"}, | |
| {"_1u"}, {"_$"}, {"_$_"}, {"Foo"}, {"F00"}, {"Foo222"}, | |
| {"_Foo"}, {"Foo$"}, {"Foo_Bar"}, {"Foo$Bar"}, | |
| }; | |
| static std::initializer_list<SimpleTestData> kEscapedIdentifierTests = { | |
| // escaped identifiers | |
| {"\\foo "}, | |
| {"\\__ "}, | |
| {"\\555 "}, | |
| {"\\these.are[really]ugly "}, | |
| {"\\5.6.7.8 "}, | |
| {"\\)(*&^%$#@! "}, | |
| {"\\]fdg[];'[as321=-+/.,>. "}, | |
| {"\\..:;;{]{*&!6^$94* "}, | |
| }; | |
| static std::initializer_list<SimpleTestData> kMacroIdentifierTests = { | |
| // treat `identifier (macro-constants) like plain identifier | |
| {"`foo"}, | |
| {"`foo789"}, | |
| {"`___"}, | |
| {"`_oo00OO"}, | |
| }; | |
| static std::initializer_list<LexerTestData> kKeywordTests = { | |
| {{TK_1step, "1step"}}, | |
| {{TK_always, "always"}}, | |
| {{TK_and, "and"}}, | |
| {{TK_assign, "assign"}}, | |
| {{TK_begin, "begin"}}, | |
| {{TK_buf, "buf"}}, | |
| {{TK_bufif0, "bufif0"}}, | |
| {{TK_bufif1, "bufif1"}}, | |
| {{TK_case, "case"}}, | |
| {{TK_casex, "casex"}}, | |
| {{TK_casez, "casez"}}, | |
| {{TK_cmos, "cmos"}}, | |
| {{TK_deassign, "deassign"}}, | |
| {{TK_default, "default"}}, | |
| {{TK_defparam, "defparam"}}, | |
| {{TK_disable, "disable"}}, | |
| {{TK_edge, "edge"}}, | |
| {{TK_else, "else"}}, | |
| {{TK_end, "end"}}, | |
| {{TK_endcase, "endcase"}}, | |
| {{TK_endfunction, "endfunction"}}, | |
| {{TK_endmodule, "endmodule"}}, | |
| {{TK_endprimitive, "endprimitive"}}, | |
| {{TK_endspecify, "endspecify"}}, | |
| {{SymbolIdentifier, "endtable"}}, // is keyword in table context | |
| {{TK_endtask, "endtask"}}, | |
| {{TK_event, "event"}}, | |
| {{SymbolIdentifier, "find"}}, | |
| {{SymbolIdentifier, "find_index"}}, | |
| {{SymbolIdentifier, "find_first"}}, | |
| {{SymbolIdentifier, "find_first_index"}}, | |
| {{SymbolIdentifier, "find_last"}}, | |
| {{SymbolIdentifier, "find_last_index"}}, | |
| {{TK_for, "for"}}, | |
| {{TK_force, "force"}}, | |
| {{TK_forever, "forever"}}, | |
| {{TK_fork, "fork"}}, | |
| {{TK_function, "function"}}, | |
| {{TK_highz0, "highz0"}}, | |
| {{TK_highz1, "highz1"}}, | |
| {{TK_if, "if"}}, | |
| {{TK_ifnone, "ifnone"}}, | |
| {{TK_initial, "initial"}}, | |
| {{TK_inout, "inout"}}, | |
| {{TK_input, "input"}}, | |
| {{TK_integer, "integer"}}, | |
| {{TK_join, "join"}}, | |
| {{TK_large, "large"}}, | |
| {{TK_macromodule, "macromodule"}}, | |
| {{TK_medium, "medium"}}, | |
| {{TK_module, "module"}}, | |
| {{TK_nand, "nand"}}, | |
| {{TK_negedge, "negedge"}}, | |
| {{TK_nmos, "nmos"}}, | |
| {{TK_nor, "nor"}}, | |
| {{TK_not, "not"}}, | |
| {{TK_notif0, "notif0"}}, | |
| {{TK_notif1, "notif1"}}, | |
| {{TK_or, "or"}}, | |
| {{TK_output, "output"}}, | |
| {{TK_parameter, "parameter"}}, | |
| {{TK_pmos, "pmos"}}, | |
| {{TK_posedge, "posedge"}}, | |
| {{TK_primitive, "primitive"}}, | |
| {{TK_pull0, "pull0"}}, | |
| {{TK_pull1, "pull1"}}, | |
| {{TK_pulldown, "pulldown"}}, | |
| {{TK_pullup, "pullup"}}, | |
| {{TK_rcmos, "rcmos"}}, | |
| {{TK_real, "real"}}, | |
| {{TK_realtime, "realtime"}}, | |
| {{TK_reg, "reg"}}, | |
| {{TK_release, "release"}}, | |
| {{TK_repeat, "repeat"}}, | |
| {{TK_rnmos, "rnmos"}}, | |
| {{TK_rpmos, "rpmos"}}, | |
| {{TK_rtran, "rtran"}}, | |
| {{TK_rtranif0, "rtranif0"}}, | |
| {{TK_rtranif1, "rtranif1"}}, | |
| {{TK_scalared, "scalared"}}, | |
| {{TK_small, "small"}}, | |
| {{TK_specify, "specify"}}, | |
| {{TK_specparam, "specparam"}}, | |
| {{TK_strong0, "strong0"}}, | |
| {{TK_strong1, "strong1"}}, | |
| {{TK_supply0, "supply0"}}, | |
| {{TK_supply1, "supply1"}}, | |
| {{SymbolIdentifier, "table"}}, // is keyword inside primitive context | |
| {{TK_task, "task"}}, | |
| {{TK_time, "time"}}, | |
| {{TK_tran, "tran"}}, | |
| {{TK_tranif0, "tranif0"}}, | |
| {{TK_tranif1, "tranif1"}}, | |
| {{TK_tri, "tri"}}, | |
| {{TK_tri0, "tri0"}}, | |
| {{TK_tri1, "tri1"}}, | |
| {{TK_triand, "triand"}}, | |
| {{TK_trior, "trior"}}, | |
| {{TK_trireg, "trireg"}}, | |
| {{TK_vectored, "vectored"}}, | |
| {{TK_wait, "wait"}}, | |
| {{TK_wand, "wand"}}, | |
| {{TK_weak0, "weak0"}}, | |
| {{TK_weak1, "weak1"}}, | |
| {{TK_while, "while"}}, | |
| {{TK_wire, "wire"}}, | |
| {{TK_wor, "wor"}}, | |
| {{TK_xnor, "xnor"}}, | |
| {{TK_xor, "xor"}}, | |
| {{TK_Shold, "$hold"}}, | |
| {{TK_Snochange, "$nochange"}}, | |
| {{TK_Speriod, "$period"}}, | |
| {{TK_Srecovery, "$recovery"}}, | |
| {{TK_Ssetup, "$setup"}}, | |
| {{TK_Ssetuphold, "$setuphold"}}, | |
| {{TK_Sskew, "$skew"}}, | |
| {{TK_Swidth, "$width"}}, | |
| {{TKK_attribute, "$attribute"}}, | |
| {{TK_automatic, "automatic"}}, | |
| {{TK_endgenerate, "endgenerate"}}, | |
| {{TK_generate, "generate"}}, | |
| {{TK_genvar, "genvar"}}, | |
| {{TK_localparam, "localparam"}}, | |
| {{TK_noshowcancelled, "noshowcancelled"}}, | |
| {{TK_pulsestyle_onevent, "pulsestyle_onevent"}}, | |
| {{TK_pulsestyle_ondetect, "pulsestyle_ondetect"}}, | |
| {{TK_showcancelled, "showcancelled"}}, | |
| {{TK_signed, "signed"}}, | |
| {{TK_unsigned, "unsigned"}}, | |
| {{TK_Sfullskew, "$fullskew"}}, | |
| {{TK_Srecrem, "$recrem"}}, | |
| {{TK_Sremoval, "$removal"}}, | |
| {{TK_Stimeskew, "$timeskew"}}, | |
| {{TK_cell, "cell"}}, | |
| {{TK_config, "config"}}, | |
| {{TK_design, "design"}}, | |
| {{TK_endconfig, "endconfig"}}, | |
| {{TK_incdir, "incdir"}}, | |
| {{TK_include, "include"}}, | |
| {{TK_instance, "instance"}}, | |
| {{TK_liblist, "liblist"}}, | |
| {{TK_library, "library"}}, | |
| {{TK_use, "use"}}, | |
| {{TK_wone, "wone"}}, | |
| {{TK_uwire, "uwire"}}, | |
| {{TK_alias, "alias"}}, | |
| {{TK_always_comb, "always_comb"}}, | |
| {{TK_always_ff, "always_ff"}}, | |
| {{TK_always_latch, "always_latch"}}, | |
| {{TK_assert, "assert"}}, | |
| {{TK_assume, "assume"}}, | |
| {{TK_before, "before"}}, | |
| {{TK_bind, "bind"}}, | |
| {{TK_bins, "bins"}}, | |
| {{TK_binsof, "binsof"}}, | |
| {{TK_bit, "bit"}}, | |
| {{TK_break, "break"}}, | |
| {{TK_byte, "byte"}}, | |
| {{TK_chandle, "chandle"}}, | |
| {{TK_class, "class"}}, | |
| {{TK_clocking, "clocking"}}, | |
| {{TK_const, "const"}}, | |
| {{TK_constraint, "constraint"}}, | |
| {{TK_context, "context"}}, | |
| {{TK_continue, "continue"}}, | |
| {{TK_cover, "cover"}}, | |
| {{TK_covergroup, "covergroup"}}, | |
| {{TK_coverpoint, "coverpoint"}}, | |
| {{TK_cross, "cross"}}, | |
| {{TK_dist, "dist"}}, | |
| {{TK_do, "do"}}, | |
| {{TK_endclass, "endclass"}}, | |
| {{TK_endclocking, "endclocking"}}, | |
| {{TK_endgroup, "endgroup"}}, | |
| {{TK_endinterface, "endinterface"}}, | |
| {{TK_endpackage, "endpackage"}}, | |
| {{TK_endprogram, "endprogram"}}, | |
| {{TK_endproperty, "endproperty"}}, | |
| {{TK_endsequence, "endsequence"}}, | |
| {{TK_enum, "enum"}}, | |
| {{TK_expect, "expect"}}, | |
| {{TK_export, "export"}}, | |
| {{TK_extends, "extends"}}, | |
| {{TK_extern, "extern"}}, | |
| {{TK_final, "final"}}, | |
| {{TK_first_match, "first_match"}}, | |
| {{TK_foreach, "foreach"}}, | |
| {{TK_forkjoin, "forkjoin"}}, | |
| {{TK_iff, "iff"}}, | |
| {{TK_ignore_bins, "ignore_bins"}}, | |
| {{TK_illegal_bins, "illegal_bins"}}, | |
| {{TK_import, "import"}}, | |
| {{TK_inside, "inside"}}, | |
| {{TK_int, "int"}}, | |
| {{TK_interface, "interface"}}, | |
| {{TK_intersect, "intersect"}}, | |
| {{TK_join_any, "join_any"}}, | |
| {{TK_join_none, "join_none"}}, | |
| {{TK_local_SCOPE, "local::"}}, | |
| {{TK_local, "local"}}, | |
| {{TK_logic, "logic"}}, | |
| {{TK_longint, "longint"}}, | |
| {{TK_matches, "matches"}}, | |
| {{TK_modport, "modport"}}, | |
| {{TK_new, "new"}}, | |
| {{TK_null, "null"}}, | |
| {{TK_package, "package"}}, | |
| {{TK_packed, "packed"}}, | |
| {{TK_priority, "priority"}}, | |
| {{TK_program, "program"}}, | |
| {{TK_property, "property"}}, | |
| {{TK_protected, "protected"}}, | |
| {{TK_pure, "pure"}}, | |
| {{TK_rand, "rand"}}, | |
| {{TK_randc, "randc"}}, | |
| {{TK_randcase, "randcase"}}, | |
| {{TK_randsequence, "randsequence"}}, | |
| {{TK_randomize, "randomize"}}, | |
| {{TK_randomize, "std::randomize"}}, | |
| {{TK_ref, "ref"}}, | |
| {{TK_return, "return"}}, | |
| {{TK_Sroot, "$root"}}, | |
| {{TK_sequence, "sequence"}}, | |
| {{TK_shortint, "shortint"}}, | |
| {{TK_shortreal, "shortreal"}}, | |
| {{TK_solve, "solve"}}, | |
| {{TK_static, "static"}}, | |
| {{TK_string, "string"}}, | |
| {{TK_struct, "struct"}}, | |
| {{TK_super, "super"}}, | |
| {{TK_tagged, "tagged"}}, | |
| {{TK_this, "this"}}, | |
| {{TK_throughout, "throughout"}}, | |
| {{TK_timeprecision, "timeprecision"}}, | |
| {{TK_timeunit, "timeunit"}}, | |
| {{TK_type, "type"}}, | |
| {{TK_typedef, "typedef"}}, | |
| {{TK_union, "union"}}, | |
| {{TK_unique, "unique"}}, | |
| {{TK_Sunit, "$unit"}}, | |
| {{TK_var, "var"}}, | |
| {{TK_virtual, "virtual"}}, | |
| {{TK_void, "void"}}, | |
| {{TK_wait_order, "wait_order"}}, | |
| {{TK_wildcard, "wildcard"}}, | |
| {{TK_with, "with"}}, | |
| {{TK_within, "within"}}, | |
| {{TK_timeprecision_check, "timeprecision_check"}}, | |
| {{TK_timeunit_check, "timeunit_check"}}, | |
| {{TK_accept_on, "accept_on"}}, | |
| {{TK_checker, "checker"}}, | |
| {{TK_endchecker, "endchecker"}}, | |
| {{TK_eventually, "eventually"}}, | |
| {{TK_global, "global"}}, | |
| {{TK_implies, "implies"}}, | |
| {{TK_let, "let"}}, | |
| {{TK_nexttime, "nexttime"}}, | |
| {{TK_reject_on, "reject_on"}}, | |
| {{TK_restrict, "restrict"}}, | |
| {{TK_s_always, "s_always"}}, | |
| {{TK_s_eventually, "s_eventually"}}, | |
| {{TK_s_nexttime, "s_nexttime"}}, | |
| {{TK_s_until, "s_until"}}, | |
| {{TK_s_until_with, "s_until_with"}}, | |
| {{TK_strong, "strong"}}, | |
| {{TK_sync_accept_on, "sync_accept_on"}}, | |
| {{TK_sync_reject_on, "sync_reject_on"}}, | |
| {{TK_unique0, "unique0"}}, | |
| {{TK_until, "until"}}, | |
| {{TK_until_with, "until_with"}}, | |
| {{TK_untyped, "untyped"}}, | |
| {{TK_weak, "weak"}}, | |
| {{TK_implements, "implements"}}, | |
| {{TK_interconnect, "interconnect"}}, | |
| {{TK_nettype, "nettype"}}, | |
| {{TK_soft, "soft"}}, | |
| {{TK_absdelay, "absdelay"}}, | |
| {{TK_abstol, "abstol"}}, | |
| {{TK_access, "access"}}, | |
| {{TK_ac_stim, "ac_stim"}}, | |
| {{TK_aliasparam, "aliasparam"}}, | |
| {{TK_analog, "analog"}}, | |
| {{TK_analysis, "analysis"}}, | |
| {{TK_connectmodule, "connectmodule"}}, | |
| {{TK_connectrules, "connectrules"}}, | |
| {{TK_continuous, "continuous"}}, | |
| {{TK_ddt_nature, "ddt_nature"}}, | |
| {{TK_discipline, "discipline"}}, | |
| {{TK_discrete, "discrete"}}, | |
| {{SymbolIdentifier, "domain"}}, // is keyword in discipline context | |
| {{TK_driver_update, "driver_update"}}, | |
| {{TK_endconnectrules, "endconnectrules"}}, | |
| {{TK_enddiscipline, "enddiscipline"}}, | |
| {{TK_endnature, "endnature"}}, | |
| {{TK_endparamset, "endparamset"}}, | |
| {{TK_exclude, "exclude"}}, | |
| {{TK_flicker_noise, "flicker_noise"}}, | |
| {{TK_flow, "flow"}}, | |
| {{TK_from, "from"}}, | |
| {{TK_idt_nature, "idt_nature"}}, | |
| {{TK_inf, "inf"}}, | |
| {{TK_infinite, "infinite"}}, | |
| {{TK_laplace_nd, "laplace_nd"}}, | |
| {{TK_laplace_np, "laplace_np"}}, | |
| {{TK_laplace_zd, "laplace_zd"}}, | |
| {{TK_laplace_zp, "laplace_zp"}}, | |
| {{TK_last_crossing, "last_crossing"}}, | |
| {{TK_limexp, "limexp"}}, | |
| {{SymbolIdentifier, "max"}}, | |
| {{SymbolIdentifier, "min"}}, | |
| {{TK_nature, "nature"}}, | |
| {{TK_net_resolution, "net_resolution"}}, | |
| {{TK_noise_table, "noise_table"}}, | |
| {{TK_paramset, "paramset"}}, | |
| {{TK_potential, "potential"}}, | |
| {{TK_resolveto, "resolveto"}}, | |
| {{TK_transition, "transition"}}, | |
| {{TK_units, "units"}}, | |
| {{TK_white_noise, "white_noise"}}, | |
| {{TK_wreal, "wreal"}}, | |
| {{TK_zi_nd, "zi_nd"}}, | |
| {{TK_zi_np, "zi_np"}}, | |
| {{TK_zi_zd, "zi_zd"}}, | |
| {{TK_zi_zp, "zi_zp"}}, | |
| {{TK_PLUS_EQ, "+="}}, | |
| {{TK_MINUS_EQ, "-="}}, | |
| {{TK_MUL_EQ, "*="}}, | |
| {{TK_DIV_EQ, "/="}}, | |
| {{TK_MOD_EQ, "%="}}, | |
| {{TK_AND_EQ, "&="}}, | |
| {{TK_OR_EQ, "|="}}, | |
| {{TK_XOR_EQ, "^="}}, | |
| {{TK_INCR, "++"}}, | |
| {{TK_DECR, "--"}}, | |
| {{TK_LE, "<="}}, | |
| {{TK_GE, ">="}}, | |
| {{TK_EG, "=>"}}, | |
| {{TK_WILDCARD_EQ, "==?"}}, | |
| {{TK_EQ, "=="}}, | |
| {{TK_WILDCARD_NE, "!=?"}}, | |
| {{TK_NE, "!="}}, | |
| {{TK_CEQ, "==="}}, | |
| {{TK_CNE, "!=="}}, | |
| {{TK_LP, "'{"}}, | |
| {{TK_LS, "<<"}}, | |
| {{TK_RS, ">>"}}, | |
| {{TK_RSS, ">>>"}}, | |
| {{TK_SG, "*>"}}, | |
| {{TK_CONTRIBUTE, "<+"}}, | |
| {{TK_PO_POS, "+:"}}, | |
| {{TK_PO_NEG, "-:"}}, | |
| {{TK_POW, "**"}}, | |
| // {{TK_PSTAR , { "(*"}}, // ignored by lexer, treated as comment | |
| // {{TK_STARP , { "*)"}}, // ignored by lexer, treated as comment | |
| {{TK_DOTSTAR, ".*"}}, | |
| {{TK_LOR, "||"}}, | |
| {{TK_LAND, "&&"}}, | |
| {{TK_TAND, "&&&"}}, | |
| {{TK_NAND, "~&"}}, | |
| {{TK_NOR, "~|"}}, | |
| {{TK_NXOR, "~^"}}, | |
| {{TK_NONBLOCKING_TRIGGER, "->>"}}, | |
| {{_TK_RARROW, "->"}}, // This can disambiguate to different enums, | |
| // depending on context. | |
| {{TK_LOGEQUIV, "<->"}}, | |
| {{TK_SCOPE_RES, "::"}}, | |
| {{TK_COLON_EQ, ":="}}, | |
| {{TK_COLON_DIV, ":/"}}, | |
| {{TK_POUNDPOUND, "##"}}, | |
| {{TK_LBSTAR, "[*"}}, | |
| {{TK_LBSTARRB, "[*]"}}, | |
| {{TK_LBPLUSRB, "[+]"}}, | |
| {{TK_LBEQ, "[="}}, | |
| {{TK_LBRARROW, "[->"}}, | |
| }; | |
| static std::initializer_list<SimpleTestData> kSingleCharTokenTests = { | |
| {"}"}, {"{"}, {";"}, {":"}, {"["}, {"]"}, {","}, {"("}, {")"}, | |
| {"#"}, {"="}, {"."}, {"@"}, {"&"}, {"!"}, {"?"}, {"<"}, {">"}, | |
| {"%"}, {"|"}, {"^"}, {"~"}, {"+"}, {"*"}, {"/"}, {"-"}, {"\'"}, | |
| }; | |
| static std::initializer_list<SimpleTestData> kRealTimeTests = { | |
| // scientific units | |
| {"1e-3"}, | |
| {"2e+3"}, | |
| {"3e6"}, | |
| {"4E6"}, | |
| {"5.12e-6"}, | |
| {"0e-0"}, | |
| {"0e+0"}, | |
| {"6e-12"}, | |
| {"7e-100"}, | |
| {"6.02e-23"}, | |
| {"2.9e8"}, | |
| // scaled units are for Verilog-AMS | |
| {"1u"}, | |
| {"2a"}, | |
| {"3f"}, | |
| {"4m"}, | |
| {"5p"}, | |
| {"6k"}, | |
| {"6K"}, | |
| {"7M"}, | |
| {"8G"}, | |
| {"9T"}, | |
| {"2.5n"}, | |
| {"100p"}, | |
| {"10.0p"}, | |
| {"0.01m"}, | |
| {"0m"}, | |
| }; | |
| static std::initializer_list<LexerTestData> kBasedNumberTests = { | |
| {{TK_UnBasedNumber, "'0"}}, | |
| {{TK_UnBasedNumber, "'1"}}, | |
| {{TK_UnBasedNumber, "'x"}}, | |
| {{TK_UnBasedNumber, "'X"}}, | |
| {{TK_UnBasedNumber, "'z"}}, | |
| {{TK_UnBasedNumber, "'Z"}}, | |
| {{TK_DecBase, "'d"}, {TK_DecDigits, "0"}}, | |
| {{TK_DecBase, "'d"}, {TK_SPACE, " "}, {TK_DecDigits, "0"}}, | |
| {{TK_DecBase, "'d"}, {TK_DecDigits, "20"}}, | |
| {{TK_DecBase, "'d"}, {TK_DecDigits, "20__"}}, | |
| {{TK_DecBase, "'sd"}, {TK_DecDigits, "9"}}, | |
| {{TK_DecBase, "'SD"}, {TK_DecDigits, "12"}}, | |
| {{TK_DecBase, "'d"}, {TK_XZDigits, "x"}}, | |
| {{TK_DecBase, "'d"}, {TK_SPACE, " "}, {TK_XZDigits, "x"}}, | |
| {{TK_DecBase, "'d"}, {TK_NEWLINE, "\n"}, {TK_XZDigits, "x"}}, | |
| {{TK_DecBase, "'d"}, {TK_XZDigits, "x_"}}, | |
| {{TK_DecBase, "'d"}, {TK_XZDigits, "Z"}}, | |
| {{TK_DecBase, "'d"}, {TK_XZDigits, "?"}}, | |
| {{TK_BinBase, "'B"}, {TK_BinDigits, "0"}}, | |
| {{TK_BinBase, "'b"}, {TK_BinDigits, "1"}}, | |
| {{TK_BinBase, "'b"}, {TK_SPACE, " "}, {TK_BinDigits, "1"}}, | |
| {{TK_BinBase, "'b"}, {TK_NEWLINE, "\n"}, {TK_BinDigits, "1"}}, | |
| {{TK_BinBase, "'b"}, {TK_BinDigits, "x"}}, | |
| {{TK_BinBase, "'b"}, {TK_BinDigits, "z"}}, | |
| {{TK_BinBase, "'b"}, {TK_BinDigits, "1100"}}, | |
| {{TK_BinBase, "'b"}, {TK_BinDigits, "xX10Zz"}}, | |
| {{TK_BinBase, "'b"}, {TK_BinDigits, "_x_X_10_Zz"}}, | |
| {{TK_OctBase, "'o"}, {TK_OctDigits, "0"}}, | |
| {{TK_OctBase, "'o"}, {TK_OctDigits, "000"}}, | |
| {{TK_OctBase, "'o"}, {TK_OctDigits, "777"}}, | |
| {{TK_OctBase, "'o"}, {TK_SPACE, " "}, {TK_OctDigits, "777"}}, | |
| {{TK_OctBase, "'o"}, {TK_NEWLINE, "\n"}, {TK_OctDigits, "777"}}, | |
| {{TK_OctBase, "'o"}, {TK_OctDigits, "_007_007_"}}, | |
| {{TK_HexBase, "'h"}, {TK_HexDigits, "0"}}, | |
| {{TK_HexBase, "'h"}, {TK_SPACE, " "}, {TK_HexDigits, "0"}}, | |
| {{TK_HexBase, "'h"}, {TK_NEWLINE, "\n"}, {TK_HexDigits, "0"}}, | |
| {{TK_HexBase, "'h"}, {TK_HexDigits, "a"}}, | |
| {{TK_HexBase, "'h"}, {TK_HexDigits, "e110"}}, | |
| {{TK_HexBase, "'h"}, {TK_HexDigits, "_feed_face"}}, | |
| {{TK_HexBase, "'h"}, {TK_HexDigits, "0_cafebabe_"}}, | |
| {{TK_HexBase, "'h"}, {TK_HexDigits, "00d_f00d"}}, | |
| {{TK_HexBase, "'h"}, {TK_HexDigits, "xXXxcaca"}}, | |
| {{TK_HexBase, "'h"}, {TK_HexDigits, "cacazzZZ"}}, | |
| {{TK_HexBase, "'h"}, {TK_HexDigits, "e110???_000"}}, | |
| }; | |
| static std::initializer_list<SimpleTestData> kTimeLiteralTests = { | |
| {"1fs"}, {"2ps"}, {"3ns"}, {"4us"}, {"5ms"}, {"6.6fs"}, | |
| {"7.77ps"}, {"88.0ns"}, {"999.99us"}, {"10.0ms"}, {"66s"}, | |
| // {"1 ms"}, {"11.0 ms"}, // only allowed in `timescale context | |
| }; | |
| static std::initializer_list<SimpleTestData> kStringLiteralTests = { | |
| {"\"\""}, | |
| {"\".\""}, | |
| {"\"...\""}, | |
| {"\":)\""}, | |
| {"\"^ ^\""}, | |
| {"\"O_o\""}, | |
| {"\"foobar\""}, | |
| {"\"foo bar\""}, | |
| {"\"the\\\\great\\\\escape\""}, | |
| {"\"the\\\"great\\\"escape\""}, | |
| {"\"the\\nGREAT\\nescape\""}, // with line continuations | |
| {"\"`abc\""}, | |
| {"\"`abc()\""}, | |
| {"\"`abc(d)\""}, | |
| {"\"`abc(d,e)\""}, | |
| }; | |
| // `"...`" preprocessor-evaluated string literals | |
| static std::initializer_list<SimpleTestData> kEvalStringLiteralTests = { | |
| {"`\"`\""}, // | |
| {"`\" `\""}, // | |
| {"`\"123`\""}, // | |
| {"`\"abc`\""}, // | |
| {"`\"`abc`\""}, // | |
| {"`\"`abc()`\""}, // | |
| {"`\"`abc(d)`\""}, // | |
| {"`\"`abc(d,e)`\""}, // | |
| {"`\"```\""}, // token concatenation operator in middle | |
| }; | |
| // tokens with special handling in lexer | |
| static std::initializer_list<LexerTestData> kTrickyTests = { | |
| {{'*', "(*)"}}, | |
| {{TK_COLON_DIV, ":/"}, {TK_SPACE, " "}}, | |
| {{TK_COLON_DIV, ":/"}, {TK_DecNumber, "8"}}, | |
| {':', {TK_EOL_COMMENT, "//"}, {TK_NEWLINE, "\n"}}, | |
| {':', {TK_COMMENT_BLOCK, "/*ignore*/"}, {TK_NEWLINE, "\n"}}, | |
| {{TK_DecNumber, "0"}, | |
| ':', | |
| {TK_EOL_COMMENT, "// case description"}, | |
| {TK_NEWLINE, "\n"}}, | |
| {{SymbolIdentifier, "FOO"}, | |
| {TK_SPACE, " "}, | |
| {TK_LINE_CONT, "\\"}, | |
| {TK_NEWLINE, "\n"}, | |
| {SymbolIdentifier, "BAR"}, | |
| ';'}, | |
| { | |
| {TK_EOL_COMMENT, "//FOO"}, | |
| {TK_LINE_CONT, "\\"}, | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| {TK_EOL_COMMENT, "//FOO"}, | |
| {TK_LINE_CONT, "\\"}, | |
| {TK_NEWLINE, "\n"}, | |
| {TK_EOL_COMMENT, "//BAR "}, | |
| {TK_LINE_CONT, "\\"}, | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| }; | |
| // make sure these are lexed as separate tokens | |
| static std::initializer_list<LexerTestData> kSequenceTests = { | |
| {{'+', "+"}, {TK_EG, "=>"}}, | |
| {{'-', "-"}, {TK_EG, "=>"}}, | |
| {{TK_POUNDPOUND, "##"}, {'#', "#"}}, | |
| {{TK_POUNDPOUND, "##"}, {TK_POUNDPOUND, "##"}}, | |
| {{'[', "["}, {'-', "-"}, {TK_DecNumber, "12"}, {']', "]"}}, | |
| {{TK_LBSTAR, "[*"}, {TK_DecNumber, "12"}, {']', "]"}}, | |
| {{'[', "["}, " ", {'*', "*"}, {TK_DecNumber, "3"}, {']', "]"}}, | |
| {{TK_LBEQ, "[="}, {TK_DecNumber, "1"}, {']', "]"}}, | |
| {{'[', "["}, " ", {'=', "="}, {TK_DecNumber, "1"}, {']', "]"}}, | |
| {{TK_LBRARROW, "[->"}, {']', "]"}}, | |
| {{'[', "["}, " ", {_TK_RARROW, "->"}, {']', "]"}}, | |
| {{MacroNumericWidth, "`WIDTH"}, {TK_DecBase, "'d"}, {TK_DecDigits, "777"}}, | |
| {{MacroNumericWidth, "`WIDTH"}, | |
| {TK_DecBase, "'d"}, | |
| {MacroIdentifier, "`DIGITS"}}, | |
| {{MacroNumericWidth, "`WIDTH"}, | |
| " ", | |
| {TK_HexBase, "'h"}, | |
| {TK_HexDigits, "888"}}, | |
| {{MacroNumericWidth, "`WIDTH"}, | |
| " ", | |
| {TK_HexBase, "'h"}, | |
| {MacroIdentifier, "`DIGITS"}}, | |
| {{MacroNumericWidth, "`WIDTH"}, | |
| " \t ", | |
| {TK_OctBase, "'o"}, | |
| {TK_OctDigits, "654"}}, | |
| {{MacroNumericWidth, "`WIDTH"}, {TK_BinBase, "'b"}, {TK_BinDigits, "101"}}, | |
| {{MacroNumericWidth, "`WIDTH"}, {TK_BinBase, "'b"}, {TK_BinDigits, "10zx"}}, | |
| {{MacroNumericWidth, "`WIDTH"}, | |
| {TK_BinBase, "'b"}, | |
| {MacroIdentifier, "`DIGITS"}}, | |
| {{'*', "(*)"}, {'*', "(*)"}}, | |
| {{'*', "(*)"}, " ", {'*', "(*)"}}, | |
| {{'*', "(* )"}, {'*', "(* )"}}, | |
| }; | |
| static std::initializer_list<LexerTestData> kContextKeywordTests = { | |
| {{SymbolIdentifier, "option"}}, | |
| {{TK_covergroup, "covergroup"}, | |
| " ", | |
| {SymbolIdentifier, "blah1"}, | |
| " ", | |
| {TK_option, "option"}, | |
| " ", | |
| {SymbolIdentifier, "blah2"}, | |
| " ", | |
| {TK_endgroup, "endgroup"}, | |
| " ", | |
| {SymbolIdentifier, "option"}}, | |
| {{TK_with, "with"}, | |
| " ", | |
| {TK_covergroup, "covergroup"}, | |
| " ", | |
| {TK_with__covergroup, "with"}, | |
| " ", | |
| {TK_endgroup, "endgroup"}, | |
| " ", | |
| {TK_with, "with"}}, | |
| {{SymbolIdentifier, "domain"}, | |
| " ", | |
| {TK_discipline, "discipline"}, | |
| " ", | |
| {TK_domain, "domain"}, | |
| " ", | |
| {TK_enddiscipline, "enddiscipline"}, | |
| " ", | |
| {SymbolIdentifier, "domain"}}}; | |
| static std::initializer_list<LexerTestData> kBuiltinMethodKeywordTests = { | |
| {{'.', "."}, " ", {TK_randomize, "randomize"}, {'(', "("}, {')', ")"}}, | |
| {{'.', "."}, {TK_randomize, "randomize"}, " ", {TK_with, "with"}}, | |
| {{SymbolIdentifier, "min"}, | |
| " ", | |
| {'.', "."}, | |
| " ", | |
| {TK_min, "min"}, | |
| " ", | |
| {SymbolIdentifier, "min"}}, | |
| {{SymbolIdentifier, "min"}, | |
| {'.', "."}, | |
| {SymbolIdentifier, "minime"}, | |
| " ", | |
| {SymbolIdentifier, "min"}}, | |
| {{SymbolIdentifier, "max"}, | |
| {'.', "."}, | |
| " ", | |
| {TK_max, "max"}, | |
| " ", | |
| {SymbolIdentifier, "max"}}, | |
| {{SymbolIdentifier, "max"}, | |
| {'.', "."}, | |
| {SymbolIdentifier, "maxime"}, | |
| " ", | |
| {SymbolIdentifier, "max"}}, | |
| {{SymbolIdentifier, "find"}, | |
| " ", | |
| {'.', "."}, | |
| " ", | |
| {TK_find, "find"}, | |
| " ", | |
| {SymbolIdentifier, "find"}}, | |
| {{'.', "."}, {SymbolIdentifier, "finder"}}, | |
| {{SymbolIdentifier, "find_index"}, | |
| " ", | |
| {'.', "."}, | |
| " ", | |
| {TK_find_index, "find_index"}, | |
| " ", | |
| {SymbolIdentifier, "find_index"}}, | |
| {{SymbolIdentifier, "find_first_index"}, | |
| {'.', "."}, | |
| {TK_find_first_index, "find_first_index"}, | |
| " ", | |
| {SymbolIdentifier, "find_first_index"}}, | |
| {{SymbolIdentifier, "find_last"}, | |
| " ", | |
| {'.', "."}, | |
| " ", | |
| {TK_find_last, "find_last"}, | |
| " ", | |
| {SymbolIdentifier, "find_last"}}, | |
| {{SymbolIdentifier, "find_last_index"}, | |
| {'.', "."}, | |
| {TK_find_last_index, "find_last_index"}, | |
| " ", | |
| {SymbolIdentifier, "find_last_index"}}, | |
| {{TK_unique, "unique"}, | |
| " ", | |
| {'.', "."}, | |
| " ", | |
| {TK_unique, "unique"}, | |
| " ", | |
| {TK_unique, "unique"}}, | |
| {{SymbolIdentifier, "uniquely"}, | |
| {'.', "."}, | |
| {SymbolIdentifier, "uniquely"}, | |
| " ", | |
| {SymbolIdentifier, "uniquely"}}, | |
| {{SymbolIdentifier, "unique_index"}, | |
| " ", | |
| {'.', "."}, | |
| " ", | |
| {TK_unique_index, "unique_index"}, | |
| " ", | |
| {SymbolIdentifier, "unique_index"}}, | |
| {{SymbolIdentifier, "sort"}, | |
| " ", | |
| {'.', "."}, | |
| " ", | |
| {TK_sort, "sort"}, | |
| " ", | |
| {SymbolIdentifier, "sort"}}, | |
| {{SymbolIdentifier, "rsort"}, | |
| " ", | |
| {'.', "."}, | |
| " ", | |
| {TK_rsort, "rsort"}, | |
| " ", | |
| {SymbolIdentifier, "rsort"}}, | |
| {{SymbolIdentifier, "reverse"}, | |
| " ", | |
| {'.', "."}, | |
| " ", | |
| {TK_reverse, "reverse"}, | |
| " ", | |
| {SymbolIdentifier, "reverse"}}, | |
| {{SymbolIdentifier, "shuffle"}, | |
| " ", | |
| {'.', "."}, | |
| {TK_shuffle, "shuffle"}, | |
| " ", | |
| {SymbolIdentifier, "shuffle"}}, | |
| {{SymbolIdentifier, "sum"}, | |
| " ", | |
| {'.', "."}, | |
| " ", | |
| {TK_sum, "sum"}, | |
| " ", | |
| {SymbolIdentifier, "sum"}}, | |
| {{SymbolIdentifier, "product"}, | |
| " ", | |
| {'.', "."}, | |
| " ", | |
| {TK_product, "product"}, | |
| " ", | |
| {SymbolIdentifier, "product"}}, | |
| {{TK_and, "and"}, | |
| " ", | |
| {'.', "."}, | |
| " ", | |
| {TK_and, "and"}, | |
| " ", | |
| {TK_and, "and"}}, | |
| {{TK_or, "or"}, " ", {'.', "."}, " ", {TK_or, "or"}, " ", {TK_or, "or"}}, | |
| {{TK_xor, "xor"}, | |
| " ", | |
| {'.', "."}, | |
| " ", | |
| {TK_xor, "xor"}, | |
| " ", | |
| {TK_xor, "xor"}}, | |
| }; | |
| static std::initializer_list<LexerTestData> kEdgeTests = { | |
| {{TK_edge, "edge"}, " ", {'[', "["}, {']', "]"}, " ", {TK_DecNumber, "10"}}, | |
| {{TK_edge, "edge"}, | |
| "\n", | |
| {'[', "["}, | |
| {']', "]"}, | |
| " ", | |
| {SymbolIdentifier, "z0"}}, | |
| {{TK_edge, "edge"}, | |
| {'[', "["}, | |
| {TK_edge_descriptor, "10"}, | |
| {']', "]"}, | |
| " "}, | |
| {{TK_edge, "edge"}, | |
| "\n", | |
| {'[', "["}, | |
| {TK_edge_descriptor, "z0"}, | |
| {']', "]"}}, | |
| {{TK_edge, "edge"}, | |
| "\n", | |
| {'[', "["}, | |
| {TK_edge_descriptor, "01"}, | |
| " ", | |
| {TK_edge_descriptor, "0x"}, | |
| " ", | |
| {TK_edge_descriptor, "1x"}, | |
| " ", | |
| {TK_edge_descriptor, "x0"}, | |
| " ", | |
| {TK_edge_descriptor, "z1"}, | |
| " ", | |
| {']', "]"}, | |
| " ", | |
| {TK_DecNumber, "10"}}, | |
| {{TK_edge, "edge"}, | |
| "\n", | |
| {'[', "["}, | |
| {TK_edge_descriptor, "01"}, | |
| " ", | |
| {',', ","}, | |
| {TK_edge_descriptor, "0x"}, | |
| " ", | |
| {',', ","}, | |
| {TK_edge_descriptor, "1x"}, | |
| {',', ","}, | |
| {TK_edge_descriptor, "x0"}, | |
| {',', ","}, | |
| {TK_edge_descriptor, "z1"}, | |
| {',', ","}, | |
| {']', "]"}, | |
| " ", | |
| {SymbolIdentifier, "x0"}}, | |
| {{TK_edge, "edge"}, " ", {SymbolIdentifier, "x0"}}, | |
| {{TK_edge, "edge"}, | |
| " ", | |
| {SymbolIdentifier, "x0"}, | |
| " ", | |
| {'[', "["}, | |
| " ", | |
| {TK_DecNumber, "10"}, | |
| " ", | |
| {']', "]"}}, | |
| }; | |
| static std::initializer_list<LexerTestData> kUDPTests = { | |
| {{TK_primitive, "primitive"}, | |
| " ", | |
| {TK_table, "table"}, | |
| " ", | |
| {TK_endtable, "endtable"}, | |
| " ", | |
| {TK_endprimitive, "endprimitive"}}, | |
| {{TK_primitive, "primitive"}, | |
| " ", | |
| {TK_table, "table"}, | |
| " ", | |
| {'b', "b"}, | |
| {':', ":"}, | |
| {'l', "l"}, | |
| {';', ";"}, | |
| " ", | |
| {TK_endtable, "endtable"}, | |
| " ", | |
| {TK_endprimitive, "endprimitive"}}, | |
| {{TK_primitive, "primitive"}, | |
| " ", | |
| {TK_table, "table"}, | |
| " ", | |
| {'b', "B"}, | |
| {':', ":"}, | |
| {'l', "L"}, | |
| {':', ":"}, | |
| {'h', "H"}, | |
| {';', ";"}, | |
| " ", | |
| {TK_endtable, "endtable"}, | |
| " ", | |
| {TK_endprimitive, "endprimitive"}}, | |
| {{TK_primitive, "primitive"}, | |
| " ", | |
| {TK_table, "table"}, | |
| " ", | |
| {'b', "b"}, | |
| " ", | |
| {'b', "B"}, | |
| " ", | |
| {'l', "l"}, | |
| " ", | |
| {'l', "L"}, | |
| " ", | |
| {'h', "h"}, | |
| " ", | |
| {'h', "H"}, | |
| " ", | |
| {'f', "f"}, | |
| " ", | |
| {'f', "F"}, | |
| " ", | |
| {'r', "r"}, | |
| " ", | |
| {'r', "R"}, | |
| " ", | |
| {'x', "x"}, | |
| " ", | |
| {'x', "X"}, | |
| " ", | |
| {'n', "n"}, | |
| " ", | |
| {'n', "N"}, | |
| " ", | |
| {'p', "p"}, | |
| " ", | |
| {'p', "P"}, | |
| " ", | |
| {'0', "0"}, | |
| " ", | |
| {'1', "1"}, | |
| " ", | |
| {'?', "?"}, | |
| " ", | |
| {'*', "*"}, | |
| " ", | |
| {'-', "-"}, | |
| " ", | |
| {':', ":"}, | |
| " ", | |
| {';', ";"}, | |
| " ", | |
| {TK_endtable, "endtable"}, | |
| " ", | |
| {SymbolIdentifier, "B"}, | |
| " ", | |
| {SymbolIdentifier, "L"}, | |
| " ", | |
| {SymbolIdentifier, "F"}, | |
| " ", | |
| {SymbolIdentifier, "H"}, | |
| " ", | |
| {SymbolIdentifier, "R"}, | |
| " ", | |
| {TK_DecNumber, "1"}, | |
| " ", | |
| {TK_endprimitive, "endprimitive"}}, | |
| {{TK_primitive, "primitive"}, | |
| " ", | |
| {TK_table, "table"}, | |
| " ", | |
| {'_', "(?0)"}, | |
| " ", | |
| {'+', "(?1)"}, | |
| " ", | |
| {'%', "(?x)"}, | |
| " ", | |
| {'%', "(?X)"}, | |
| " ", | |
| {'*', "(?\?)"}, // Break tri-graph | |
| " ", | |
| {'r', "(01)"}, | |
| " ", | |
| {'Q', "(0x)"}, | |
| " ", | |
| {'Q', "(0X)"}, | |
| " ", | |
| {'q', "(bx)"}, | |
| " ", | |
| {'q', "(bX)"}, | |
| " ", | |
| {'f', "(b0)"}, | |
| " ", | |
| {'r', "(b1)"}, | |
| " ", | |
| {'P', "(0?)"}, | |
| " ", | |
| {'f', "(10)"}, | |
| " ", | |
| {'M', "(1x)"}, | |
| " ", | |
| {'M', "(1X)"}, | |
| " ", | |
| {'N', "(1?)"}, | |
| " ", | |
| {'F', "(x0)"}, | |
| " ", | |
| {'F', "(X0)"}, | |
| " ", | |
| {'R', "(x1)"}, | |
| " ", | |
| {'R', "(X1)"}, | |
| " ", | |
| {'B', "(x?)"}, | |
| " ", | |
| {'B', "(X?)"}, | |
| " ", | |
| {TK_endtable, "endtable"}, | |
| " ", | |
| {SymbolIdentifier, "b0"}, | |
| " ", | |
| {SymbolIdentifier, "bx"}, | |
| " ", | |
| {SymbolIdentifier, "x1"}, | |
| " ", | |
| {SymbolIdentifier, "X0"}, | |
| " ", | |
| {TK_DecNumber, "10"}, | |
| " ", | |
| {TK_endprimitive, "endprimitive"}}, | |
| // TK_DecNumber inside UDP should be rejected, and will be caught by parser | |
| {{TK_primitive, "primitive"}, | |
| " ", | |
| {TK_table, "table"}, | |
| " ", | |
| {TK_OTHER, "321"}}, | |
| {{TK_primitive, "primitive"}, | |
| " ", | |
| {TK_table, "table"}, | |
| " ", | |
| {'1', "1"}, | |
| {'0', "0"}, | |
| {'1', "1"}, | |
| {'0', "0"}}, | |
| {{TK_primitive, "primitive"}, | |
| " ", | |
| {TK_table, "table"}, | |
| " ", | |
| {'1', "1"}, | |
| {'0', "0"}, | |
| "\t", | |
| {'1', "1"}, | |
| {'0', "0"}}, | |
| {{TK_primitive, "primitive"}, | |
| " ", | |
| {TK_table, "table"}, | |
| " ", | |
| {'1', "1"}, | |
| {'0', "0"}, | |
| "\n", | |
| {PP_ifdef, "`ifdef"}, | |
| " ", | |
| {PP_Identifier, "BLAH"}, | |
| "\n", | |
| {'1', "1"}, | |
| {'0', "0"}}, | |
| {// should not crash or stack-underflow | |
| {TK_endprimitive, "endprimitive"}}, | |
| {// should not crash or stack-underflow | |
| {TK_endprimitive, "endprimitive"}, | |
| " ", | |
| {TK_endprimitive, "endprimitive"}}, | |
| {// should not crash or stack-underflow | |
| {TK_EOL_COMMENT, "//zzz"}, | |
| "\n", | |
| {TK_endprimitive, "endprimitive"}}, | |
| }; | |
| static std::initializer_list<LexerTestData> kUnfilteredUDPTests = { | |
| {{TK_primitive, "primitive"}, | |
| {TK_SPACE, " "}, | |
| {TK_table, "table"}, | |
| {TK_SPACE, " "}, | |
| {'1', "1"}, | |
| {'0', "0"}, | |
| {TK_COMMENT_BLOCK, "/*comment*/"}, | |
| {'1', "1"}, | |
| {'0', "0"}}, | |
| }; | |
| static std::initializer_list<LexerTestData> kTimingCheckTests = { | |
| {{TK_Shold, "$hold"}}, {{TK_Snochange, "$nochange"}}, | |
| {{TK_Speriod, "$period"}}, {{TK_Srecovery, "$recovery"}}, | |
| {{TK_Ssetup, "$setup"}}, {{TK_Ssetuphold, "$setuphold"}}, | |
| {{TK_Sskew, "$skew"}}, {{TK_Swidth, "$width"}}, | |
| {{TK_Sfullskew, "$fullskew"}}, {{TK_Srecrem, "$recrem"}}, | |
| {{TK_Sremoval, "$removal"}}, {{TK_Stimeskew, "$timeskew"}}, | |
| {{TKK_attribute, "$attribute"}}, | |
| }; | |
| static std::initializer_list<LexerTestData> kSystemTaskFunctionTests = { | |
| {{SystemTFIdentifier, "$display"}}, {{SystemTFIdentifier, "$error"}}, | |
| {{SystemTFIdentifier, "$info"}}, {{SystemTFIdentifier, "$warning"}}, | |
| {{SystemTFIdentifier, "$fatal"}}, {{SystemTFIdentifier, "$finish"}}, | |
| {{SystemTFIdentifier, "$stop"}}, {{SystemTFIdentifier, "$hammertime"}}, | |
| {{SystemTFIdentifier, "$__MAGIC__"}}, {{SystemTFIdentifier, "$thechosen1"}}, | |
| }; | |
| static std::initializer_list<LexerTestData> kPreprocessorTests = { | |
| {{}, ""}, | |
| {{PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "true"}, | |
| " ", | |
| {PP_define_body, "false"}, | |
| "\n"}, | |
| {" ", | |
| {PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "SIMULTION"}, | |
| {PP_define_body, ""}, | |
| "\n"}, | |
| { | |
| {PP_elsif, "`elsif"}, | |
| "\n", | |
| }, | |
| {{PP_elsif, "`elsif"}, "\n", {SymbolIdentifier, "foo"}}, | |
| {{PP_elsif, "`elsif"}, " ", {PP_Identifier, "foo"}, "\n"}, | |
| {{PP_elsif, "`elsif"}, " ", {PP_Identifier, "foo"}, " ", "\n"}, | |
| {" ", {PP_elsif, "`elsif"}, " ", {PP_Identifier, "foo"}, " ", "\n"}, | |
| {" ", {PP_elsif, "`elsif"}, " ", {PP_Identifier, "foo"}, "\n"}, | |
| {" ", | |
| {PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "BAR"}, | |
| {PP_define_body, ""}, | |
| "\n"}, | |
| {"\t\t", | |
| {PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "BEAR"}, | |
| {PP_define_body, ""}, | |
| "\n"}, | |
| {{PP_else, "`else"}, "\n"}, | |
| {{PP_else, "`else"}, " ", {SymbolIdentifier, "blah"}, "\n"}, | |
| {{PP_endif, "`endif"}, "\n"}, | |
| {{PP_endif, "`endif"}, " ", {SymbolIdentifier, "blah"}, "\n"}, | |
| {{PP_ifdef, "`ifdef"}, " ", {PP_Identifier, "evil"}, "\n"}, | |
| {" ", | |
| {PP_ifdef, "`ifdef"}, | |
| " ", | |
| {PP_Identifier, "dont_be_evil"}, | |
| "\n"}, | |
| {" ", | |
| {PP_undef, "`undef"}, | |
| "\t", | |
| {PP_Identifier, "dont_be_evil"}, | |
| "\t\n"}, | |
| {{PP_ifndef, "`ifndef"}, " ", {PP_Identifier, "dont_be_evil"}, "\n"}, | |
| {{PP_include, "`include"}, | |
| " ", | |
| {TK_StringLiteral, "\"lib/standard_cells.v\""}, | |
| "\n"}, | |
| {{PP_undef, "`undef"}, " ", {PP_Identifier, "behavior"}, "\n"}, | |
| {{PP_ifdef, "`ifdef"}, | |
| " ", | |
| {PP_Identifier, "god_mode"}, | |
| "\n", | |
| {PP_define, "`define"}, | |
| " ", | |
| {PP_Identifier, "private"}, | |
| " ", | |
| {PP_define_body, "public"}, | |
| "\n", | |
| {PP_elsif, "`elsif"}, | |
| " ", | |
| {PP_Identifier, "hacker_mode"}, | |
| "\n", | |
| " ", | |
| {PP_elsif, "`elsif"}, | |
| " ", | |
| {PP_Identifier, "sneaky_mode"}, | |
| " \n", | |
| " ", | |
| {PP_elsif, "`elsif"}, | |
| " ", | |
| {PP_Identifier, "squeaky_mode"}, | |
| "\n", | |
| {PP_else, "`else"}, | |
| "\n", | |
| {PP_endif, "`endif"}, | |
| "\n"}, | |
| // Token concatenations | |
| { | |
| {PP_TOKEN_CONCAT, "``"}, | |
| }, | |
| { | |
| {PP_TOKEN_CONCAT, "``"}, | |
| "\n", | |
| }, | |
| { | |
| " ", | |
| {PP_TOKEN_CONCAT, "``"}, | |
| " ", | |
| }, | |
| { | |
| {SymbolIdentifier, "ab"}, | |
| {PP_TOKEN_CONCAT, "``"}, | |
| {SymbolIdentifier, "cd"}, | |
| }, | |
| }; | |
| static std::initializer_list<LexerTestData> kUnfilteredPreprocessorTests = { | |
| {{PP_else, "`else"}, | |
| {TK_SPACE, " "}, | |
| {TK_EOL_COMMENT, "// comment"}, | |
| {TK_NEWLINE, "\n"}}, | |
| }; | |
| static std::initializer_list<LexerTestData> kUnfilteredDirectiveTests = { | |
| {{DR_timescale, "`timescale"}, | |
| {TK_SPACE, " "}, | |
| {TK_TimeLiteral, "1ps"}, | |
| {'/', "/"}, | |
| {TK_TimeLiteral, "1ps"}, | |
| {TK_NEWLINE, "\n"}}, | |
| // TODO(b/134180314): lexer current drops tokens from pragma sections, | |
| // but instead emit the tokens and filter them out. | |
| // {{DR_pragma, "`pragma"}, " fragma", {TK_NEWLINE, "\n"}}, | |
| }; | |
| static std::initializer_list<LexerTestData> kDirectiveTests = { | |
| {{DR_timescale, "`timescale"}}, | |
| {{DR_timescale, "`timescale"}, | |
| " ", | |
| {TK_TimeLiteral, "1ps"}, | |
| {'/', "/"}, | |
| {TK_TimeLiteral, "1ps"}}, | |
| {" ", | |
| {DR_timescale, "`timescale"}, | |
| " ", | |
| {TK_TimeLiteral, "1ps"}, | |
| {'/', "/"}, | |
| {TK_TimeLiteral, "1ps"}}, | |
| {{DR_timescale, "`timescale"}, | |
| " ", | |
| {TK_TimeLiteral, "1s"}, | |
| " ", | |
| {'/', "/"}, | |
| " ", | |
| {TK_TimeLiteral, "1ms"}}, | |
| {{DR_timescale, "`timescale"}, | |
| " ", | |
| {TK_TimeLiteral, "100ps"}, | |
| " ", | |
| {'/', "/"}, | |
| " ", | |
| {TK_TimeLiteral, "100ps"}}, | |
| {{DR_timescale, "`timescale"}, | |
| " ", | |
| {TK_DecNumber, "100"}, | |
| " ", | |
| {TK_timescale_unit, "ps"}, | |
| " ", | |
| {'/', "/"}, | |
| " ", | |
| {TK_DecNumber, "100"}, | |
| " ", | |
| {TK_timescale_unit, "ps"}}, | |
| {{DR_celldefine, "`celldefine"}}, | |
| {{DR_celldefine, "`celldefine"}, "\n", {TK_module, "module"}}, | |
| {{DR_endcelldefine, "`endcelldefine"}}, | |
| {{DR_resetall, "`resetall"}}, | |
| {{DR_unconnected_drive, "`unconnected_drive"}, | |
| " ", | |
| {SymbolIdentifier, "blah"}}, | |
| {{DR_nounconnected_drive, "`nounconnected_drive"}, | |
| " ", | |
| {SymbolIdentifier, "blah"}}, | |
| {{DR_default_decay_time, "`default_decay_time"}, | |
| " ", | |
| {SymbolIdentifier, "blah"}}, | |
| {{DR_default_decay_time, "`default_decay_time"}, | |
| " ", | |
| {TK_infinite, "infinite"}}, | |
| {{DR_default_trireg_strength, "`default_trireg_strength"}, | |
| " ", | |
| {SymbolIdentifier, "blah"}}, | |
| {{DR_delay_mode_path, "`delay_mode_path"}, " "}, | |
| {{DR_delay_mode_unit, "`delay_mode_unit"}, " ", {SymbolIdentifier, "blah"}}, | |
| {{DR_delay_mode_zero, "`delay_mode_zero"}, " ", {SymbolIdentifier, "blah"}}, | |
| {{DR_disable_portfaults, "`disable_portfaults"}, | |
| " ", | |
| {SymbolIdentifier, "blah"}}, | |
| {{DR_enable_portfaults, "`enable_portfaults"}, | |
| " ", | |
| {SymbolIdentifier, "blah"}}, | |
| {{DR_suppress_faults, "`suppress_faults"}, " ", {SymbolIdentifier, "blah"}}, | |
| // TODO(b/134180314): lexer current drops tokens from pragma sections, | |
| // but instead emit the tokens and filter them out. | |
| // {{DR_uselib, "`uselib"}, " lib=schmoozelib\n"}, | |
| {{DR_protect, "`protect"}}, | |
| {{DR_endprotect, "`endprotect"}}, | |
| {{DR_begin_keywords, "`begin_keywords"}, | |
| " ", | |
| {SymbolIdentifier, "random"}, | |
| " ", | |
| {TK_StringLiteral, "\"keywords\""}}, | |
| {{DR_end_keywords, "`end_keywords"}}, | |
| {{DR_default_nettype, "`default_nettype"}, " ", {SymbolIdentifier, "blah"}}, | |
| }; | |
| static std::initializer_list<LexerTestData> kLibraryTests = { | |
| { | |
| {TK_library, "library"}, | |
| {TK_SPACE, " "}, | |
| {SymbolIdentifier, "mylib"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "1mylibpath/"}, // not an identifier | |
| ';', | |
| {SymbolIdentifier, "foo_bar_pkg"}, // not a file-path | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| // with newlines instead of spaces | |
| {TK_library, "library"}, | |
| {TK_NEWLINE, "\n"}, | |
| {SymbolIdentifier, "mylib"}, | |
| {TK_NEWLINE, "\n"}, | |
| {TK_FILEPATH, "6666/"}, // not a number | |
| {TK_NEWLINE, "\n"}, | |
| ';', | |
| {SymbolIdentifier, "foo_bar_pkg"}, // not a file-path | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| // with comments | |
| {TK_library, "library"}, | |
| {TK_COMMENT_BLOCK, "/*c1*/"}, | |
| {SymbolIdentifier, "mylib"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "2222"}, // not a number | |
| ';', | |
| {TK_COMMENT_BLOCK, "/*c3*/"}, | |
| {SymbolIdentifier, "foo_bar_pkg"}, // not a file-path | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| {TK_library, "library"}, | |
| {TK_SPACE, " "}, | |
| {SymbolIdentifier, "_my_lib"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "_1my_lib_path/"}, // underscores | |
| ';', | |
| {SymbolIdentifier, "foo_bar_pkg"}, // not a file-path | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| { | |
| {TK_library, "library"}, | |
| {TK_SPACE, " "}, | |
| {SymbolIdentifier, "_my_lib"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "1my-lib-path/"}, // dashes | |
| ';', | |
| {SymbolIdentifier, "foo_bar_pkg"}, // not a file-path | |
| {TK_NEWLINE, "\n"}, | |
| }, | |
| {{TK_library, "library"}, | |
| {TK_SPACE, " "}, | |
| {SymbolIdentifier, "mylib"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "/path1"}, // absolute path | |
| ',', | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "/path2/path3"}, | |
| ';', | |
| {TK_NEWLINE, "\n"}}, | |
| {{TK_library, "library"}, | |
| {TK_SPACE, " "}, | |
| {SymbolIdentifier, "mylib"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "*.v"}, // * wildcard | |
| ';', | |
| {TK_NEWLINE, "\n"}}, | |
| {{TK_library, "library"}, | |
| {TK_SPACE, " "}, | |
| {SymbolIdentifier, "mylib"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "foo?.v"}, // ? wildcard | |
| ';', | |
| {TK_NEWLINE, "\n"}}, | |
| {{TK_library, "library"}, | |
| {TK_SPACE, " "}, | |
| {SymbolIdentifier, "mylib"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "foo/"}, | |
| ';', | |
| {TK_NEWLINE, "\n"}}, | |
| {{TK_library, "library"}, | |
| {TK_SPACE, " "}, | |
| {SymbolIdentifier, "mylib"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "Foo/*.v"}, | |
| ';', | |
| {TK_NEWLINE, "\n"}}, | |
| {{TK_library, "library"}, | |
| {TK_SPACE, " "}, | |
| {SymbolIdentifier, "mylib"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "*.v"}, | |
| {TK_SPACE, " "}, | |
| '-', | |
| {TK_incdir, "incdir"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "/path/to/files"}, // absolute path | |
| ',', | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "/path/to/morefiles"}, | |
| ';', | |
| {TK_NEWLINE, "\n"}, | |
| {SymbolIdentifier, "not_a_path"}}, | |
| {{TK_include, "include"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "foo/*.v"}, | |
| ';', | |
| {TK_NEWLINE, "\n"}}, | |
| {{TK_include, "include"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "../../foo/*.v"}, // up-dir, relative | |
| ';', | |
| {TK_NEWLINE, "\n"}}, | |
| {{TK_include, "include"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "../../foo/..."}, // ... wildcard | |
| ';', | |
| {TK_NEWLINE, "\n"}}, | |
| {{TK_include, "include"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "../foo/.../*.vg"}, // ... wildcard | |
| ';', | |
| {TK_NEWLINE, "\n"}}, | |
| {{TK_include, "include"}, | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "foo/*.v"}, | |
| ',', | |
| {TK_SPACE, " "}, | |
| {TK_FILEPATH, "bar/*.vg"}, | |
| ';', | |
| {TK_NEWLINE, "\n"}}, | |
| }; | |
| static std::initializer_list<LexerTestData> kLexicalErrorTests = { | |
| // TODO(fangism): Return different error enums for different errors. | |
| {{TK_OTHER, "111wire"}}, | |
| {{TK_wire, "wire"}, " ", {TK_OTHER, "111wire"}, {';', ";"}}, | |
| {{TK_OTHER, "`111macro"}, "\n"}, | |
| {{TK_OTHER, "`111macrocall"}, {'(', "("}, {')', ")"}, "\n"}, | |
| {{TK_OTHER, "`"}}, | |
| {{TK_OTHER, "`"}, " "}, | |
| {{TK_OTHER, "`"}, "\t"}, | |
| {{TK_OTHER, "`"}, "\n"}, | |
| {{TK_OTHER, "`"}, {TK_EOL_COMMENT, "//"}, "\n"}, | |
| {{TK_OTHER, "`"}, {TK_COMMENT_BLOCK, "/* */"}}, | |
| {{TK_OTHER, "`"}, {TK_DecNumber, "11"}}, | |
| {{TK_OTHER, "`"}, " ", {SymbolIdentifier, "spacebad"}, "\n"}, | |
| {{PP_TOKEN_CONCAT, "``"}, {TK_OTHER, "`"}}, // triple-tick breakdown | |
| {{TK_OTHER, "\""}, "\n"}, | |
| {{TK_OTHER, "\"unterminated string literal"}}, | |
| {{TK_OTHER, "\"unterminated string literal"}, "\n"}, | |
| {{TK_OTHER, "\"unterminated \\\nstring \\\nliteral"}, "\n"}, | |
| {{TK_OTHER, "`\"unterminated eval string literal"}}, | |
| {{TK_OTHER, "`\"unterminated eval string literal\n"}}, | |
| {{TK_OTHER, "`\"unterminated \"eval\" string literal"}}, | |
| {{TK_OTHER, "/*"}}, | |
| {{TK_OTHER, "/*\n"}}, | |
| {{TK_OTHER, "/* interminated comment"}}, | |
| // Unterminated string literal inside macro call args | |
| {{MacroCallId, "`b"}, '(', {TK_OTHER, "\");"}}, | |
| {{MacroCallId, "`c"}, '(', {TK_OTHER, "/*"}}, | |
| // Rejected ACSII characters | |
| {{TK_OTHER, "\x7F"}}, | |
| {{TK_OTHER, "\x80"}}, | |
| {{TK_OTHER, "\xFF"}}, | |
| }; | |
| TEST(VerilogLexerTest, LexicalErrors) { TestLexer(kLexicalErrorTests); } | |
| TEST(VerilogLexerTest, Comments) { TestLexer(kCommentTests); } | |
| TEST(VerilogLexerTest, Attributes) { TestLexer(kAttributeTests, TK_ATTRIBUTE); } | |
| TEST(VerilogLexerTest, AttributesSequence) { | |
| TestLexer(kAttributeSequenceTests); | |
| } | |
| TEST(VerilogLexerTest, MacroCalls) { TestLexer(kMacroCallTests); } | |
| TEST(VerilogLexerTest, MacroCallsUnfiltered) { | |
| TestLexer(kUnfilteredMacroCallTests); | |
| } | |
| TEST(VerilogLexerTest, MacroDefines) { TestLexer(kMacroDefineTests); } | |
| TEST(VerilogLexerTest, SymbolIdentifiers) { | |
| TestFilteredLexer(kSymbolIdentifierTests, SymbolIdentifier); | |
| } | |
| TEST(VerilogLexerTest, EscapedIdentifiers) { | |
| TestFilteredLexer(kEscapedIdentifierTests, EscapedIdentifier); | |
| } | |
| TEST(VerilogLexerTest, MacroIdentifiers) { | |
| TestLexer(kMacroIdentifierTests, MacroIdentifier); | |
| } | |
| TEST(VerilogLexerTest, Protected) { TestLexer(kProtectedTests); } | |
| TEST(VerilogLexerTest, Keywords) { TestFilteredLexer(kKeywordTests); } | |
| TEST(VerilogLexerTest, SingleCharToken) { | |
| TestLexer(kSingleCharTokenTests, verible::SingleChar); | |
| } | |
| TEST(VerilogLexerTest, RealTime) { TestLexer(kRealTimeTests, TK_RealTime); } | |
| TEST(VerilogLexerTest, BasedNumbers) { TestLexer(kBasedNumberTests); } | |
| TEST(VerilogLexerTest, TimeLiteral) { | |
| TestLexer(kTimeLiteralTests, TK_TimeLiteral); | |
| } | |
| TEST(VerilogLexerTest, Tricky) { TestLexer(kTrickyTests); } | |
| TEST(VerilogLexerTest, Sequence) { TestLexer(kSequenceTests); } | |
| TEST(VerilogLexerTest, StringLiteral) { | |
| TestLexer(kStringLiteralTests, TK_StringLiteral); | |
| } | |
| TEST(VerilogLexerTest, EvalStringLiteral) { | |
| TestLexer(kEvalStringLiteralTests, TK_EvalStringLiteral); | |
| } | |
| TEST(VerilogLexerTest, Edges) { TestLexer(kEdgeTests); } | |
| TEST(VerilogLexerTest, UDP) { TestLexer(kUDPTests); } | |
| TEST(VerilogLexerTest, UDPUnfiltered) { TestLexer(kUnfilteredUDPTests); } | |
| TEST(VerilogLexerTest, ContextKeywords) { TestLexer(kContextKeywordTests); } | |
| TEST(VerilogLexerTest, BuiltinMethods) { | |
| TestLexer(kBuiltinMethodKeywordTests); | |
| } | |
| TEST(VerilogLexerTest, TimingChecks) { TestFilteredLexer(kTimingCheckTests); } | |
| TEST(VerilogLexerTest, SystemTaskFunctionChecks) { | |
| TestFilteredLexer(kSystemTaskFunctionTests); | |
| } | |
| TEST(VerilogLexerTest, Preprocessor) { TestLexer(kPreprocessorTests); } | |
| TEST(VerilogLexerTest, PreprocessorUnfiltered) { | |
| TestLexer(kUnfilteredPreprocessorTests); | |
| } | |
| TEST(VerilogLexerTest, Directives) { TestLexer(kDirectiveTests); } | |
| TEST(VerilogLexerTest, DirectivesUnfiltered) { | |
| TestLexer(kUnfilteredDirectiveTests); | |
| } | |
| TEST(VerilogLexerTest, Library) { TestLexer(kLibraryTests); } | |
| TEST(RecursiveLexTextTest, Basic) { | |
| constexpr absl::string_view text("hello;"); | |
| std::vector<TokenInfo> tokens; | |
| RecursiveLexText(text, | |
| [&tokens](const TokenInfo& t) { tokens.push_back(t); }); | |
| EXPECT_THAT(tokens, | |
| ElementsAre(TokenInfo(SymbolIdentifier, text.substr(0, 5)), | |
| TokenInfo(';', text.substr(5, 1)))); | |
| } | |
| } // namespace | |
| } // namespace verilog |