| # This package implements a SystemVerilog lexer and parser. |
| |
| load("//bazel:bison.bzl", "genyacc") |
| load("//bazel:flex.bzl", "genlex") |
| load( |
| "//common/parser:yacc.bzl", |
| "record_recovered_syntax_errors", |
| "std_move_parser_symbols", |
| ) |
| |
| licenses(["notice"]) |
| |
| package( |
| default_visibility = [ |
| "//verilog:__subpackages__", |
| ], |
| ) |
| |
| genlex( |
| name = "verilog_lex", |
| src = "verilog.lex", |
| out = "verilog.yy.cc", |
| ) |
| |
| cc_library( |
| name = "verilog_lexer", |
| srcs = [ |
| "verilog.yy.cc", |
| "verilog_lexer.cc", |
| ], |
| hdrs = ["verilog_lexer.h"], |
| copts = select({ |
| "@platforms//os:windows": [], |
| "//conditions:default": [ |
| "-Wno-implicit-fallthrough", |
| ], |
| }), |
| deps = [ |
| ":verilog_token_enum", |
| "//bazel:flex", |
| "//common/lexer:flex_lexer_adapter", |
| "//common/text:token_info", |
| "@com_google_absl//absl/strings", |
| ], |
| ) |
| |
| cc_test( |
| name = "verilog_lexer_unittest", |
| size = "small", |
| srcs = ["verilog_lexer_unittest.cc"], |
| deps = [ |
| ":verilog_lexer", |
| ":verilog_token_enum", |
| "//common/lexer:lexer_test_util", |
| "//common/text:token_info", |
| "@com_google_absl//absl/strings", |
| "@com_google_googletest//:gtest_main", |
| ], |
| ) |
| |
| # To reduce cyclic header dependencies, split out verilog.tab.hh into: |
| # 1) enumeration only header (depends on nothing else) |
| # 2) parser prototype header (depends on parser parameter type) |
| # Do not use verilog.tab.hh directly anywhere. |
| # Even the comments in bison-generated files suggest they may be inclined |
| # to separate these headers in the future. This is a workaround until then. |
| genrule( |
| name = "gen_verilog_token_enum", |
| srcs = ["verilog.tab.hh"], |
| outs = ["verilog_token_enum.h"], |
| # Needs own include-guard. |
| cmd = "{ echo '#ifndef VERIBLE_VERILOG_TOKEN_ENUM_H_' ; " + |
| "echo '#define VERIBLE_VERILOG_TOKEN_ENUM_H_' ; " + |
| "echo '// DO NOT EDIT -- generated from $<' ; " + |
| # Grab the enumeration definition. |
| "sed -n '/#ifndef VERILOG_TOKENTYPE/,/#endif/p' $< ; " + |
| "echo '#endif // VERIBLE_VERILOG_VERILOG_TOKEN_ENUM_H_' ;} > $@", |
| ) |
| |
| cc_library( |
| name = "verilog_token_enum", |
| hdrs = ["verilog_token_enum.h"], |
| ) |
| |
| genrule( |
| name = "verilog_parse_interface", |
| srcs = ["verilog.tab.hh"], |
| outs = ["verilog_parse_interface.h"], |
| # Already contains include-guard from verilog.tab.hh |
| cmd = "{ echo '// DO NOT EDIT -- generated from $<' ; " + |
| # Filter out the enumeration definition. |
| "sed -e '/#ifndef YYTOKENTYPE/,/#endif/d' $< ;} > $@", |
| ) |
| |
| genyacc( |
| name = "verilog_y", |
| src = "verilog.y", |
| extra_options = [ |
| "--report-file=$(location verilog.output)", |
| "--graph=$(location verilog.dot)", |
| ], |
| extra_outs = [ |
| "verilog.output", |
| "verilog.dot", |
| ], |
| header_out = "verilog.tab.hh", # Do not use directly, see next comment. |
| source_out = "verilog.tab.cc", |
| ) |
| |
| std_move_parser_symbols( |
| name = "verilog_y_moved", |
| src = "verilog.tab.cc", |
| out = "verilog-moved.tab.cc", |
| ) |
| |
| record_recovered_syntax_errors( |
| name = "verilog_y_final", |
| src = "verilog-moved.tab.cc", |
| out = "verilog-final.tab.cc", |
| ) |
| |
| cc_library( |
| name = "verilog_y_cc", |
| srcs = ["verilog-final.tab.cc"], |
| hdrs = [ |
| "verilog.tab.hh", |
| "verilog_parse_interface.h", |
| ], |
| copts = select({ |
| "@platforms//os:windows": [], |
| "//conditions:default": [ |
| "-Wno-implicit-fallthrough", |
| "-Wno-type-limits", |
| "-Wno-unreachable-code", |
| ], |
| }), |
| deps = [ |
| ":verilog_token_enum", |
| "//common/parser:bison_parser_common", |
| "//common/parser:parser_param", |
| "//common/text:tree_utils", |
| "//common/util:casts", |
| "//common/util:logging", |
| "//verilog/CST:DPI", |
| "//verilog/CST:declaration", |
| "//verilog/CST:expression", |
| "//verilog/CST:functions", |
| "//verilog/CST:module", |
| "//verilog/CST:parameters", |
| "//verilog/CST:port", |
| "//verilog/CST:type", |
| "//verilog/CST:verilog_nonterminals", |
| "//verilog/CST:verilog_treebuilder_utils", |
| ], |
| ) |
| |
| cc_library( |
| name = "verilog_parser", |
| srcs = ["verilog_parser.cc"], |
| hdrs = ["verilog_parser.h"], |
| deps = [ |
| ":verilog_y_cc", # fixdeps: keep |
| "//common/parser:bison_parser_adapter", |
| "//common/parser:parse", |
| "//common/parser:parser_param", |
| "//common/util:value_saver", |
| "@com_google_absl//absl/flags:flag", |
| ], |
| alwayslink = 1, |
| ) |
| |
| cc_library( |
| name = "verilog_lexical_context", |
| srcs = ["verilog_lexical_context.cc"], |
| hdrs = ["verilog_lexical_context.h"], |
| deps = [ |
| ":verilog_token_enum", |
| "//common/text:token_info", |
| "//common/text:token_stream_view", |
| "//common/util:logging", |
| "//common/util:with_reason", |
| ], |
| ) |
| |
| cc_test( |
| name = "verilog_parser_unittest", |
| size = "small", |
| srcs = ["verilog_parser_unittest.cc"], |
| deps = [ |
| ":verilog_parser", |
| ":verilog_token_enum", |
| "//common/parser:bison_parser_common", |
| "//common/parser:parser_test_util", |
| "//common/text:constants", |
| "//common/text:symbol", |
| "//common/text:token_info", |
| "//common/text:token_info_test_util", |
| "//verilog/CST:verilog_nonterminals", |
| "//verilog/analysis:verilog_analyzer", |
| "@com_google_absl//absl/status", |
| "@com_google_absl//absl/strings", |
| "@com_google_googletest//:gtest_main", |
| ], |
| ) |
| |
| cc_test( |
| name = "verilog_lexical_context_test", |
| srcs = ["verilog_lexical_context_test.cc"], |
| deps = [ |
| ":verilog_lexical_context", |
| ":verilog_parser", |
| ":verilog_token_enum", |
| "//common/text:text_structure", |
| "//common/text:token_info", |
| "//common/text:token_stream_view", |
| "//common/util:logging", |
| "//verilog/analysis:verilog_analyzer", |
| "@com_google_absl//absl/strings", |
| "@com_google_googletest//:gtest_main", |
| ], |
| ) |
| |
| cc_library( |
| name = "verilog_token_classifications", |
| srcs = ["verilog_token_classifications.cc"], |
| hdrs = ["verilog_token_classifications.h"], |
| deps = [ |
| ":verilog_token_enum", |
| ], |
| ) |
| |
| cc_test( |
| name = "verilog_token_classifications_test", |
| srcs = ["verilog_token_classifications_test.cc"], |
| deps = [ |
| ":verilog_token_classifications", |
| ":verilog_token_enum", |
| "@com_google_googletest//:gtest_main", |
| ], |
| ) |
| |
| cc_library( |
| name = "verilog_token", |
| srcs = ["verilog_token.cc"], |
| hdrs = ["verilog_token.h"], |
| deps = [ |
| ":verilog_parser", |
| ":verilog_token_enum", |
| "@com_google_absl//absl/strings", |
| ], |
| ) |