Porytiles
Loading...
Searching...
No Matches
parser.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <string>
5#include <unordered_map>
6#include <vector>
7
8#include "gsl/pointers"
9
20
21namespace porytiles {
22
23class CParserContext;
24
54class Parser {
55 public:
66 Parser(gsl::not_null<const TextFormatter *> format, std::vector<Token> tokens)
67 : format_{format}, tokens_{std::move(tokens)}
68 {
69 }
70
82 Parser(gsl::not_null<const TextFormatter *> format, std::vector<Token> tokens, const CParserContext *context)
83 : format_{format}, tokens_{std::move(tokens)}, context_{context}
84 {
85 }
86
109
131
154
176
200
229
259
260 private:
261 [[nodiscard]] const Token &peek() const;
262 [[nodiscard]] const Token &peek_next() const;
263 const Token &advance();
264 [[nodiscard]] bool is_at_end() const;
265 [[nodiscard]] bool check(TokenType type) const;
266 bool match(TokenType type);
267
268 void skip_to_next_line();
269 [[nodiscard]] bool is_at_line_end() const;
270 [[nodiscard]] ChainableResult<DefineStatement> parse_define();
271 [[nodiscard]] ChainableResult<EnumDeclaration> parse_enum();
272 [[nodiscard]] ChainableResult<EnumMember> parse_enum_member(std::int64_t &counter);
273 [[nodiscard]] std::vector<Token> collect_expression_tokens();
274 [[nodiscard]] std::vector<Token> collect_enum_value_tokens();
275 [[nodiscard]] ChainableResult<std::int64_t> evaluate_expression(const std::vector<Token> &expr_tokens);
276
277 // Shunting Yard algorithm helpers
278 [[nodiscard]] std::vector<Token> to_postfix(const std::vector<Token> &expr_tokens);
279 [[nodiscard]] ChainableResult<std::int64_t> evaluate_postfix(const std::vector<Token> &postfix);
280 [[nodiscard]] int operator_precedence(TokenType type) const;
281 [[nodiscard]] bool is_left_associative(TokenType type) const;
282 [[nodiscard]] bool is_operator(TokenType type) const;
283 [[nodiscard]] bool is_unary_operator(TokenType type) const;
284
285 [[nodiscard]] FormattableError make_error(SourcePosition pos, std::string message) const;
286
287 const TextFormatter *format_;
288 std::vector<Token> tokens_;
289 std::size_t current_{0};
290 std::unordered_map<std::string, std::int64_t> defined_values_{{"UCHAR_MAX", 255}}; // Symbol table for macro values
291 const CParserContext *context_{nullptr};
292};
293
294} // namespace porytiles
Context object providing rich error formatting for C/C++ parsing.
A result type that maintains a chainable sequence of errors for debugging and error reporting.
General-purpose error implementation with formatted message support.
Definition error.hpp:63
Parser for C preprocessor constructs.
Definition parser.hpp:54
Parser(gsl::not_null< const TextFormatter * > format, std::vector< Token > tokens, const CParserContext *context)
Constructs a parser with a context for rich error formatting.
Definition parser.hpp:82
ChainableResult< std::vector< ArrayDeclaration > > parse_pointer_arrays()
Parses all pointer array declarations from the token stream.
Definition parser.cpp:753
ChainableResult< std::vector< EnumDeclaration > > parse_enums()
Parses all enum declarations from the token stream.
Definition parser.cpp:166
ChainableResult< std::vector< DefineStatement > > parse_defines()
Parses all #define statements from the token stream.
Definition parser.cpp:135
ChainableResult< std::vector< IncbinDeclaration > > parse_incbin_arrays()
Parses INCBIN array declarations from the token stream.
Definition parser.cpp:1171
ChainableResult< std::vector< StructVariableDeclaration > > parse_struct_variables()
Parses struct variable declarations from the token stream.
Definition parser.cpp:939
ChainableResult< std::vector< StructInitializerDeclaration > > parse_struct_initializers()
Parses struct variable declarations with their designated initializer fields.
Definition parser.cpp:1019
Parser(gsl::not_null< const TextFormatter * > format, std::vector< Token > tokens)
Constructs a parser for the given token stream.
Definition parser.hpp:66
ChainableResult< std::vector< FunctionDefinition > > parse_functions()
Parses function definitions from the token stream.
Definition parser.cpp:863
Abstract base class for applying text styling with context-aware formatting.
Represents a lexical token from C source code.
Definition token.hpp:106
TokenType
Enumeration of token types recognized by the C parser lexer.
Definition token.hpp:19
Represents a position within source content.