8#ifndef FRONTENDS_COMMON_PARSEINPUT_H_
9#define FRONTENDS_COMMON_PARSEINPUT_H_
11#include "frontends/common/options.h"
12#include "frontends/common/parser_options.h"
14#include "frontends/p4-14/fromv1.0/converters.h"
16#include "frontends/parsers/parserDriver.h"
26template <
typename Input,
typename C = P4V1::Converter>
27static const IR::P4Program *parseV1Program(Input stream, std::string_view sourceFile,
29 std::optional<DebugHook> debugHook = std::nullopt) {
33 if (debugHook) converter.addDebugHook(*debugHook,
true);
34 converter.loadModel();
37 const IR::Node *v1 = V1::V1ParserDriver::parse(stream, sourceFile, sourceLine);
41 if (Log::verbose()) std::cerr <<
"Converting to P4-16" << std::endl;
42 v1 = v1->apply(converter);
44 BUG_CHECK(v1->is<IR::P4Program>(),
"Conversion returned %1%", v1);
45 return v1->to<IR::P4Program>();
57template <
typename C = P4V1::Converter>
63 "Parsing using options that don't match the current "
66 const IR::P4Program *result =
nullptr;
67 if (options.doNotPreprocess) {
68 auto *file = fopen(options.file.c_str(),
"r");
69 if (file ==
nullptr) {
70 ::P4::error(ErrorType::ERR_NOT_FOUND,
"%1%: No such file or directory.", options.file);
74 result = options.isv1() ? parseV1Program<FILE *, C>(file, options.file.string(), 1,
75 options.getDebugHook())
82 auto preprocessorResult = options.preprocess();
83 if (!preprocessorResult.has_value()) {
90 ? parseV1Program<FILE *, C>(preprocessorResult.value().get(), options.file.string(),
91 1, options.getDebugHook())
99 ::P4::error(ErrorType::ERR_OVERLIMIT,
"%1% errors encountered, aborting compilation",
103 BUG_CHECK(result !=
nullptr,
"Parsing failed, but we didn't report an error");
119const IR::P4Program *parseP4String(
120 const char *sourceFile,
unsigned sourceLine,
const std::string &input,
121 CompilerOptions::FrontendVersion version = CompilerOptions::FrontendVersion::P4_16);
122const IR::P4Program *parseP4String(
123 const std::string &input,
124 CompilerOptions::FrontendVersion version = CompilerOptions::FrontendVersion::P4_16);
127 "P4-14 support is disabled, this function will always parse P4-16. Use the overload without "
128 "the version argument.")]]
129const IR::P4Program *parseP4String(
const char *sourceFile,
unsigned sourceLine,
130 const std::string &input,
131 CompilerOptions::FrontendVersion version);
133 "P4-14 support is disabled, this function will always parse P4-16. Use the overload without "
134 "the version argument.")]]
135const IR::P4Program *parseP4String(
const std::string &input,
136 CompilerOptions::FrontendVersion version);
137const IR::P4Program *parseP4String(
const char *sourceFile,
unsigned sourceLine,
138 const std::string &input);
139const IR::P4Program *parseP4String(
const std::string &input);
static P4CContext & get()
Definition parser_options.cpp:540
static const IR::P4Program * parse(std::istream &in, std::string_view sourceFile, unsigned sourceLine=1)
Definition parserDriver.cpp:136
Definition parser_options.h:42
Definition constantParsing.h:13
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:49
const IR::P4Program * parseP4File(const ParserOptions &options)
Definition parseInput.h:61
unsigned errorCount()
Definition lib/error.h:25