blob: 9f70c5d64d106f65890f56c600c62ff0e26d6e45 [file] [log] [blame] [edit]
# 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",
],
)