blob: 5fb15cb0a40756c2d9cf78208645e70f288c1702 [file] [log] [blame]
# This package implements a SystemVerilog lexer and parser.
load("//bazel:bison.bzl", "genyacc")
load("//bazel:flex.bzl", "genlex")
load(
"//verible/common/parser:yacc.bzl",
"record_recovered_syntax_errors",
"std_move_parser_symbols",
)
package(
default_applicable_licenses = ["//:license"],
default_visibility = [
"//verible/verilog:__subpackages__",
],
# Not yet enabled, lexer does not find FlexLexer.h
#features = ["layering_check"],
)
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",
"//verible/common/lexer:flex-lexer-adapter",
"//verible/common/text:token-info",
],
)
cc_test(
name = "verilog-lexer_test",
size = "small",
srcs = ["verilog-lexer_test.cc"],
deps = [
":verilog-lexer",
":verilog-token-enum",
"//verible/common/lexer:lexer-test-util",
"//verible/common/text:token-info",
"@googletest//:gtest",
"@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",
"-Wno-unused-but-set-variable",
],
}),
deps = [
"//verible/common/parser:bison-parser-common",
"//verible/common/parser:parser-param",
"//verible/common/text:tree-utils",
"//verible/common/util:casts",
"//verible/common/util:logging",
"//verible/verilog/CST:DPI",
"//verible/verilog/CST:declaration",
"//verible/verilog/CST:expression",
"//verible/verilog/CST:functions",
"//verible/verilog/CST:module",
"//verible/verilog/CST:parameters",
"//verible/verilog/CST:port",
"//verible/verilog/CST:type",
"//verible/verilog/CST:verilog-nonterminals",
"//verible/verilog/CST:verilog-treebuilder-utils",
],
alwayslink = 1,
)
cc_library(
name = "verilog-parser",
srcs = ["verilog-parser.cc"],
hdrs = ["verilog-parser.h"],
deps = [
":verilog-y-cc",
"//verible/common/parser:bison-parser-adapter",
"//verible/common/parser:parse",
"//verible/common/parser:parser-param",
"//verible/common/util:value-saver",
"@abseil-cpp//absl/flags:flag",
],
)
cc_library(
name = "verilog-lexical-context",
srcs = ["verilog-lexical-context.cc"],
hdrs = ["verilog-lexical-context.h"],
deps = [
":verilog-token-enum",
"//verible/common/text:token-info",
"//verible/common/text:token-stream-view",
"//verible/common/util:logging",
"//verible/common/util:with-reason",
],
)
cc_test(
name = "verilog-parser_test",
size = "small",
srcs = ["verilog-parser_test.cc"],
deps = [
":verilog-token-enum",
"//verible/common/parser:bison-parser-common",
"//verible/common/parser:parser-test-util",
"//verible/common/text:constants",
"//verible/common/text:parser-verifier",
"//verible/common/text:symbol",
"//verible/common/text:token-info",
"//verible/common/text:token-info-test-util",
"//verible/common/util:logging",
"//verible/verilog/CST:verilog-nonterminals",
"//verible/verilog/analysis:verilog-analyzer",
"//verible/verilog/preprocessor:verilog-preprocess",
"@abseil-cpp//absl/status",
"@abseil-cpp//absl/strings",
"@googletest//:gtest",
"@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",
"//verible/common/text:text-structure",
"//verible/common/text:token-info",
"//verible/common/text:token-stream-view",
"//verible/common/util:logging",
"//verible/verilog/analysis:verilog-analyzer",
"@abseil-cpp//absl/strings",
"@googletest//:gtest",
"@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",
"@googletest//:gtest",
"@googletest//:gtest_main",
],
)
cc_library(
name = "verilog-token",
srcs = ["verilog-token.cc"],
hdrs = ["verilog-token.h"],
deps = [
":verilog-parser",
":verilog-token-enum",
],
)