diff --git a/executable_semantics/BUILD b/executable_semantics/BUILD index 8b6c24509c73..ccda0b7f98c9 100644 --- a/executable_semantics/BUILD +++ b/executable_semantics/BUILD @@ -11,7 +11,10 @@ load("//bazel/testing:golden_test.bzl", "golden_test") cc_binary( name = "executable_semantics", srcs = ["main.cpp"], - deps = [":syntax"], + deps = [ + ":syntax", + "@llvm-project//llvm:Support", + ], ) cc_library( diff --git a/executable_semantics/main.cpp b/executable_semantics/main.cpp index 4ec90519971b..2f8cbc6b9c3f 100644 --- a/executable_semantics/main.cpp +++ b/executable_semantics/main.cpp @@ -7,6 +7,7 @@ #include #include "executable_semantics/syntax_helpers.h" +#include "llvm/Support/CommandLine.h" extern FILE* yyin; extern auto yyparse() -> int; // NOLINT(readability-identifier-naming) @@ -14,12 +15,19 @@ extern auto yyparse() -> int; // NOLINT(readability-identifier-naming) int main(int argc, char* argv[]) { // yydebug = 1; - if (argc > 1) { - Carbon::input_filename = argv[1]; - yyin = fopen(argv[1], "r"); + using llvm::cl::desc; + using llvm::cl::opt; + // TODO: Add with related support. + // opt quiet_option("quiet", desc("Disable tracing")); + opt input_filename(llvm::cl::Positional, desc("")); + llvm::cl::ParseCommandLineOptions(argc, argv); + + if (input_filename.getNumOccurrences() > 0) { + Carbon::input_filename = input_filename.c_str(); + yyin = fopen(input_filename.c_str(), "r"); if (yyin == nullptr) { - std::cerr << "Error opening '" << argv[1] << "': " << strerror(errno) - << std::endl; + std::cerr << "Error opening '" << input_filename + << "': " << strerror(errno) << std::endl; return 1; } } diff --git a/executable_semantics/syntax_helpers.cpp b/executable_semantics/syntax_helpers.cpp index 4b0b4c5fbc6e..fd25da925ff1 100644 --- a/executable_semantics/syntax_helpers.cpp +++ b/executable_semantics/syntax_helpers.cpp @@ -11,7 +11,7 @@ namespace Carbon { -char* input_filename = nullptr; +const char* input_filename = nullptr; void PrintSyntaxError(char* error, int line_num) { std::cerr << input_filename << ":" << line_num << ": " << error << std::endl; diff --git a/executable_semantics/syntax_helpers.h b/executable_semantics/syntax_helpers.h index 0efc77449cd9..531b85912181 100644 --- a/executable_semantics/syntax_helpers.h +++ b/executable_semantics/syntax_helpers.h @@ -16,7 +16,7 @@ namespace Carbon { // Initialized by main(), and used when printing errors. -extern char* input_filename; +extern const char* input_filename; // Prints errors. void PrintSyntaxError(char* error, int line_num);