17#ifndef FRONTENDS_COMMON_PARSEINPUT_H_
18#define FRONTENDS_COMMON_PARSEINPUT_H_
20#include "frontends/common/options.h"
21#include "frontends/common/parser_options.h"
22#include "frontends/p4-14/fromv1.0/converters.h"
23#include "frontends/parsers/parserDriver.h"
32template <
typename Input,
typename C = P4V1::Converter>
33static const IR::P4Program *parseV1Program(Input stream, std::string_view sourceFile,
35 std::optional<DebugHook> debugHook = std::nullopt) {
39 if (debugHook) converter.addDebugHook(*debugHook,
true);
40 converter.loadModel();
47 if (Log::verbose()) std::cerr <<
"Converting to P4-16" << std::endl;
48 v1 = v1->apply(converter);
50 BUG_CHECK(v1->is<IR::P4Program>(),
"Conversion returned %1%", v1);
51 return v1->to<IR::P4Program>();
62template <
typename C = P4V1::Converter>
65 "Parsing using options that don't match the current "
68 const IR::P4Program *result =
nullptr;
70 auto *file = fopen(options.
file.c_str(),
"r");
71 if (file ==
nullptr) {
72 ::P4::error(ErrorType::ERR_NOT_FOUND,
"%1%: No such file or directory.", options.
file);
75 result = options.
isv1() ? parseV1Program<FILE *, C>(file, options.
file.string(), 1,
80 auto preprocessorResult = options.
preprocess();
87 ? parseV1Program<FILE *, C>(preprocessorResult.value().get(), options.
file.string(),
93 ::P4::error(ErrorType::ERR_OVERLIMIT,
"%1% errors encountered, aborting compilation",
97 BUG_CHECK(result !=
nullptr,
"Parsing failed, but we didn't report an error");
111const IR::P4Program *
parseP4String(
const char *sourceFile,
unsigned sourceLine,
112 const std::string &input,
113 CompilerOptions::FrontendVersion version);
115 CompilerOptions::FrontendVersion version);
static P4CContext & get()
Definition parser_options.cpp:539
static const IR::P4Program * parse(std::istream &in, std::string_view sourceFile, unsigned sourceLine=1)
Definition parserDriver.cpp:139
Definition parser_options.h:47
std::filesystem::path file
file to compile (- for stdin)
Definition parser_options.h:81
bool isv1() const
True if we are compiling a P4 v1.0 or v1.1 program.
Definition parser_options.cpp:473
std::optional< ParserOptions::PreprocessorResult > preprocess() const
Returns the output of the preprocessor.
Definition parser_options.cpp:424
bool doNotPreprocess
if true skip preprocess
Definition parser_options.h:87
DebugHook getDebugHook() const
Definition parser_options.cpp:533
static const IR::V1Program * parse(std::istream &in, std::string_view sourceFile, unsigned sourceLine=1)
Definition parserDriver.cpp:313
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24
const IR::P4Program * parseP4String(const char *sourceFile, unsigned sourceLine, const std::string &input, CompilerOptions::FrontendVersion version)
Definition parseInput.cpp:28
const IR::P4Program * parseP4File(const ParserOptions &options)
Definition parseInput.h:63
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:51
unsigned errorCount()
Definition lib/error.h:35