P4C
The P4 Compiler
Loading...
Searching...
No Matches
parserDriver.h
1/*
2Copyright 2013-present Barefoot Networks, Inc.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17#ifndef FRONTENDS_PARSERS_PARSERDRIVER_H_
18#define FRONTENDS_PARSERS_PARSERDRIVER_H_
19
20#include <cstdio>
21#include <iostream>
22#include <string>
23#include <string_view>
24
25#include "frontends/p4/symbol_table.h"
26#include "frontends/parsers/p4/abstractP4Lexer.hpp"
27#include "frontends/parsers/p4/p4AnnotationLexer.hpp"
28#include "ir/ir.h"
29#include "lib/cstring.h"
30#include "lib/source_file.h"
31
32namespace P4 {
33
34class P4Lexer;
35class P4Parser;
36
40 public:
41 virtual ~AbstractParserDriver() = 0;
42
43 protected:
45
47 // Callbacks.
49
55 void onReadComment(const char *text, bool lineComment);
56
58 void onReadToken(const char *text);
59
61 void onReadLineNumber(const char *text);
62
64 void onReadFileName(const char *text);
65
68
71 void onParseError(const Util::SourceInfo &location, const std::string &message);
72
74 // Shared state manipulated directly by the lexer and parser.
76
79
82
84 int saveState = -1;
85
86 private:
88 int lineDirectiveLine = 0;
89
91 cstring lineDirectiveFile;
92
94 cstring lastIdentifier;
95};
96
99 public:
113 static const IR::P4Program *parse(std::istream &in, std::string_view sourceFile,
114 unsigned sourceLine = 1);
115 static const IR::P4Program *parse(FILE *in, std::string_view sourceFile,
116 unsigned sourceLine = 1);
117
121 static std::pair<const IR::P4Program *, const Util::InputSources *> parseProgramSources(
122 std::istream &in, std::string_view sourceFile, unsigned sourceLine = 1);
123
124 static std::pair<const IR::P4Program *, const Util::InputSources *> parseProgramSources(
125 FILE *in, std::string_view sourceFile, unsigned sourceLine = 1);
126
133 // Lists /////////////////////////////////////////////////////////////////
135 const Util::SourceInfo &srcInfo, const IR::Vector<IR::AnnotationToken> &body);
136
137 static const IR::IndexedVector<IR::NamedExpression> *parseKvList(
138 const Util::SourceInfo &srcInfo, const IR::Vector<IR::AnnotationToken> &body);
139
140 static const IR::Vector<IR::Expression> *parseConstantList(
141 const Util::SourceInfo &srcInfo, const IR::Vector<IR::AnnotationToken> &body);
142
143 static const IR::Vector<IR::Expression> *parseConstantOrStringLiteralList(
144 const Util::SourceInfo &srcInfo, const IR::Vector<IR::AnnotationToken> &body);
145
146 static const IR::Vector<IR::Expression> *parseStringLiteralList(
147 const Util::SourceInfo &srcInfo, const IR::Vector<IR::AnnotationToken> &body);
148
149 // Singletons ////////////////////////////////////////////////////////////
150 static const IR::Expression *parseExpression(const Util::SourceInfo &srcInfo,
152
153 static const IR::Constant *parseConstant(const Util::SourceInfo &srcInfo,
155
156 static const IR::Expression *parseConstantOrStringLiteral(
157 const Util::SourceInfo &srcInfo, const IR::Vector<IR::AnnotationToken> &body);
158
159 static const IR::StringLiteral *parseStringLiteral(const Util::SourceInfo &srcInfo,
161
162 // Pairs /////////////////////////////////////////////////////////////////
163 static const IR::Vector<IR::Expression> *parseExpressionPair(
164 const Util::SourceInfo &srcInfo, const IR::Vector<IR::AnnotationToken> &body);
165
166 static const IR::Vector<IR::Expression> *parseConstantPair(
167 const Util::SourceInfo &srcInfo, const IR::Vector<IR::AnnotationToken> &body);
168
169 static const IR::Vector<IR::Expression> *parseStringLiteralPair(
170 const Util::SourceInfo &srcInfo, const IR::Vector<IR::AnnotationToken> &body);
171
172 // Triples ///////////////////////////////////////////////////////////////
173 static const IR::Vector<IR::Expression> *parseExpressionTriple(
174 const Util::SourceInfo &srcInfo, const IR::Vector<IR::AnnotationToken> &body);
175
176 static const IR::Vector<IR::Expression> *parseConstantTriple(
177 const Util::SourceInfo &srcInfo, const IR::Vector<IR::AnnotationToken> &body);
178
179 static const IR::Vector<IR::Expression> *parseStringLiteralTriple(
180 const Util::SourceInfo &srcInfo, const IR::Vector<IR::AnnotationToken> &body);
181
182 // P4Runtime Annotations /////////////////////////////////////////////////
183 static const IR::Vector<IR::Expression> *parseP4rtTranslationAnnotation(
184 const Util::SourceInfo &srcInfo, const IR::Vector<IR::AnnotationToken> &body);
185
186 protected:
187 friend class P4::P4Lexer;
188 friend class P4::P4Parser;
189
191 void onReadErrorDeclaration(IR::Type_Error *error);
192
194 // Shared state manipulated directly by the lexer and parser.
196
199
203
206 std::string stringLiteral;
207
208 // flag to track when template args are expected, to adjust the precedence
209 // of '<'
210 bool template_args = false;
211
212 private:
214
216 bool parse(AbstractP4Lexer &lexer, std::string_view sourceFile, unsigned sourceLine = 1);
217
219 template <typename T>
220 const T *parse(P4AnnotationLexer::Type type, const Util::SourceInfo &srcInfo,
222
226 IR::Type_Error *allErrors = nullptr;
227};
228
229} // namespace P4
230
231namespace P4::V1 {
232
233class V1Lexer;
234class V1Parser;
235
238 public:
252 static const IR::V1Program *parse(std::istream &in, std::string_view sourceFile,
253 unsigned sourceLine = 1);
254 static const IR::V1Program *parse(FILE *in, std::string_view sourceFile,
255 unsigned sourceLine = 1);
256
257 protected:
258 friend class V1::V1Lexer;
259 friend class V1::V1Parser;
260
269 IR::Constant *constantFold(IR::Expression *expr);
270
273 IR::Vector<IR::Expression> makeExpressionList(const IR::NameList *list);
274
276 void clearPragmas();
277
279 void addPragma(IR::Annotation *pragma);
280
283
286 const IR::Annotations *takePragmasAsAnnotations();
287
289 // Shared state manipulated directly by the lexer and parser.
291
293 IR::V1Program *global = nullptr;
294
295 private:
297 IR::Vector<IR::Annotation> currentPragmas;
298
300};
301
302} // namespace P4::V1
303
304#endif /* FRONTENDS_PARSERS_PARSERDRIVER_H_ */
Definition parserDriver.h:39
void onParseError(const Util::SourceInfo &location, const std::string &message)
Definition parserDriver.cpp:105
Util::SourceInfo yylloc
The location of the most recent token.
Definition parserDriver.h:81
void onReadToken(const char *text)
Notify that the lexer read a token. @text is the matched source text.
Definition parserDriver.cpp:76
void onReadComment(const char *text, bool lineComment)
Definition parserDriver.cpp:94
void onReadFileName(const char *text)
Notify that the lexer read a filename from a line directive.
Definition parserDriver.cpp:98
void onReadLineNumber(const char *text)
Notify that the lexer read a line number from a line directive.
Definition parserDriver.cpp:83
int saveState
Scratch storage for the lexer to remember its previous state.
Definition parserDriver.h:84
Util::InputSources * sources
The input sources that comprise the P4 program we're parsing.
Definition parserDriver.h:78
void onReadIdentifier(cstring id)
Notify that the lexer read an identifier, @id.
Definition parserDriver.cpp:103
Definition node.h:52
Definition vector.h:59
A ParserDriver that can parse P4-16 programs.
Definition parserDriver.h:98
Util::ProgramStructure * structure
Semantic information about the program being parsed.
Definition parserDriver.h:198
void onReadErrorDeclaration(IR::Type_Error *error)
Notify that the parser parsed a P4 error declaration.
Definition parserDriver.cpp:298
static const IR::Vector< IR::Expression > * parseExpressionList(const Util::SourceInfo &srcInfo, const IR::Vector< IR::AnnotationToken > &body)
Definition parserDriver.cpp:191
static std::pair< const IR::P4Program *, const Util::InputSources * > parseProgramSources(std::istream &in, std::string_view sourceFile, unsigned sourceLine=1)
Definition parserDriver.cpp:157
IR::Vector< IR::Node > * nodes
Definition parserDriver.h:202
std::string stringLiteral
Definition parserDriver.h:206
static const IR::P4Program * parse(std::istream &in, std::string_view sourceFile, unsigned sourceLine=1)
Definition parserDriver.cpp:139
Definition source_file.h:287
Definition symbol_table.h:39
Definition source_file.h:125
A ParserDriver that can parse P4-14 programs.
Definition parserDriver.h:237
void addPragma(IR::Annotation *pragma)
Add @pragma to the list of active pragmas.
Definition parserDriver.cpp:355
IR::Vector< IR::Annotation > takePragmasAsVector()
Definition parserDriver.cpp:359
static const IR::V1Program * parse(std::istream &in, std::string_view sourceFile, unsigned sourceLine=1)
Definition parserDriver.cpp:313
IR::Vector< IR::Expression > makeExpressionList(const IR::NameList *list)
Definition parserDriver.cpp:347
const IR::Annotations * takePragmasAsAnnotations()
Definition parserDriver.cpp:365
IR::V1Program * global
The root of the IR tree we're constructing.
Definition parserDriver.h:293
void clearPragmas()
Clear the list of active pragmas.
Definition parserDriver.cpp:353
IR::Constant * constantFold(IR::Expression *expr)
Definition parserDriver.cpp:341
Definition cstring.h:85
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:51