| // Copyright 2022 Google LLC |
| // |
| // 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. |
| |
| // Code generator that generates the CPP header for the AST definition of a |
| // language. The input grammar files should have extension "g4". |
| // |
| // Usage: |
| // $ grammar_domain_code_generator \ |
| // --input_grammar_files=json.g4,morefile.g4 \ |
| // --output_header_file=json_grammar.h |
| |
| #include <filesystem> |
| #include <string> |
| #include <vector> |
| |
| #include "absl/flags/flag.h" |
| #include "absl/flags/parse.h" |
| #include "./grammar_codegen/code_generation.h" |
| #include "./fuzztest/internal/logging.h" |
| |
| ABSL_FLAG(std::string, output_header_file_path, "", |
| "Required. The path of the generated grammar header file."); |
| |
| ABSL_FLAG( |
| std::vector<std::string>, input_grammar_files, std::vector<std::string>(), |
| "Required. The nonempty list of the input grammar specification files."); |
| |
| namespace { |
| |
| std::string GetContents(const std::string& path) { |
| std::stringstream ss; |
| ss << std::ifstream(path).rdbuf(); |
| return ss.str(); |
| } |
| } // namespace |
| |
| int main(int argc, char** argv) { |
| absl::ParseCommandLine(argc, argv); |
| |
| std::string output_file_path = absl::GetFlag(FLAGS_output_header_file_path); |
| FUZZTEST_INTERNAL_CHECK_PRECONDITION( |
| !output_file_path.empty(), |
| "You must specify output file with --output_header_file_path"); |
| std::ofstream output_file(output_file_path); |
| FUZZTEST_INTERNAL_CHECK_PRECONDITION(output_file.is_open(), |
| "Cannot open output file!"); |
| |
| std::vector<std::string> input_files = |
| absl::GetFlag(FLAGS_input_grammar_files); |
| |
| FUZZTEST_INTERNAL_CHECK_PRECONDITION( |
| !input_files.empty(), |
| "You must provide the list of input files, separated by ','"); |
| |
| std::vector<std::string> input_grammar_specs; |
| for (const std::string& input_file : input_files) { |
| FUZZTEST_INTERNAL_CHECK_PRECONDITION(std::filesystem::exists(input_file), |
| input_file.c_str(), " not exist!"); |
| input_grammar_specs.push_back(GetContents(input_file)); |
| } |
| output_file << fuzztest::internal::grammar::GenerateGrammarHeader( |
| input_grammar_specs); |
| output_file.close(); |
| return 0; |
| } |